mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-03-20 21:39:53 +01:00
msgpack_zone: sizeof(int) bytes alignment
This commit is contained in:
parent
c3f9696268
commit
e7403013e5
19
c/zone.c
19
c/zone.c
@ -19,7 +19,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
static inline bool init_chunk_array(msgpack_zone_chunk_array* ca, size_t chunk_size)
|
static inline bool init_chunk_array(msgpack_zone_chunk_array* ca, size_t chunk_size)
|
||||||
{
|
{
|
||||||
// glibcは72バイト以下のmallocが高速
|
// glibcは72バイト以下のmallocが高速
|
||||||
@ -74,25 +73,11 @@ static inline void clear_chunk_array(msgpack_zone_chunk_array* ca)
|
|||||||
ca->array[0].ptr = (char*)ca->array[0].alloc;
|
ca->array[0].ptr = (char*)ca->array[0].alloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* msgpack_zone_malloc(msgpack_zone* zone, size_t size)
|
void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size)
|
||||||
{
|
{
|
||||||
msgpack_zone_chunk_array* const ca = &zone->chunk_array;
|
msgpack_zone_chunk_array* const ca = &zone->chunk_array;
|
||||||
|
|
||||||
msgpack_zone_chunk* chunk = ca->tail;
|
msgpack_zone_chunk* chunk = ++ca->tail;
|
||||||
|
|
||||||
if(chunk->free > size) {
|
|
||||||
// chunkに空き容量がある
|
|
||||||
// 空き容量を消費して返す
|
|
||||||
|
|
||||||
char* ptr = chunk->ptr;
|
|
||||||
|
|
||||||
chunk->ptr += size;
|
|
||||||
chunk->free -= size;
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
chunk = ++ca->tail;
|
|
||||||
|
|
||||||
if(chunk == ca->end) {
|
if(chunk == ca->end) {
|
||||||
// ca->arrayに空きがない
|
// ca->arrayに空きがない
|
||||||
|
26
c/zone.h
26
c/zone.h
@ -65,7 +65,7 @@ void msgpack_zone_destroy(msgpack_zone* zone);
|
|||||||
msgpack_zone* msgpack_zone_new(size_t chunk_size);
|
msgpack_zone* msgpack_zone_new(size_t chunk_size);
|
||||||
void msgpack_zone_free(msgpack_zone* zone);
|
void msgpack_zone_free(msgpack_zone* zone);
|
||||||
|
|
||||||
void* msgpack_zone_malloc(msgpack_zone* zone, size_t size);
|
static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size);
|
||||||
|
|
||||||
bool msgpack_zone_push_finalizer(msgpack_zone* zone,
|
bool msgpack_zone_push_finalizer(msgpack_zone* zone,
|
||||||
void (*func)(void* data), void* data);
|
void (*func)(void* data), void* data);
|
||||||
@ -75,6 +75,30 @@ bool msgpack_zone_is_empty(msgpack_zone* zone);
|
|||||||
void msgpack_zone_clear(msgpack_zone* zone);
|
void msgpack_zone_clear(msgpack_zone* zone);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MSGPACK_ZONE_ALIGN
|
||||||
|
#define MSGPACK_ZONE_ALIGN sizeof(int)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size);
|
||||||
|
|
||||||
|
void* msgpack_zone_malloc(msgpack_zone* zone, size_t size)
|
||||||
|
{
|
||||||
|
size = ((size)+((MSGPACK_ZONE_ALIGN)-1)) & ~((MSGPACK_ZONE_ALIGN)-1);
|
||||||
|
|
||||||
|
msgpack_zone_chunk* chunk = zone->chunk_array.tail;
|
||||||
|
|
||||||
|
if(chunk->free > size) {
|
||||||
|
char* ptr = chunk->ptr;
|
||||||
|
chunk->ptr += size;
|
||||||
|
chunk->free -= size;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return msgpack_zone_malloc_expand(zone, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user