Commit 8934e864d74f15909debc97cd42c7a5a6811cee4
1 parent
f1f3e146
simplified the quick fit interface
Showing
5 changed files
with
43 additions
and
26 deletions
... | ... | @@ -26,17 +26,13 @@ |
26 | 26 | #define CSTRA(val) val, sizeof(val)-1 //!< Const STRing Argument |
27 | 27 | |
28 | 28 | #define FREE(val) (ffree((void**)&(val))) |
29 | -#define MEM_FREE(seg) (memFree((struct memSegment **)&(seg))) | |
29 | +#define MEM_FREE(seg) (memFree((void **)&(seg))) | |
30 | 30 | |
31 | -struct memSegment { | |
32 | - size_t size; | |
33 | - void * ptr; | |
34 | -}; | |
35 | 31 | |
36 | -struct memSegment * memMalloc(size_t); | |
37 | -struct memSegment * memCalloc(size_t, size_t); | |
38 | -void memFree(struct memSegment **); | |
39 | -void memCleanup(); | |
32 | +void * memMalloc(size_t); | |
33 | +void * memCalloc(size_t, size_t); | |
34 | +void memFree(void **); | |
35 | +void memCleanup(); | |
40 | 36 | |
41 | 37 | void ffree(void **); |
42 | 38 | ... | ... |
... | ... | @@ -53,8 +53,7 @@ cbufCtor(void * _this, va_list * params) |
53 | 53 | int shm; |
54 | 54 | char * data; |
55 | 55 | |
56 | - this->shm_name_seg = memMalloc(strlen(shm_name) + 7 + 2); | |
57 | - this->shm_name = this->shm_name_seg->ptr; | |
56 | + this->shm_name = memMalloc(strlen(shm_name) + 7 + 2); | |
58 | 57 | sprintf(this->shm_name, "/%06d_%s", getpid(), shm_name); |
59 | 58 | |
60 | 59 | /** |
... | ... | @@ -111,7 +110,7 @@ cbufDtor(void * _this) |
111 | 110 | { |
112 | 111 | Cbuf this = _this; |
113 | 112 | |
114 | - MEM_FREE(this->shm_name_seg); | |
113 | + MEM_FREE(this->shm_name); | |
115 | 114 | |
116 | 115 | if (NULL != this->data && MAP_FAILED != this->data) { |
117 | 116 | munmap(this->data, this->bsize << 1); | ... | ... |
... | ... | @@ -39,9 +39,9 @@ loggerLog(void * _object, logger_level level, const char * const fmt, ...) { |
39 | 39 | Logger object = _object; |
40 | 40 | |
41 | 41 | if (level >= object->min_level) { |
42 | - struct memSegment * msg = NULL; | |
43 | - size_t msg_size = 0; | |
44 | - va_list params; | |
42 | + char * msg = NULL; | |
43 | + size_t msg_size = 0; | |
44 | + va_list params; | |
45 | 45 | |
46 | 46 | va_start(params, fmt); |
47 | 47 | msg_size = vsnprintf(NULL, msg_size, fmt, params); |
... | ... | @@ -50,10 +50,10 @@ loggerLog(void * _object, logger_level level, const char * const fmt, ...) { |
50 | 50 | msg = memMalloc(msg_size + 1); |
51 | 51 | |
52 | 52 | va_start(params, fmt); |
53 | - vsnprintf(msg->ptr, msg_size + 1, fmt, params); | |
53 | + vsnprintf(msg, msg_size + 1, fmt, params); | |
54 | 54 | va_end(params); |
55 | 55 | |
56 | - CALL(_object, Logger, log, level, msg->ptr); | |
56 | + CALL(_object, Logger, log, level, msg); | |
57 | 57 | |
58 | 58 | MEM_FREE(msg); |
59 | 59 | } | ... | ... |
... | ... | @@ -47,6 +47,11 @@ |
47 | 47 | |
48 | 48 | #include "utils/memory.h" |
49 | 49 | |
50 | +struct memSegment { | |
51 | + size_t size; | |
52 | + void * ptr; | |
53 | +}; | |
54 | + | |
50 | 55 | |
51 | 56 | void * segments = NULL; |
52 | 57 | |
... | ... | @@ -100,7 +105,7 @@ segmentFree(void * segment) |
100 | 105 | } |
101 | 106 | |
102 | 107 | |
103 | -struct memSegment * | |
108 | +void * | |
104 | 109 | memMalloc(size_t size) |
105 | 110 | { |
106 | 111 | struct memSegment * seg = tfind(&size, &segments, segmentFindCmp); |
... | ... | @@ -116,7 +121,7 @@ memMalloc(size_t size) |
116 | 121 | seg = *(struct memSegment **)seg; |
117 | 122 | } |
118 | 123 | |
119 | - return seg; | |
124 | + return seg->ptr; | |
120 | 125 | } |
121 | 126 | |
122 | 127 | /** |
... | ... | @@ -124,18 +129,36 @@ memMalloc(size_t size) |
124 | 129 | * because we want the best performance. |
125 | 130 | * Most times this is not neccessary at all. |
126 | 131 | */ |
127 | -struct memSegment * | |
132 | +void * | |
128 | 133 | memCalloc(size_t nmemb, size_t size) |
129 | 134 | { |
130 | - return memMalloc(nmemb * size); | |
135 | + size_t _size = nmemb * size; | |
136 | + size_t _inmemb = (sizeof(struct memSegment) / size) + 1; | |
137 | + struct memSegment * seg = tfind(&_size, &segments, segmentFindCmp); | |
138 | + | |
139 | + if (NULL == seg) { | |
140 | + seg = (struct memSegment *)calloc(nmemb + _inmemb, size); | |
141 | + seg->size = size; | |
142 | + seg->ptr = seg + sizeof(struct memSegment); | |
143 | + } else { | |
144 | + // remove the found one from the tree as we use it now. | |
145 | + tdelete((void *)seg, &segments, segmentSearchCmp); | |
146 | + seg = *(struct memSegment **)seg; | |
147 | + } | |
148 | + | |
149 | + return seg->ptr; | |
131 | 150 | } |
132 | 151 | |
133 | 152 | void |
134 | -memFree(struct memSegment ** seg) | |
153 | +memFree(void ** mem) | |
135 | 154 | { |
136 | - if (NULL != *seg) { | |
137 | - tsearch((void *)*seg, &segments, segmentSearchCmp); | |
138 | - *seg = NULL; | |
155 | + if (NULL != *mem) { | |
156 | + struct memSegment * seg = *(struct memSegment **)mem; | |
157 | + | |
158 | + seg -= sizeof(struct memSegment); | |
159 | + | |
160 | + tsearch((void *)seg, &segments, segmentSearchCmp); | |
161 | + *mem = NULL; | |
139 | 162 | } |
140 | 163 | } |
141 | 164 | ... | ... |
Please
register
or
login
to post a comment