3
3
#include <string.h>
4
4
5
5
typedef struct ramp_page_t ramp_page_t ;
6
- typedef struct ramp_defer_t ramp_defer_t ;
7
6
8
7
struct ramp_page_t {
9
8
ramp_page_t * Next ;
10
9
char Bytes [] __attribute__ ((aligned (16 )));
11
- //char *Bytes;
12
10
};
13
11
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 ;
17
16
};
18
17
19
18
struct ramp_t {
20
19
ramp_page_t * Pages , * Full ;
21
- ramp_defer_t * Defers ;
20
+ ramp_deferral_t * Deferrals ;
22
21
size_t PageSize , Space ;
23
22
};
24
23
25
24
static inline ramp_page_t * ramp_page_new (size_t PageSize ) {
26
25
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);
29
26
return Page ;
30
27
}
31
28
32
29
static inline void ramp_page_free (ramp_page_t * Page ) {
33
- //free(Page->Bytes);
34
30
free (Page );
35
31
}
36
32
@@ -42,16 +38,12 @@ ramp_t *ramp_new(size_t PageSize) {
42
38
ramp_t * Ramp = (ramp_t * )malloc (sizeof (ramp_t ));
43
39
Ramp -> Pages = Page ;
44
40
Ramp -> Full = NULL ;
45
- Ramp -> Defers = NULL ;
41
+ Ramp -> Deferrals = NULL ;
46
42
Ramp -> PageSize = PageSize ;
47
43
Ramp -> Space = PageSize ;
48
44
return Ramp ;
49
45
}
50
46
51
- static void ramp_defer_free (void * * Slot ) {
52
- free (Slot [0 ]);
53
- }
54
-
55
47
#define likely (x ) __builtin_expect (!!(x), 1)
56
48
#define unlikely (x ) __builtin_expect (!!(x), 0)
57
49
@@ -74,8 +66,8 @@ void *ramp_alloc(ramp_t *Ramp, size_t Size) {
74
66
Ramp -> Space = Ramp -> PageSize - Size ;
75
67
return New -> Bytes + Ramp -> Space ;
76
68
} 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 );
79
71
return Bytes ;
80
72
}
81
73
}
@@ -88,32 +80,23 @@ void *ramp_strdup(ramp_t *Ramp, const char *String) {
88
80
return Copy ;
89
81
}
90
82
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 ;
97
89
}
98
90
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 ) {}
107
92
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 ;
112
95
}
113
96
114
97
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 ;
117
100
ramp_page_t * * Slot = & Ramp -> Pages -> Next ;
118
101
while (Slot [0 ]) Slot = & Slot [0 ]-> Next ;
119
102
Slot [0 ] = Ramp -> Full ;
@@ -122,8 +105,8 @@ void ramp_clear(ramp_t *Ramp) {
122
105
}
123
106
124
107
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 ;
127
110
ramp_page_t * Old = Ramp -> Pages ;
128
111
for (ramp_page_t * Page = Old -> Next , * Next ; Page ; Page = Next ) {
129
112
Next = Page -> Next ;
0 commit comments