-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjv_pool.h
executable file
·101 lines (71 loc) · 2.38 KB
/
jv_pool.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#ifndef _JV_POOL_H_INCLUDED_
#define _JV_POOL_H_INCLUDED_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef __x86_64__
#define JV_WORD_SIZE 64
#else
#define JV_WORD_SIZE 32
#endif
#define JV_OK 0
#define JV_ERROR -1
#define jv_memzero(buf, n) (void *) memset(buf, 0, n)
#define jv_memset(buf, c, n) (void *) memset(buf, c, n)
#ifndef intptr_t
#define intptr_t long
#define uintptr_t unsigned long
#endif
#define jv_align(d, a) (((d) + (a - 1)) & ~(a - 1))
typedef intptr_t jv_int_t;
typedef uintptr_t jv_uint_t;
typedef unsigned char u_char;
#define JV_POOL_MIN_SIZE 0x4000 /* 0x4000 = 1024 * 16 = 16484 */
#define JV_POOL_DEFAULT_SIZE 0x200000 /* 0x200000 = 1024 * 1024 * 2 = 2097152 */
/**
* (2<<31) = 2147483648
* (2<<63) = 9223372036854775808s
**/
#define JV_POOL_MAX_SIZE 1073741568 /* (2<<30) - 256 = 1073741824 - 256 = 1073741568 */
#define JV_POOL_QUICK_MODE 0
#define JV_POOL_SAFE_MODE 1
typedef struct jv_pool_s jv_pool_t;
typedef struct jv_block_s jv_block_t;
typedef struct jv_lump_s jv_lump_t;
struct jv_block_s {
jv_block_t *next;
size_t size;
};
struct jv_lump_s {
jv_lump_t *prev;
jv_lump_t *next;
unsigned size : 31;
unsigned used : 1;
};
struct jv_pool_s {
jv_block_t *first;
jv_block_t *last;
jv_lump_t *lump;
jv_lump_t *idle; /* current idle lump's position */
size_t size; /* setting default block size */
uint32_t lump_count;
unsigned block_count : 31;
unsigned mode : 1; /* quick mode is 0, safe mode is 1, default is 1 */
};
jv_pool_t *jv_pool_create(size_t size, unsigned mode);
void *jv_pool_alloc(jv_pool_t *pool, size_t size);
void *jv_pool_realloc(jv_pool_t *pool, void *ptr, size_t size);
jv_int_t jv_pool_free(jv_pool_t *pool, void *ptr);
size_t jv_pool_sizeof(jv_pool_t *pool, void *ptr);
jv_int_t jv_pool_exist(jv_pool_t *pool, void *ptr);
jv_int_t jv_pool_recycle(jv_pool_t *pool, void *ptr);
jv_int_t jv_pool_reset(jv_pool_t *pool);
#define jv_pool_each_lump(pool, lump, i) \
\
for(lump = (pool)->lump, i = 0; i == 0 || lump != (pool)->lump; i++, lump = lump->prev)
#define jv_pool_each_block(pool, block, i) \
\
for(block = (pool)->first, i = 0; block != NULL; i++, block = block->next)
void jv_pool_destroy(jv_pool_t *pool);
void jv_pool_dump(jv_pool_t *pool, FILE *fd);
#endif /* _JV_POOL_H_INCLUDED_ */