Skip to content

Commit bfa8d2b

Browse files
committed
Updates.
1 parent 78b9a57 commit bfa8d2b

File tree

2 files changed

+33
-49
lines changed

2 files changed

+33
-49
lines changed

src/ramp.c

Lines changed: 21 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,30 @@
33
#include <string.h>
44

55
typedef struct ramp_page_t ramp_page_t;
6-
typedef struct ramp_defer_t ramp_defer_t;
76

87
struct ramp_page_t {
98
ramp_page_t *Next;
109
char Bytes[] __attribute__ ((aligned(16)));
11-
//char *Bytes;
1210
};
1311

14-
struct ramp_defer_t {
15-
ramp_defer_t *Next;
16-
void (*CleanupFn)(void *);
12+
struct ramp_deferral_t {
13+
ramp_deferral_t *Next;
14+
void (*Callback)(void *);
15+
void *Arg;
1716
};
1817

1918
struct ramp_t {
2019
ramp_page_t *Pages, *Full;
21-
ramp_defer_t *Defers;
20+
ramp_deferral_t *Deferrals;
2221
size_t PageSize, Space;
2322
};
2423

2524
static inline ramp_page_t *ramp_page_new(size_t PageSize) {
2625
ramp_page_t *Page = (ramp_page_t *)malloc(sizeof(ramp_page_t) + PageSize);
27-
//ramp_page_t *Page = (ramp_page_t *)malloc(sizeof(ramp_page_t));
28-
//Page->Bytes = malloc(PageSize);
2926
return Page;
3027
}
3128

3229
static inline void ramp_page_free(ramp_page_t *Page) {
33-
//free(Page->Bytes);
3430
free(Page);
3531
}
3632

@@ -42,16 +38,12 @@ ramp_t *ramp_new(size_t PageSize) {
4238
ramp_t *Ramp = (ramp_t *)malloc(sizeof(ramp_t));
4339
Ramp->Pages = Page;
4440
Ramp->Full = NULL;
45-
Ramp->Defers = NULL;
41+
Ramp->Deferrals = NULL;
4642
Ramp->PageSize = PageSize;
4743
Ramp->Space = PageSize;
4844
return Ramp;
4945
}
5046

51-
static void ramp_defer_free(void **Slot) {
52-
free(Slot[0]);
53-
}
54-
5547
#define likely(x) __builtin_expect (!!(x), 1)
5648
#define unlikely(x) __builtin_expect (!!(x), 0)
5749

@@ -74,8 +66,8 @@ void *ramp_alloc(ramp_t *Ramp, size_t Size) {
7466
Ramp->Space = Ramp->PageSize - Size;
7567
return New->Bytes + Ramp->Space;
7668
} else {
77-
void **Slot = (void **)ramp_defer(Ramp, sizeof(void *), (void *)ramp_defer_free);
78-
void *Bytes = Slot[0] = malloc(Size);
69+
void *Bytes = malloc(Size);
70+
ramp_defer(Ramp, free, Bytes);
7971
return Bytes;
8072
}
8173
}
@@ -88,32 +80,23 @@ void *ramp_strdup(ramp_t *Ramp, const char *String) {
8880
return Copy;
8981
}
9082

