Lectura de código fuente Libevent, gestión de 2 memorias

No construyas plataformas altas sobre arena flotante

El proceso de lectura es
principalmente para consultar el manual de referencia de libevent y leer el
enlace del código fuente de acuerdo con el orden del módulo introducido
http://www.cppblog.com/mysileng/archive/2013/02/04/197717.html

Operación de memoria

void event_set_mem_functions(
	void *(*malloc_fn)(size_t sz),
	void *(*realloc_fn)(void *ptr, size_t sz),
	void (*free_fn)(void *ptr))
{
    
    
	_mm_malloc_fn = malloc_fn;//内存分配
	_mm_realloc_fn = realloc_fn;//内存重分配
	_mm_free_fn = free_fn;//内存释放
}#ifndef _EVENT_DISABLE_MM_REPLACEMENT
static void *(*_mm_malloc_fn)(size_t sz) = NULL;
static void *(*_mm_realloc_fn)(void *p, size_t sz) = NULL;
static void (*_mm_free_fn)(void *p) = NULL;
三个回调对象。

Al llamar a esta función, configurar nuestra función de operación de memoria personalizada como parámetro puede reemplazar la función de ranura de operación de memoria predeterminada de libevent.
Función de operación específica de memoria:

void *
event_mm_malloc_(size_t sz)//申请内存
{
    
    
	if (_mm_malloc_fn)
		return _mm_malloc_fn(sz);
	else
		return malloc(sz);//可以看到libevent默认使用
		//malloc函数来分配内存
}
void *
event_mm_calloc_(size_t count, size_t size)
{
    
    
	if (_mm_malloc_fn) {
    
    
		size_t sz = count * size;
		void *p = _mm_malloc_fn(sz);
		if (p)
			memset(p, 0, sz);
		return p;
	} else
		return calloc(count, size);
}
void *
event_mm_realloc_(void *ptr, size_t sz)
{
    
    
//重新调整之前分配的内存
	if (_mm_realloc_fn)
		return _mm_realloc_fn(ptr, sz);
	else
		return realloc(ptr, sz);
}
void
event_mm_free_(void *ptr)
{
    
    
	if (_mm_free_fn)
		_mm_free_fn(ptr);
	else
		free(ptr);
}

Como puede ver en el código anterior, si el usuario no tiene una función de operación de memoria personalizada, libevent usa funciones del sistema C para realizar operaciones de memoria.
Recomendación: cuando utilice funciones de manipulación de memoria personalizadas, considere la sincronización en un entorno multiproceso. Para no cometer errores

Puntos a tener en cuenta al utilizar funciones de operación de memoria personalizadas

La función de administración de memoria de reemplazo afecta todas las operaciones posteriores de asignación, cambio de tamaño y liberación de libevent. Por lo tanto, debe asegurarse de reemplazarlo antes de llamar a cualquier otra función de libevent. De lo contrario, libevent puede usar su función gratuita para liberar la memoria asignada con malloc de la biblioteca C.
El bloque de memoria devuelto por sus funciones malloc y realloc debe tener la misma alineación de direcciones que el bloque de memoria devuelto por la biblioteca C.
Tu función realloc debe manejar correctamente realloc (NULL, sz) (es decir, como malloc (sz)).
Tu función realloc debe manejar correctamente realloc (ptr, 0) (es decir, como free (ptr))
. La función libre lo hace no tiene que lidiar con free (NULL).
Su función malloc no tiene que lidiar con malloc (0).
Si usa libevent en múltiples subprocesos, la función de administración de memoria alternativa debe ser segura para subprocesos.
Libevent utilizará estas funciones para asignar la memoria que se le devuelva. Por lo tanto, si desea liberar la memoria asignada y devuelta por la función libevent, y ha reemplazado las funciones malloc y realloc, debe usar la función libre alternativa.

Supongo que te gusta

Origin blog.csdn.net/weixin_39308337/article/details/107589029
Recomendado
Clasificación