inline static void* fill_prefix(char* ptr) { uint32_t handle = skynet_current_handle(); size_t size = je_malloc_usable_size(ptr); uint32_t *p = (uint32_t *)(ptr + size - sizeof(uint32_t)); memcpy(p, &handle, sizeof(handle)); update_xmalloc_stat_alloc(handle, size); return ptr; }
inline static void* fill_prefix(char* ptr) { uint32_t handle = skynet_current_handle(); size_t size = je_malloc_usable_size(ptr); struct mem_cookie *p = (struct mem_cookie *)(ptr + size - sizeof(struct mem_cookie)); memcpy(&p->handle, &handle, sizeof(handle)); #ifdef MEMORY_CHECK uint32_t dogtag = MEMORY_ALLOCTAG; memcpy(&p->dogtag, &dogtag, sizeof(dogtag)); #endif update_xmalloc_stat_alloc(handle, size); return ptr; }
inline static void* fill_prefix(char* ptr) { uint32_t handle = server_current_handle(); /* 函数是malloc_usable_size(),它返回在一个预先分配的内存块里你实际能使用的字节数。 这个值可能会比你最初请求的值要大,因为内存齐和最小内存分配值约束。 例如,如果你分配30字节,但是可使用的的大小是36,这意味着你可以向那块内存写入36个字节而 不会覆盖其它内存块。这是一个非常糟糕和依赖版本的编程实践,然而,请不要这要做。 malloc_usable_size()最有用的使用可能是作为一个调试工具。 例如,它能够在写入一个从外部传入的内存块之前,检查它的大小。 */ size_t size = malloc_usable_size(ptr); uint32_t *p = (uint32_t *)(ptr + size - sizeof(uint32_t)); memcpy(p, &handle, sizeof(handle)); update_xmalloc_stat_alloc(handle, size); return ptr; }