X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_string.c;h=ad396118b2b878ba9ab938e9c412defadafdf648;hb=ac7b4013b6ada79981f5385c10c2ba242df58143;hp=42f3c326767f112c3ed071fd9a8b215bff85a7df;hpb=46f12a5edfa0fc0382a9d25355b15d30f857b138;p=awesomized%2Flibmemcached diff --git a/lib/memcached_string.c b/lib/memcached_string.c index 42f3c326..ad396118 100644 --- a/lib/memcached_string.c +++ b/lib/memcached_string.c @@ -18,7 +18,10 @@ memcached_return memcached_string_check(memcached_string_st *string, size_t need if (new_size < need) return MEMCACHED_MEMORY_ALLOCATION_FAILURE; - new_value= (char *)realloc(string->string, new_size); + if (string->root->call_realloc) + new_value= (char *)string->root->call_realloc(string->root, string->string, new_size); + else + new_value= (char *)realloc(string->string, new_size); if (new_value == NULL) return MEMCACHED_MEMORY_ALLOCATION_FAILURE; @@ -44,8 +47,12 @@ memcached_string_st *memcached_string_create(memcached_st *ptr, memcached_string } else { - string= (memcached_string_st *)malloc(sizeof(memcached_string_st)); - if (!string) + if (ptr->call_malloc) + string= (memcached_string_st *)ptr->call_malloc(ptr, sizeof(memcached_string_st)); + else + string= (memcached_string_st *)malloc(sizeof(memcached_string_st)); + + if (string == NULL) return NULL; memset(string, 0, sizeof(memcached_string_st)); string->is_allocated= MEMCACHED_ALLOCATED; @@ -56,7 +63,11 @@ memcached_string_st *memcached_string_create(memcached_st *ptr, memcached_string rc= memcached_string_check(string, initial_size); if (rc != MEMCACHED_SUCCESS) { - free(string); + if (ptr->call_free) + ptr->call_free(ptr, string); + else + free(string); + return NULL; } @@ -70,6 +81,8 @@ memcached_return memcached_string_append_character(memcached_string_st *string, { memcached_return rc; + WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED); + rc= memcached_string_check(string, 1); if (rc != MEMCACHED_SUCCESS) @@ -86,6 +99,8 @@ memcached_return memcached_string_append(memcached_string_st *string, { memcached_return rc; + WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED); + rc= memcached_string_check(string, length); if (rc != MEMCACHED_SUCCESS) @@ -103,6 +118,8 @@ memcached_return memcached_string_append(memcached_string_st *string, size_t memcached_string_backspace(memcached_string_st *string, size_t remove) { + WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED); + if (string->end - string->string > remove) { size_t difference; @@ -120,26 +137,51 @@ size_t memcached_string_backspace(memcached_string_st *string, size_t remove) char *memcached_string_c_copy(memcached_string_st *string) { char *c_ptr; - c_ptr= (char *)malloc(memcached_string_length(string) * sizeof(char)); - if (!c_ptr) + + WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED); + + if (string->root->call_malloc) + c_ptr= (char *)string->root->call_malloc(string->root, (memcached_string_length(string)+1) * sizeof(char)); + else + c_ptr= (char *)malloc((memcached_string_length(string)+1) * sizeof(char)); + + if (c_ptr == NULL) return NULL; memcpy(c_ptr, memcached_string_value(string), memcached_string_length(string)); + c_ptr[memcached_string_length(string)]= 0; return c_ptr; } memcached_return memcached_string_reset(memcached_string_st *string) { + WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED); string->end= string->string; return MEMCACHED_SUCCESS; } -void memcached_string_free(memcached_string_st *string) +void memcached_string_free(memcached_string_st *ptr) { - if (string->string) - free(string->string); - if (string->is_allocated == MEMCACHED_ALLOCATED) - free(string); + if (ptr == NULL) + return; + + if (ptr->string) + { + if (ptr->root->call_free) + ptr->root->call_free(ptr->root, ptr->string); + else + free(ptr->string); + } + + if (ptr->is_allocated == MEMCACHED_ALLOCATED) + { + if (ptr->root->call_free) + ptr->root->call_free(ptr->root, ptr); + else + free(ptr); + } + else + ptr->is_allocated= MEMCACHED_USED; }