Support custom memory allocators

This commit is contained in:
raysan5 2020-01-19 12:10:09 +01:00
parent d797bb3e1c
commit 1c4dadcf68
2 changed files with 41 additions and 30 deletions

View file

@ -447,7 +447,7 @@ static bool CreateSocket(SocketConfig *config, SocketResult *outresult)
{ {
case AF_INET: case AF_INET:
{ {
outresult->socket->addripv4 = (struct _SocketAddressIPv4 *) malloc( outresult->socket->addripv4 = (struct _SocketAddressIPv4 *) RNET_MALLOC(
sizeof(*outresult->socket->addripv4)); sizeof(*outresult->socket->addripv4));
if (outresult->socket->addripv4 != NULL) if (outresult->socket->addripv4 != NULL)
{ {
@ -470,7 +470,7 @@ static bool CreateSocket(SocketConfig *config, SocketResult *outresult)
break; break;
case AF_INET6: case AF_INET6:
{ {
outresult->socket->addripv6 = (struct _SocketAddressIPv6 *) malloc( outresult->socket->addripv6 = (struct _SocketAddressIPv6 *) RNET_MALLOC(
sizeof(*outresult->socket->addripv6)); sizeof(*outresult->socket->addripv6));
if (outresult->socket->addripv6 != NULL) if (outresult->socket->addripv6 != NULL)
{ {
@ -803,7 +803,7 @@ int ResolveHost(const char *address, const char *service, int addressType, int f
// If not address list was allocated, allocate it dynamically with the known address size // If not address list was allocated, allocate it dynamically with the known address size
if (outAddr == NULL) if (outAddr == NULL)
{ {
outAddr = (AddressInformation *) malloc(size * sizeof(AddressInformation)); outAddr = (AddressInformation *) RNET_MALLOC(size * sizeof(AddressInformation));
} }
// Dynamically allocate an array of address information structs // Dynamically allocate an array of address information structs
@ -975,7 +975,7 @@ bool SocketBind(SocketConfig *config, SocketResult *result)
// //
result->socket->addripv4 result->socket->addripv4
= (struct _SocketAddressIPv4 *) malloc(sizeof(*result->socket->addripv4)); = (struct _SocketAddressIPv4 *) RNET_MALLOC(sizeof(*result->socket->addripv4));
if (result->socket->addripv4 != NULL) if (result->socket->addripv4 != NULL)
{ {
memset(result->socket->addripv4, 0, sizeof(*result->socket->addripv4)); memset(result->socket->addripv4, 0, sizeof(*result->socket->addripv4));
@ -1228,7 +1228,7 @@ Socket *SocketAccept(Socket *server, SocketConfig *config)
case AF_INET: case AF_INET:
{ {
struct sockaddr_in *s = ((struct sockaddr_in *) &sock_addr); struct sockaddr_in *s = ((struct sockaddr_in *) &sock_addr);
sock->addripv4 = (struct _SocketAddressIPv4 *) malloc(sizeof(*sock->addripv4)); sock->addripv4 = (struct _SocketAddressIPv4 *) RNET_MALLOC(sizeof(*sock->addripv4));
if (sock->addripv4 != NULL) if (sock->addripv4 != NULL)
{ {
memset(sock->addripv4, 0, sizeof(*sock->addripv4)); memset(sock->addripv4, 0, sizeof(*sock->addripv4));
@ -1241,7 +1241,7 @@ Socket *SocketAccept(Socket *server, SocketConfig *config)
case AF_INET6: case AF_INET6:
{ {
struct sockaddr_in6 *s = ((struct sockaddr_in6 *) &sock_addr); struct sockaddr_in6 *s = ((struct sockaddr_in6 *) &sock_addr);
sock->addripv6 = (struct _SocketAddressIPv6 *) malloc(sizeof(*sock->addripv6)); sock->addripv6 = (struct _SocketAddressIPv6 *) RNET_MALLOC(sizeof(*sock->addripv6));
if (sock->addripv6 != NULL) if (sock->addripv6 != NULL)
{ {
memset(sock->addripv6, 0, sizeof(*sock->addripv6)); memset(sock->addripv6, 0, sizeof(*sock->addripv6));
@ -1321,11 +1321,11 @@ SocketDataPacket *AllocPacket(int size)
int error; int error;
error = 1; error = 1;
packet = (SocketDataPacket *) malloc(sizeof(*packet)); packet = (SocketDataPacket *) RNET_MALLOC(sizeof(*packet));
if (packet != NULL) if (packet != NULL)
{ {
packet->maxlen = size; packet->maxlen = size;
packet->data = (uint8_t *) malloc(size); packet->data = (uint8_t *) RNET_MALLOC(size);
if (packet->data != NULL) if (packet->data != NULL)
{ {
error = 0; error = 0;
@ -1343,10 +1343,10 @@ int ResizePacket(SocketDataPacket *packet, int newsize)
{ {
uint8_t *newdata; uint8_t *newdata;
newdata = (uint8_t *) malloc(newsize); newdata = (uint8_t *) RNET_MALLOC(newsize);
if (newdata != NULL) if (newdata != NULL)
{ {
free(packet->data); RNET_FREE(packet->data);
packet->data = newdata; packet->data = newdata;
packet->maxlen = newsize; packet->maxlen = newsize;
} }
@ -1357,8 +1357,8 @@ void FreePacket(SocketDataPacket *packet)
{ {
if (packet) if (packet)
{ {
free(packet->data); RNET_FREE(packet->data);
free(packet); RNET_FREE(packet);
} }
} }
@ -1371,7 +1371,7 @@ SocketDataPacket **AllocPacketList(int howmany, int size)
{ {
SocketDataPacket **packetV; SocketDataPacket **packetV;
packetV = (SocketDataPacket **) malloc((howmany + 1) * sizeof(*packetV)); packetV = (SocketDataPacket **) RNET_MALLOC((howmany + 1) * sizeof(*packetV));
if (packetV != NULL) if (packetV != NULL)
{ {
int i; int i;
@ -1403,7 +1403,7 @@ void FreePacketList(SocketDataPacket **packetV)
{ {
FreePacket(packetV[i]); FreePacket(packetV[i]);
} }
free(packetV); RNET_FREE(packetV);
} }
} }
@ -1628,13 +1628,13 @@ bool IsSocketConnected(Socket *sock)
SocketResult *AllocSocketResult() SocketResult *AllocSocketResult()
{ {
struct SocketResult *res; struct SocketResult *res;
res = (struct SocketResult *) malloc(sizeof(*res)); res = (struct SocketResult *) RNET_MALLOC(sizeof(*res));
if (res != NULL) if (res != NULL)
{ {
memset(res, 0, sizeof(*res)); memset(res, 0, sizeof(*res));
if ((res->socket = AllocSocket()) == NULL) if ((res->socket = AllocSocket()) == NULL)
{ {
free(res); RNET_FREE(res);
res = NULL; res = NULL;
} }
} }
@ -1650,7 +1650,7 @@ void FreeSocketResult(SocketResult **result)
{ {
FreeSocket(&((*result)->socket)); FreeSocket(&((*result)->socket));
} }
free(*result); RNET_FREE(*result);
*result = NULL; *result = NULL;
} }
} }
@ -1660,7 +1660,7 @@ Socket *AllocSocket()
{ {
// Allocate a socket if one already hasn't been // Allocate a socket if one already hasn't been
struct Socket *sock; struct Socket *sock;
sock = (Socket *) malloc(sizeof(*sock)); sock = (Socket *) RNET_MALLOC(sizeof(*sock));
if (sock != NULL) if (sock != NULL)
{ {
memset(sock, 0, sizeof(*sock)); memset(sock, 0, sizeof(*sock));
@ -1670,7 +1670,7 @@ Socket *AllocSocket()
TraceLog( TraceLog(
LOG_WARNING, "Ran out of memory attempting to allocate a socket"); LOG_WARNING, "Ran out of memory attempting to allocate a socket");
SocketClose(sock); SocketClose(sock);
free(sock); RNET_FREE(sock);
sock = NULL; sock = NULL;
} }
return sock; return sock;
@ -1681,7 +1681,7 @@ void FreeSocket(Socket **sock)
{ {
if (*sock != NULL) if (*sock != NULL)
{ {
free(*sock); RNET_FREE(*sock);
*sock = NULL; *sock = NULL;
} }
} }
@ -1692,12 +1692,12 @@ SocketSet *AllocSocketSet(int max)
struct SocketSet *set; struct SocketSet *set;
int i; int i;
set = (struct SocketSet *) malloc(sizeof(*set)); set = (struct SocketSet *) RNET_MALLOC(sizeof(*set));
if (set != NULL) if (set != NULL)
{ {
set->numsockets = 0; set->numsockets = 0;
set->maxsockets = max; set->maxsockets = max;
set->sockets = (struct Socket **) malloc(max * sizeof(*set->sockets)); set->sockets = (struct Socket **) RNET_MALLOC(max * sizeof(*set->sockets));
if (set->sockets != NULL) if (set->sockets != NULL)
{ {
for (i = 0; i < max; ++i) for (i = 0; i < max; ++i)
@ -1707,7 +1707,7 @@ SocketSet *AllocSocketSet(int max)
} }
else else
{ {
free(set); RNET_FREE(set);
set = NULL; set = NULL;
} }
} }
@ -1719,8 +1719,8 @@ void FreeSocketSet(SocketSet *set)
{ {
if (set) if (set)
{ {
free(set->sockets); RNET_FREE(set->sockets);
free(set); RNET_FREE(set);
} }
} }
@ -1830,10 +1830,10 @@ int CheckSockets(SocketSet *set, unsigned int timeout)
AddressInformation AllocAddress() AddressInformation AllocAddress()
{ {
AddressInformation addressInfo = NULL; AddressInformation addressInfo = NULL;
addressInfo = (AddressInformation) calloc(1, sizeof(*addressInfo)); addressInfo = (AddressInformation) RNET_CALLOC(1, sizeof(*addressInfo));
if (addressInfo != NULL) if (addressInfo != NULL)
{ {
addressInfo->addr.ai_addr = (struct sockaddr *) calloc(1, sizeof(struct sockaddr)); addressInfo->addr.ai_addr = (struct sockaddr *) RNET_CALLOC(1, sizeof(struct sockaddr));
if (addressInfo->addr.ai_addr == NULL) if (addressInfo->addr.ai_addr == NULL)
{ {
TraceLog(LOG_WARNING, TraceLog(LOG_WARNING,
@ -1855,10 +1855,10 @@ void FreeAddress(AddressInformation *addressInfo)
{ {
if ((*addressInfo)->addr.ai_addr != NULL) if ((*addressInfo)->addr.ai_addr != NULL)
{ {
free((*addressInfo)->addr.ai_addr); RNET_FREE((*addressInfo)->addr.ai_addr);
(*addressInfo)->addr.ai_addr = NULL; (*addressInfo)->addr.ai_addr = NULL;
} }
free(*addressInfo); RNET_FREE(*addressInfo);
*addressInfo = NULL; *addressInfo = NULL;
} }
} }
@ -1867,7 +1867,7 @@ void FreeAddress(AddressInformation *addressInfo)
AddressInformation *AllocAddressList(int size) AddressInformation *AllocAddressList(int size)
{ {
AddressInformation *addr; AddressInformation *addr;
addr = (AddressInformation *) malloc(size * sizeof(AddressInformation)); addr = (AddressInformation *) RNET_MALLOC(size * sizeof(AddressInformation));
return addr; return addr;
} }

View file

@ -91,6 +91,17 @@
#define NOMCX // Modem Configuration Extensions #define NOMCX // Modem Configuration Extensions
#define MMNOSOUND #define MMNOSOUND
// Allow custom memory allocators
#ifndef RNET_MALLOC
#define RNET_MALLOC(sz) malloc(sz)
#endif
#ifndef RNET_CALLOC
#define RNET_CALLOC(n,sz) calloc(n,sz)
#endif
#ifndef RNET_FREE
#define RNET_FREE(p) free(p)
#endif
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Platform type definitions // Platform type definitions
// From: https://github.com/DFHack/clsocket/blob/master/src/Host.h // From: https://github.com/DFHack/clsocket/blob/master/src/Host.h