Commit aaa5ff81 authored by Yossi Gottlieb's avatar Yossi Gottlieb Committed by Willem
Browse files

Add custom heap management hooks. (#56)

parent d9d35596
......@@ -868,4 +868,13 @@ int raft_node_is_voting_committed(raft_node_t* me_);
**/
int raft_node_is_addition_committed(raft_node_t* me_);
/**
* Register custom heap management functions, to be used if an alternative
* heap management is used.
**/
void raft_set_heap_functions(void *(*_malloc)(size_t),
void *(*_calloc)(size_t, size_t),
void *(*_realloc)(void *, size_t),
void (*_free)(void *));
#endif /* RAFT_H_ */
......@@ -136,6 +136,12 @@ int raft_node_is_active(raft_node_t* me_);
void raft_node_set_voting_committed(raft_node_t* me_, int voting);
int raft_node_set_addition_committed(raft_node_t* me_, int committed);
void raft_node_set_addition_committed(raft_node_t* me_, int committed);
/* Heap functions */
extern void *(*__raft_malloc)(size_t size);
extern void *(*__raft_calloc)(size_t nmemb, size_t size);
extern void *(*__raft_realloc)(void *ptr, size_t size);
extern void (*__raft_free)(void *ptr);
#endif /* RAFT_PRIVATE_H_ */
......@@ -54,7 +54,7 @@ static int __ensurecapacity(log_private_t * me)
if (me->count < me->size)
return 0;
temp = (raft_entry_t*)calloc(1, sizeof(raft_entry_t) * me->size * 2);
temp = (raft_entry_t*)__raft_calloc(1, sizeof(raft_entry_t) * me->size * 2);
if (!temp)
return RAFT_ERR_NOMEM;
......@@ -66,7 +66,7 @@ static int __ensurecapacity(log_private_t * me)
}
/* clean up old entries */
free(me->entries);
__raft_free(me->entries);
me->size *= 2;
me->entries = temp;
......@@ -101,14 +101,14 @@ int log_load_from_snapshot(log_t *me_, int idx, int term)
log_t* log_alloc(int initial_size)
{
log_private_t* me = (log_private_t*)calloc(1, sizeof(log_private_t));
log_private_t* me = (log_private_t*)__raft_calloc(1, sizeof(log_private_t));
if (!me)
return NULL;
me->size = initial_size;
log_clear((log_t*)me);
me->entries = (raft_entry_t*)calloc(1, sizeof(raft_entry_t) * me->size);
me->entries = (raft_entry_t*)__raft_calloc(1, sizeof(raft_entry_t) * me->size);
if (!me->entries) {
free(me);
__raft_free(me);
return NULL;
}
return (log_t*)me;
......@@ -300,8 +300,8 @@ void log_free(log_t * me_)
{
log_private_t* me = (log_private_t*)me_;
free(me->entries);
free(me);
__raft_free(me->entries);
__raft_free(me);
}
int log_get_current_idx(log_t* me_)
......
......@@ -15,6 +15,7 @@
#include <assert.h>
#include "raft.h"
#include "raft_private.h"
#define RAFT_NODE_VOTED_FOR_ME (1 << 0)
#define RAFT_NODE_VOTING (1 << 1)
......@@ -38,7 +39,7 @@ typedef struct
raft_node_t* raft_node_new(void* udata, int id)
{
raft_node_private_t* me;
me = (raft_node_private_t*)calloc(1, sizeof(raft_node_private_t));
me = (raft_node_private_t*)__raft_calloc(1, sizeof(raft_node_private_t));
if (!me)
return NULL;
me->udata = udata;
......@@ -51,7 +52,7 @@ raft_node_t* raft_node_new(void* udata, int id)
void raft_node_free(raft_node_t* me_)
{
free(me_);
__raft_free(me_);
}
int raft_node_get_next_idx(raft_node_t* me_)
......
......@@ -28,6 +28,22 @@
#define max(a, b) ((a) < (b) ? (b) : (a))
#endif
void *(*__raft_malloc)(size_t) = malloc;
void *(*__raft_calloc)(size_t, size_t) = calloc;
void *(*__raft_realloc)(void *, size_t) = realloc;
void (*__raft_free)(void *) = free;
void raft_set_heap_functions(void *(*_malloc)(size_t),
void *(*_calloc)(size_t, size_t),
void *(*_realloc)(void *, size_t),
void (*_free)(void *))
{
__raft_malloc = _malloc;
__raft_calloc = _calloc;
__raft_realloc = _realloc;
__raft_free = _free;
}
static void __log(raft_server_t *me_, raft_node_t* node, const char *fmt, ...)
{
raft_server_private_t* me = (raft_server_private_t*)me_;
......@@ -53,7 +69,7 @@ void raft_randomize_election_timeout(raft_server_t* me_)
raft_server_t* raft_new()
{
raft_server_private_t* me =
(raft_server_private_t*)calloc(1, sizeof(raft_server_private_t));
(raft_server_private_t*)__raft_calloc(1, sizeof(raft_server_private_t));
if (!me)
return NULL;
me->current_term = 0;
......@@ -64,7 +80,7 @@ raft_server_t* raft_new()
raft_randomize_election_timeout((raft_server_t*)me);
me->log = log_new();
if (!me->log) {
free(me);
__raft_free(me);
return NULL;
}
me->voting_cfg_change_log_idx = -1;
......@@ -91,7 +107,7 @@ void raft_free(raft_server_t* me_)
raft_server_private_t* me = (raft_server_private_t*)me_;
log_free(me->log);
free(me_);
__raft_free(me_);
}
void raft_clear(raft_server_t* me_)
......@@ -915,7 +931,7 @@ raft_node_t* raft_add_node(raft_server_t* me_, void* udata, int id, int is_self)
node = raft_node_new(udata, id);
if (!node)
return NULL;
void* p = realloc(me->nodes, sizeof(void*) * (me->num_nodes + 1));
void* p = __raft_realloc(me->nodes, sizeof(void*) * (me->num_nodes + 1));
if (!p) {
raft_node_free(node);
return NULL;
......@@ -1076,7 +1092,9 @@ void raft_offer_log(raft_server_t* me_, raft_entry_t* ety, const int idx)
break;
case RAFT_LOGTYPE_ADD_NODE:
node = raft_add_node(me_, NULL, node_id, is_self);
if (!node) {
node = raft_add_node(me_, NULL, node_id, is_self);
}
assert(node);
assert(raft_node_is_voting(node));
break;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment