libfastcommon/src/fc_memory.h

98 lines
2.5 KiB
C

//fc_memory.h
#ifndef _FC_MEMORY_H
#define _FC_MEMORY_H
#include <stdlib.h>
#include "common_define.h"
#include "logger.h"
typedef void (*fc_memory_oom_notify_func)(const size_t curr_size);
#ifdef __cplusplus
extern "C" {
#endif
extern fc_memory_oom_notify_func g_oom_notify;
static inline void *fc_malloc_ex(const char *file,
const int line, size_t size)
{
void *ptr;
ptr = malloc(size);
if (ptr == NULL) {
logError("file: %s, line: %d, malloc %"PRId64" bytes fail, "
"errno: %d, error info: %s", file, line,
(int64_t)size, errno, STRERROR(errno));
if (g_oom_notify != NULL) {
g_oom_notify(size);
}
}
return ptr;
}
static inline void *fc_realloc_ex(const char *file,
const int line, void *ptr, size_t size)
{
void *new_ptr;
new_ptr = realloc(ptr, size);
if (new_ptr == NULL) {
logError("file: %s, line: %d, realloc %"PRId64" bytes fail, "
"errno: %d, error info: %s", file, line,
(int64_t)size, errno, STRERROR(errno));
if (g_oom_notify != NULL) {
g_oom_notify(size);
}
}
return new_ptr;
}
static inline char *fc_strdup_ex(const char *file,
const int line, const char *str)
{
char *output;
int len;
len = strlen(str);
output = (char *)fc_malloc_ex(file, line, len + 1);
if (output == NULL) {
return NULL;
}
if (len > 0) {
memcpy(output, str, len);
}
*(output + len) = '\0';
return output;
}
static inline void *fc_calloc_ex(const char *file,
const int line, size_t count, size_t size)
{
void *ptr;
ptr = calloc(count, size);
if (ptr == NULL) {
logError("file: %s, line: %d, malloc %"PRId64" bytes fail, "
"errno: %d, error info: %s", file, line,
(int64_t)(count * size), errno, STRERROR(errno));
if (g_oom_notify != NULL) {
g_oom_notify(count * size);
}
}
return ptr;
}
#define fc_malloc(size) fc_malloc_ex(__FILE__, __LINE__, size)
#define fc_realloc(ptr, size) fc_realloc_ex(__FILE__, __LINE__, ptr, size)
#define fc_calloc(count, size) fc_calloc_ex(__FILE__, __LINE__, count, size)
#define fc_strdup(str) fc_strdup_ex(__FILE__, __LINE__, str)
#ifdef __cplusplus
}
#endif
#endif