MessagePack C implementation for mbed, modified from https://github.com/msgpack/msgpack-c

Dependents:   msgpack_example

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers zone.h Source File

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