91-
void *ramp_defer(ramp_t *Ramp, size_t Size, void (*CleanupFn)(void *)) {
92-
ramp_defer_t *Defer = ramp_alloc(Ramp, sizeof(ramp_defer_t) + Size);
93-
Defer->Next = Ramp->Defers;
94-
Defer->CleanupFn = CleanupFn;
95-
Ramp->Defers = Defer;
96-
return Defer + 1;
83+
ramp_deferral_t *ramp_defer(ramp_t *Ramp, void (*Callback)(void *), void *Arg) {
84+
ramp_deferral_t *Deferral = (ramp_deferral_t *)ramp_alloc(Ramp, sizeof(ramp_deferral_t));
85+
Deferral->Next = Ramp->Deferrals;
86+
Deferral->Callback = Callback;
87+
Deferral->Arg = Arg;
88+
return Deferral;
9789
}
9890

99-
typedef struct {
100-
void (*CleanupFn)(void *);
101-
void *Arg;
102-
} ramp_on_reset_t;
103-
104-
static void ramp_on_reset_fn(ramp_on_reset_t *OnReset) {
105-
OnReset->CleanupFn(OnReset->Arg);
106-
}
91+
static void ramp_defer_nop(void *Arg) {}
10792

108-
void ramp_on_reset(ramp_t *Ramp, void (*CleanupFn)(void *), void *Arg) {
109-
ramp_on_reset_t *OnReset = ramp_defer(Ramp, sizeof(ramp_on_reset_t), (void *)ramp_on_reset_fn);
110-
OnReset->CleanupFn = CleanupFn;
111-
OnReset->Arg = Arg;
93+
void ramp_cancel(ramp_deferral_t *Deferral) {
94+
Deferral->Callback = ramp_defer_nop;
11295
}
11396

11497
void ramp_clear(ramp_t *Ramp) {
115-
for (ramp_defer_t *Defer = Ramp->Defers; Defer; Defer = Defer->Next) Defer->CleanupFn(Defer + 1);
116-
Ramp->Defers = NULL;
98+
for (ramp_deferral_t *Deferral = Ramp->Deferrals; Deferral; Deferral = Deferral->Next) Deferral->Callback(Deferral->Arg);
99+
Ramp->Deferrals = NULL;
117100
ramp_page_t **Slot = &Ramp->Pages->Next;
118101
while (Slot[0]) Slot = &Slot[0]->Next;
119102
Slot[0] = Ramp->Full;
@@ -122,8 +105,8 @@ void ramp_clear(ramp_t *Ramp) {
122105
}
123106

124107
void ramp_reset(ramp_t *Ramp) {
125-
for (ramp_defer_t *Defer = Ramp->Defers; Defer; Defer = Defer->Next) Defer->CleanupFn(Defer + 1);
126-
Ramp->Defers = NULL;
108+
for (ramp_deferral_t *Deferral = Ramp->Deferrals; Deferral; Deferral = Deferral->Next) Deferral->Callback(Deferral->Arg);
109+
Ramp->Deferrals = NULL;
127110
ramp_page_t *Old = Ramp->Pages;
128111
for (ramp_page_t *Page = Old->Next, *Next; Page; Page = Next) {
129112
Next = Page->Next;

src/ramp.h

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,35 +16,36 @@ ramp_t *ramp_new(size_t PageSize);
1616
* \brief allocates a block of memory within ramp_t instance.
1717
*
1818
* \param Ramp ramp_t object allocated with ramp_new.
19-
* \param Size Size of memory block to allocate.
19+
* \param Size size of memory block to allocate.
2020
*/
2121
void *ramp_alloc(ramp_t *Ramp, size_t Size) __attribute__((malloc));
2222

2323
/**
2424
* \brief copies a string into a ramp_t instance.
2525
*
2626
* \param Ramp ramp_t object allocated with ramp_new.
27-
* \param String String to copy.
27+
* \param String string to copy.
2828
*/
2929
void *ramp_strdup(ramp_t *Ramp, const char *String) __attribute__((malloc));
3030

31+
typedef struct ramp_deferral_t ramp_deferral_t;
32+
3133
/**
32-
* \brief create a deferred cleanup entry which will be called on reset.
34+
* \brief defers a function call until ramp_clear or ramp_reset.
3335
*
3436
* \param Ramp ramp_t object allocated with ramp_new.
35-
* \param Size Size of memory block to allocate.
36-
* \param CleanupFn Function to call on reset.
37+
* \param Function function to call on reset.
38+
* \param Arg argument to pass to CleanupFn.
39+
* \return A deferral reference which can be used to cancel this deferral.
3740
*/
38-
void *ramp_defer(ramp_t *Ramp, size_t Size, void (*CleanupFn)(void *));
41+
ramp_deferral_t *ramp_defer(ramp_t *Ramp, void (*Function)(void *), void *Arg);
3942

4043
/**
41-
* \brief adds a function to call on reset with a single argument
44+
* \brief cancels a deferred call.
4245
*
43-
* \param Ramp ramp_t object allocated with ramp_new.
44-
* \param CleanupFn Function to call on reset.
45-
* \param Arg Argument to pass to CleanupFn.
46+
* \param Deferral ramp_deferral_t returned by ramp_defer.
4647
*/
47-
void ramp_on_reset(ramp_t *Ramp, void (*CleanupFn)(void *), void *Arg);
48+
void ramp_cancel(ramp_deferral_t *Deferral);
4849

4950
/**
5051
* \brief frees memory allocated within ramp_t instance while keeping memory blocks for reuse.

0 commit comments

Comments
 (0)