void * __gf_calloc (size_t nmemb, size_t size, uint32_t type, const char *typestr) { size_t tot_size = 0; size_t req_size = 0; char *ptr = NULL; xlator_t *xl = NULL; if (!THIS->ctx->mem_acct_enable) return CALLOC (nmemb, size); xl = THIS; req_size = nmemb * size; tot_size = req_size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE; ptr = calloc (1, tot_size); if (!ptr) { gf_msg_nomem ("", GF_LOG_ALERT, tot_size); return NULL; } gf_mem_set_acct_info (xl, &ptr, req_size, type, typestr); return (void *)ptr; }
void * __gf_realloc (void *ptr, size_t size) { size_t tot_size = 0; char *orig_ptr = NULL; xlator_t *xl = NULL; uint32_t type = 0; if (!gf_mem_acct_enable) return REALLOC (ptr, size); tot_size = size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE; orig_ptr = (char *)ptr - 8 - 4; GF_ASSERT (*(uint32_t *)orig_ptr == GF_MEM_HEADER_MAGIC); orig_ptr = orig_ptr - sizeof(xlator_t *); xl = *((xlator_t **)orig_ptr); orig_ptr = (char *)ptr - GF_MEM_HEADER_SIZE; type = *(uint32_t *)orig_ptr; ptr = realloc (orig_ptr, tot_size); if (!ptr) { gf_log_nomem ("", GF_LOG_ALERT, tot_size); return NULL; } gf_mem_set_acct_info (xl, (char **)&ptr, size, type); return (void *)ptr; }
static void test_gf_mem_set_acct_info_asserts(void **state) { xlator_t *xl; xlator_t xltest; char *alloc_ptr; size_t size; uint32_t type; memset(&xltest, 0, sizeof(xlator_t)); xl = (xlator_t *)0xBADD; alloc_ptr = (char *)0xBADD; size = 8196; type = 0; // Check xl is NULL expect_assert_failure( gf_mem_set_acct_info(NULL, &alloc_ptr, size, type, "")); // Check xl->mem_acct = NULL expect_assert_failure( gf_mem_set_acct_info(&xltest, &alloc_ptr, 0, type, "")); // Check type <= xl->mem_acct->num_types type = 100; expect_assert_failure( gf_mem_set_acct_info(&xltest, &alloc_ptr, 0, type, "")); // Check alloc is NULL assert_int_equal(-1, gf_mem_set_acct_info(&xltest, NULL, size, type, "")); // Initialize xl xl = helper_xlator_init(10); // Test number of types type = 100; assert_true(NULL != xl->mem_acct); assert_true(type > xl->mem_acct->num_types); expect_assert_failure(gf_mem_set_acct_info(xl, &alloc_ptr, size, type, "")); helper_xlator_destroy(xl); }
static void test_gf_mem_set_acct_info_memory(void **state) { xlator_t *xl; char *alloc_ptr; char *temp_ptr; size_t size; uint32_t type; const char *typestr = "TEST"; size = 8196; type = 9; // Initialize xl xl = helper_xlator_init(10); assert_null(xl->mem_acct.rec[type].typestr); // Test allocation temp_ptr = test_calloc(1, size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE); assert_non_null(temp_ptr); alloc_ptr = temp_ptr; gf_mem_set_acct_info(xl, &alloc_ptr, size, type, typestr); //Check values assert_ptr_equal(typestr, xl->mem_acct.rec[type].typestr); assert_int_equal(xl->mem_acct.rec[type].size, size); assert_int_equal(xl->mem_acct.rec[type].num_allocs, 1); assert_int_equal(xl->mem_acct.rec[type].total_allocs, 1); assert_int_equal(xl->mem_acct.rec[type].max_size, size); assert_int_equal(xl->mem_acct.rec[type].max_num_allocs, 1); // Check memory helper_check_memory_headers(temp_ptr, xl, size, type); // Check that alloc_ptr has been moved correctly // by gf_mem_set_acct_info { mem_header_t *p; p = (mem_header_t *)temp_ptr; p++; p->type = 1234; assert_int_equal(*(uint32_t *)alloc_ptr, p->type); } free(temp_ptr); helper_xlator_destroy(xl); }
void * __gf_realloc (void *ptr, size_t size) { size_t tot_size = 0; char *orig_ptr = NULL; xlator_t *xl = NULL; uint32_t type = 0; char *new_ptr; if (!THIS->ctx->mem_acct_enable) return REALLOC (ptr, size); REQUIRE(NULL != ptr); tot_size = size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE; orig_ptr = (char *)ptr - 8 - 4; GF_ASSERT (*(uint32_t *)orig_ptr == GF_MEM_HEADER_MAGIC); orig_ptr = orig_ptr - sizeof(xlator_t *); xl = *((xlator_t **)orig_ptr); orig_ptr = (char *)ptr - GF_MEM_HEADER_SIZE; type = *(uint32_t *)orig_ptr; new_ptr = realloc (orig_ptr, tot_size); if (!new_ptr) { gf_msg_nomem ("", GF_LOG_ALERT, tot_size); return NULL; } /* * We used to pass (char **)&ptr as the second * argument after the value of realloc was saved * in ptr, but the compiler warnings complained * about the casting to and forth from void ** to * char **. */ gf_mem_set_acct_info (xl, &new_ptr, size, type, NULL); return (void *)new_ptr; }
void * __gf_malloc (size_t size, uint32_t type) { size_t tot_size = 0; char *ptr = NULL; xlator_t *xl = NULL; if (!THIS->ctx->mem_acct_enable) return MALLOC (size); xl = THIS; tot_size = size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE; ptr = malloc (tot_size); if (!ptr) { gf_msg_nomem ("", GF_LOG_ALERT, tot_size); return NULL; } gf_mem_set_acct_info (xl, &ptr, size, type); return (void *)ptr; }