MessagePack C implementation for mbed, modified from https://github.com/msgpack/msgpack-c
Embed:
(wiki syntax)
Show/hide line numbers
zone.h
00001 /* 00002 * MessagePack for C memory pool implementation 00003 * 00004 * Copyright (C) 2008-2010 FURUHASHI Sadayuki 00005 * 00006 * Licensed under the Apache License, Version 2.0 (the "License"); 00007 * you may not use this file except in compliance with the License. 00008 * You may obtain a copy of the License at 00009 * 00010 * http://www.apache.org/licenses/LICENSE-2.0 00011 * 00012 * Unless required by applicable law or agreed to in writing, software 00013 * distributed under the License is distributed on an "AS IS" BASIS, 00014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00015 * See the License for the specific language governing permissions and 00016 * limitations under the License. 00017 */ 00018 #ifndef MSGPACK_ZONE_H__ 00019 #define MSGPACK_ZONE_H__ 00020 00021 #include "sysdep.h" 00022 00023 #ifdef __cplusplus 00024 extern "C" { 00025 #endif 00026 00027 00028 /** 00029 * @defgroup msgpack_zone Memory zone 00030 * @ingroup msgpack 00031 * @{ 00032 */ 00033 00034 typedef struct msgpack_zone_finalizer { 00035 void (*func)(void* data); 00036 void* data; 00037 } msgpack_zone_finalizer; 00038 00039 typedef struct msgpack_zone_finalizer_array { 00040 msgpack_zone_finalizer* tail; 00041 msgpack_zone_finalizer* end; 00042 msgpack_zone_finalizer* array; 00043 } msgpack_zone_finalizer_array; 00044 00045 struct msgpack_zone_chunk; 00046 typedef struct msgpack_zone_chunk msgpack_zone_chunk; 00047 00048 typedef struct msgpack_zone_chunk_list { 00049 size_t free; 00050 char* ptr; 00051 msgpack_zone_chunk* head; 00052 } msgpack_zone_chunk_list; 00053 00054 typedef struct msgpack_zone { 00055 msgpack_zone_chunk_list chunk_list; 00056 msgpack_zone_finalizer_array finalizer_array; 00057 size_t chunk_size; 00058 } msgpack_zone; 00059 00060 #ifndef MSGPACK_ZONE_CHUNK_SIZE 00061 #define MSGPACK_ZONE_CHUNK_SIZE 8192 00062 #endif 00063 00064 bool msgpack_zone_init(msgpack_zone* zone, size_t chunk_size); 00065 void msgpack_zone_destroy(msgpack_zone* zone); 00066 00067 msgpack_zone* msgpack_zone_new(size_t chunk_size); 00068 void msgpack_zone_free(msgpack_zone* zone); 00069 00070 static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size); 00071 static inline void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size); 00072 00073 static inline bool msgpack_zone_push_finalizer(msgpack_zone* zone, 00074 void (*func)(void* data), void* data); 00075 00076 static inline void msgpack_zone_swap(msgpack_zone* a, msgpack_zone* b); 00077 00078 bool msgpack_zone_is_empty(msgpack_zone* zone); 00079 00080 void msgpack_zone_clear(msgpack_zone* zone); 00081 00082 /** @} */ 00083 00084 00085 #ifndef MSGPACK_ZONE_ALIGN 00086 #define MSGPACK_ZONE_ALIGN sizeof(int) 00087 #endif 00088 00089 void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size); 00090 00091 void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size) 00092 { 00093 char* ptr; 00094 msgpack_zone_chunk_list* cl = &zone->chunk_list; 00095 00096 if(zone->chunk_list.free < size) { 00097 return msgpack_zone_malloc_expand(zone, size); 00098 } 00099 00100 ptr = cl->ptr; 00101 cl->free -= size; 00102 cl->ptr += size; 00103 00104 return ptr; 00105 } 00106 00107 static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size) 00108 { 00109 return msgpack_zone_malloc_no_align(zone, 00110 ((size)+((MSGPACK_ZONE_ALIGN)-1)) & ~((MSGPACK_ZONE_ALIGN)-1)); 00111 } 00112 00113 00114 bool msgpack_zone_push_finalizer_expand(msgpack_zone* zone, 00115 void (*func)(void* data), void* data); 00116 00117 static inline bool msgpack_zone_push_finalizer(msgpack_zone* zone, 00118 void (*func)(void* data), void* data) 00119 { 00120 msgpack_zone_finalizer_array* const fa = &zone->finalizer_array; 00121 msgpack_zone_finalizer* fin = fa->tail; 00122 00123 if(fin == fa->end) { 00124 return msgpack_zone_push_finalizer_expand(zone, func, data); 00125 } 00126 00127 fin->func = func; 00128 fin->data = data; 00129 00130 ++fa->tail; 00131 00132 return true; 00133 } 00134 00135 static inline void msgpack_zone_swap(msgpack_zone* a, msgpack_zone* b) 00136 { 00137 msgpack_zone tmp = *a; 00138 *a = *b; 00139 *b = tmp; 00140 } 00141 00142 00143 #ifdef __cplusplus 00144 } 00145 #endif 00146 00147 #endif /* msgpack/zone.h */ 00148
Generated on Tue Jul 12 2022 16:33:33 by 1.7.2