10
10
11
11
#include "tlsf.h"
12
12
13
+ #ifndef UNLIKELY
13
14
#define UNLIKELY (x ) __builtin_expect(!!(x), false)
15
+ #endif
14
16
15
17
/* All allocation sizes and addresses are aligned. */
16
18
#define ALIGN_SIZE ((size_t) 1 << ALIGN_SHIFT)
46
48
#endif
47
49
#endif
48
50
49
- #ifndef TLSF_INL
50
- #define TLSF_INL static inline __attribute__((always_inline))
51
+ #ifndef INLINE
52
+ #define INLINE static inline __attribute__((always_inline))
51
53
#endif
52
54
53
55
typedef struct tlsf_block_ tlsf_block ;
@@ -82,14 +84,14 @@ _Static_assert(SL_COUNT <= 32, "index too large");
82
84
_Static_assert (FL_COUNT == _TLSF_FL_COUNT , "invalid level configuration" );
83
85
_Static_assert (SL_COUNT == _TLSF_SL_COUNT , "invalid level configuration" );
84
86
85
- TLSF_INL uint32_t bitmap_ffs (uint32_t x )
87
+ INLINE uint32_t bitmap_ffs (uint32_t x )
86
88
{
87
89
uint32_t i = (uint32_t ) __builtin_ffs ((int32_t ) x );
88
90
TLSF_ASSERT (i , "no set bit found" );
89
91
return i - 1U ;
90
92
}
91
93
92
- TLSF_INL uint32_t log2floor (size_t x )
94
+ INLINE uint32_t log2floor (size_t x )
93
95
{
94
96
TLSF_ASSERT (x > 0 , "log2 of zero" );
95
97
return sizeof (size_t ) == 8
@@ -98,50 +100,50 @@ TLSF_INL uint32_t log2floor(size_t x)
98
100
: (uint32_t ) (31 - (uint32_t ) __builtin_clzl ((unsigned long ) x ));
99
101
}
100
102
101
- TLSF_INL size_t block_size (const tlsf_block * block )
103
+ INLINE size_t block_size (const tlsf_block * block )
102
104
{
103
105
return block -> header & ~BLOCK_BITS ;
104
106
}
105
107
106
- TLSF_INL void block_set_size (tlsf_block * block , size_t size )
108
+ INLINE void block_set_size (tlsf_block * block , size_t size )
107
109
{
108
110
TLSF_ASSERT (!(size % ALIGN_SIZE ), "invalid size" );
109
111
block -> header = size | (block -> header & BLOCK_BITS );
110
112
}
111
113
112
- TLSF_INL bool block_is_free (const tlsf_block * block )
114
+ INLINE bool block_is_free (const tlsf_block * block )
113
115
{
114
116
return !!(block -> header & BLOCK_BIT_FREE );
115
117
}
116
118
117
- TLSF_INL bool block_is_prev_free (const tlsf_block * block )
119
+ INLINE bool block_is_prev_free (const tlsf_block * block )
118
120
{
119
121
return !!(block -> header & BLOCK_BIT_PREV_FREE );
120
122
}
121
123
122
- TLSF_INL void block_set_prev_free (tlsf_block * block , bool free )
124
+ INLINE void block_set_prev_free (tlsf_block * block , bool free )
123
125
{
124
126
block -> header = free ? block -> header | BLOCK_BIT_PREV_FREE
125
127
: block -> header & ~BLOCK_BIT_PREV_FREE ;
126
128
}
127
129
128
- TLSF_INL size_t align_up (size_t x , size_t align )
130
+ INLINE size_t align_up (size_t x , size_t align )
129
131
{
130
132
TLSF_ASSERT (!(align & (align - 1 )), "must align to a power of two" );
131
133
return (x + (align - 1 )) & ~(align - 1 );
132
134
}
133
135
134
- TLSF_INL char * align_ptr (char * p , size_t align )
136
+ INLINE char * align_ptr (char * p , size_t align )
135
137
{
136
138
return (char * ) align_up ((size_t ) p , align );
137
139
}
138
140
139
- TLSF_INL char * block_payload (tlsf_block * block )
141
+ INLINE char * block_payload (tlsf_block * block )
140
142
{
141
143
return (char * ) block + offsetof(tlsf_block , header ) + BLOCK_OVERHEAD ;
142
144
}
143
145
144
- TLSF_INL tlsf_block * to_block (void * ptr )
146
+ INLINE tlsf_block * to_block (void * ptr )
145
147
{
146
148
tlsf_block * block = (tlsf_block * ) ptr ;
147
149
TLSF_ASSERT (
@@ -150,21 +152,21 @@ TLSF_INL tlsf_block *to_block(void *ptr)
150
152
return block ;
151
153
}
152
154
153
- TLSF_INL tlsf_block * block_from_payload (void * ptr )
155
+ INLINE tlsf_block * block_from_payload (void * ptr )
154
156
{
155
157
return to_block ((char * ) ptr - offsetof(tlsf_block , header ) -
156
158
BLOCK_OVERHEAD );
157
159
}
158
160
159
161
/* Return location of previous block. */
160
- TLSF_INL tlsf_block * block_prev (const tlsf_block * block )
162
+ INLINE tlsf_block * block_prev (const tlsf_block * block )
161
163
{
162
164
TLSF_ASSERT (block_is_prev_free (block ), "previous block must be free" );
163
165
return block -> prev ;
164
166
}
165
167
166
168
/* Return location of next existing block. */
167
- TLSF_INL tlsf_block * block_next (tlsf_block * block )
169
+ INLINE tlsf_block * block_next (tlsf_block * block )
168
170
{
169
171
tlsf_block * next =
170
172
to_block (block_payload (block ) + block_size (block ) - BLOCK_OVERHEAD );
@@ -173,19 +175,19 @@ TLSF_INL tlsf_block *block_next(tlsf_block *block)
173
175
}
174
176
175
177
/* Link a new block with its neighbor, return the neighbor. */
176
- TLSF_INL tlsf_block * block_link_next (tlsf_block * block )
178
+ INLINE tlsf_block * block_link_next (tlsf_block * block )
177
179
{
178
180
tlsf_block * next = block_next (block );
179
181
next -> prev = block ;
180
182
return next ;
181
183
}
182
184
183
- TLSF_INL bool block_can_split (tlsf_block * block , size_t size )
185
+ INLINE bool block_can_split (tlsf_block * block , size_t size )
184
186
{
185
187
return block_size (block ) >= sizeof (tlsf_block ) + size ;
186
188
}
187
189
188
- TLSF_INL void block_set_free (tlsf_block * block , bool free )
190
+ INLINE void block_set_free (tlsf_block * block , bool free )
189
191
{
190
192
TLSF_ASSERT (block_is_free (block ) != free , "block free bit unchanged" );
191
193
block -> header =
@@ -195,20 +197,20 @@ TLSF_INL void block_set_free(tlsf_block *block, bool free)
195
197
196
198
/* Adjust allocation size to be aligned, and no smaller than internal minimum.
197
199
*/
198
- TLSF_INL size_t adjust_size (size_t size , size_t align )
200
+ INLINE size_t adjust_size (size_t size , size_t align )
199
201
{
200
202
size = align_up (size , align );
201
203
return size < BLOCK_SIZE_MIN ? BLOCK_SIZE_MIN : size ;
202
204
}
203
205
204
206
/* Round up to the next block size */
205
- TLSF_INL size_t round_block_size (size_t size )
207
+ INLINE size_t round_block_size (size_t size )
206
208
{
207
209
size_t t = ((size_t ) 1 << (log2floor (size ) - SL_SHIFT )) - 1 ;
208
210
return size >= BLOCK_SIZE_SMALL ? (size + t ) & ~t : size ;
209
211
}
210
212
211
- TLSF_INL void mapping (size_t size , uint32_t * fl , uint32_t * sl )
213
+ INLINE void mapping (size_t size , uint32_t * fl , uint32_t * sl )
212
214
{
213
215
if (size < BLOCK_SIZE_SMALL ) {
214
216
/* Store small blocks in first list. */
@@ -223,7 +225,7 @@ TLSF_INL void mapping(size_t size, uint32_t *fl, uint32_t *sl)
223
225
TLSF_ASSERT (* sl < SL_COUNT , "wrong second level" );
224
226
}
225
227
226
- TLSF_INL tlsf_block * block_find_suitable (tlsf * t , uint32_t * fl , uint32_t * sl )
228
+ INLINE tlsf_block * block_find_suitable (tlsf * t , uint32_t * fl , uint32_t * sl )
227
229
{
228
230
TLSF_ASSERT (* fl < FL_COUNT , "wrong first level" );
229
231
TLSF_ASSERT (* sl < SL_COUNT , "wrong second level" );
@@ -252,10 +254,10 @@ TLSF_INL tlsf_block *block_find_suitable(tlsf *t, uint32_t *fl, uint32_t *sl)
252
254
}
253
255
254
256
/* Remove a free block from the free list. */
255
- TLSF_INL void remove_free_block (tlsf * t ,
256
- tlsf_block * block ,
257
- uint32_t fl ,
258
- uint32_t sl )
257
+ INLINE void remove_free_block (tlsf * t ,
258
+ tlsf_block * block ,
259
+ uint32_t fl ,
260
+ uint32_t sl )
259
261
{
260
262
TLSF_ASSERT (fl < FL_COUNT , "wrong first level" );
261
263
TLSF_ASSERT (sl < SL_COUNT , "wrong second level" );
@@ -283,10 +285,10 @@ TLSF_INL void remove_free_block(tlsf *t,
283
285
}
284
286
285
287
/* Insert a free block into the free block list and mark the bitmaps. */
286
- TLSF_INL void insert_free_block (tlsf * t ,
287
- tlsf_block * block ,
288
- uint32_t fl ,
289
- uint32_t sl )
288
+ INLINE void insert_free_block (tlsf * t ,
289
+ tlsf_block * block ,
290
+ uint32_t fl ,
291
+ uint32_t sl )
290
292
{
291
293
tlsf_block * current = t -> block [fl ][sl ];
292
294
TLSF_ASSERT (block , "cannot insert a null entry into the free list" );
@@ -300,23 +302,23 @@ TLSF_INL void insert_free_block(tlsf *t,
300
302
}
301
303
302
304
/* Remove a given block from the free list. */
303
- TLSF_INL void block_remove (tlsf * t , tlsf_block * block )
305
+ INLINE void block_remove (tlsf * t , tlsf_block * block )
304
306
{
305
307
uint32_t fl , sl ;
306
308
mapping (block_size (block ), & fl , & sl );
307
309
remove_free_block (t , block , fl , sl );
308
310
}
309
311
310
312
/* Insert a given block into the free list. */
311
- TLSF_INL void block_insert (tlsf * t , tlsf_block * block )
313
+ INLINE void block_insert (tlsf * t , tlsf_block * block )
312
314
{
313
315
uint32_t fl , sl ;
314
316
mapping (block_size (block ), & fl , & sl );
315
317
insert_free_block (t , block , fl , sl );
316
318
}
317
319
318
320
/* Split a block into two, the second of which is free. */
319
- TLSF_INL tlsf_block * block_split (tlsf_block * block , size_t size )
321
+ INLINE tlsf_block * block_split (tlsf_block * block , size_t size )
320
322
{
321
323
tlsf_block * rest = to_block (block_payload (block ) + size - BLOCK_OVERHEAD );
322
324
size_t rest_size = block_size (block ) - (size + BLOCK_OVERHEAD );
@@ -331,7 +333,7 @@ TLSF_INL tlsf_block *block_split(tlsf_block *block, size_t size)
331
333
}
332
334
333
335
/* Absorb a free block's storage into an adjacent previous free block. */
334
- TLSF_INL tlsf_block * block_absorb (tlsf_block * prev , tlsf_block * block )
336
+ INLINE tlsf_block * block_absorb (tlsf_block * prev , tlsf_block * block )
335
337
{
336
338
TLSF_ASSERT (block_size (prev ), "previous block can't be last" );
337
339
/* Note: Leaves flags untouched. */
@@ -341,7 +343,7 @@ TLSF_INL tlsf_block *block_absorb(tlsf_block *prev, tlsf_block *block)
341
343
}
342
344
343
345
/* Merge a just-freed block with an adjacent previous free block. */
344
- TLSF_INL tlsf_block * block_merge_prev (tlsf * t , tlsf_block * block )
346
+ INLINE tlsf_block * block_merge_prev (tlsf * t , tlsf_block * block )
345
347
{
346
348
if (block_is_prev_free (block )) {
347
349
tlsf_block * prev = block_prev (block );
@@ -355,7 +357,7 @@ TLSF_INL tlsf_block *block_merge_prev(tlsf *t, tlsf_block *block)
355
357
}
356
358
357
359
/* Merge a just-freed block with an adjacent free block. */
358
- TLSF_INL tlsf_block * block_merge_next (tlsf * t , tlsf_block * block )
360
+ INLINE tlsf_block * block_merge_next (tlsf * t , tlsf_block * block )
359
361
{
360
362
tlsf_block * next = block_next (block );
361
363
TLSF_ASSERT (next , "next block can't be null" );
@@ -368,7 +370,7 @@ TLSF_INL tlsf_block *block_merge_next(tlsf *t, tlsf_block *block)
368
370
}
369
371
370
372
/* Trim any trailing block space off the end of a block, return to pool. */
371
- TLSF_INL void block_rtrim_free (tlsf * t , tlsf_block * block , size_t size )
373
+ INLINE void block_rtrim_free (tlsf * t , tlsf_block * block , size_t size )
372
374
{
373
375
TLSF_ASSERT (block_is_free (block ), "block must be free" );
374
376
if (block_can_split (block , size )) {
@@ -380,7 +382,7 @@ TLSF_INL void block_rtrim_free(tlsf *t, tlsf_block *block, size_t size)
380
382
}
381
383
382
384
/* Trim any trailing block space off the end of a used block, return to pool. */
383
- TLSF_INL void block_rtrim_used (tlsf * t , tlsf_block * block , size_t size )
385
+ INLINE void block_rtrim_used (tlsf * t , tlsf_block * block , size_t size )
384
386
{
385
387
TLSF_ASSERT (!block_is_free (block ), "block must be used" );
386
388
if (block_can_split (block , size )) {
@@ -391,7 +393,7 @@ TLSF_INL void block_rtrim_used(tlsf *t, tlsf_block *block, size_t size)
391
393
}
392
394
}
393
395
394
- TLSF_INL tlsf_block * block_ltrim_free (tlsf * t , tlsf_block * block , size_t size )
396
+ INLINE tlsf_block * block_ltrim_free (tlsf * t , tlsf_block * block , size_t size )
395
397
{
396
398
TLSF_ASSERT (block_is_free (block ), "block must be free" );
397
399
TLSF_ASSERT (block_can_split (block , size ), "block is too small" );
@@ -402,14 +404,14 @@ TLSF_INL tlsf_block *block_ltrim_free(tlsf *t, tlsf_block *block, size_t size)
402
404
return rest ;
403
405
}
404
406
405
- TLSF_INL void * block_use (tlsf * t , tlsf_block * block , size_t size )
407
+ INLINE void * block_use (tlsf * t , tlsf_block * block , size_t size )
406
408
{
407
409
block_rtrim_free (t , block , size );
408
410
block_set_free (block , false);
409
411
return block_payload (block );
410
412
}
411
413
412
- TLSF_INL void check_sentinel (tlsf_block * block )
414
+ INLINE void check_sentinel (tlsf_block * block )
413
415
{
414
416
(void ) block ;
415
417
TLSF_ASSERT (!block_size (block ), "sentinel should be last" );
@@ -457,7 +459,7 @@ static void arena_shrink(tlsf *t, tlsf_block *block)
457
459
}
458
460
}
459
461
460
- TLSF_INL tlsf_block * block_find_free (tlsf * t , size_t size )
462
+ INLINE tlsf_block * block_find_free (tlsf * t , size_t size )
461
463
{
462
464
size_t rounded = round_block_size (size );
463
465
uint32_t fl , sl ;
0 commit comments