49 lines
1.4 KiB
C
49 lines
1.4 KiB
C
|
#include "ipc.h"
|
|||
|
|
|||
|
/**
|
|||
|
* PERFORMANCE POINT:
|
|||
|
* Realloc is performed at each new user. There is plenty of room for improvement,
|
|||
|
* for example by managing allocations of thousands of structures at once.
|
|||
|
* WARNING: Store and remove only pointers on allocated structures.
|
|||
|
*/
|
|||
|
struct ipc_error ipc_ctx_new_alloc (struct ipc_ctx *ctx)
|
|||
|
{
|
|||
|
ctx->size++;
|
|||
|
|
|||
|
// Memory could be not allocated, yet.
|
|||
|
if (ctx->size == 1 && ctx->cinfos == NULL && ctx->pollfd == NULL) {
|
|||
|
SECURE_BUFFER_HEAP_ALLOCATION_R (ctx->cinfos, sizeof (struct ipc_connection_info),,
|
|||
|
IPC_ERROR_ADD__MALLOC);
|
|||
|
SECURE_BUFFER_HEAP_ALLOCATION_R (ctx->pollfd, sizeof (struct pollfd),, IPC_ERROR_ADD__MALLOC_POLLFD);
|
|||
|
} else {
|
|||
|
ctx->cinfos = realloc (ctx->cinfos, sizeof (struct ipc_connection_info) * ctx->size);
|
|||
|
ctx->pollfd = realloc (ctx->pollfd, sizeof (struct pollfd ) * ctx->size);
|
|||
|
}
|
|||
|
|
|||
|
T_R ((ctx->cinfos == NULL), IPC_ERROR_ADD__EMPTY_LIST);
|
|||
|
T_R ((ctx->pollfd == NULL), IPC_ERROR_ADD__EMPTY_LIST);
|
|||
|
|
|||
|
// Clean the last entry.
|
|||
|
memset (&ctx->cinfos[ctx->size -1], 0, sizeof (struct ipc_connection_info));
|
|||
|
memset (&ctx->pollfd[ctx->size -1], 0, sizeof (struct pollfd));
|
|||
|
|
|||
|
IPC_RETURN_NO_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
void ipc_ctx_free (struct ipc_ctx *ctx)
|
|||
|
{
|
|||
|
if (ctx->cinfos != NULL) {
|
|||
|
free (ctx->cinfos);
|
|||
|
ctx->cinfos = NULL;
|
|||
|
}
|
|||
|
if (ctx->pollfd != NULL) {
|
|||
|
free (ctx->pollfd);
|
|||
|
ctx->pollfd = NULL;
|
|||
|
}
|
|||
|
ctx->size = 0;
|
|||
|
|
|||
|
ipc_switching_free(&ctx->switchdb);
|
|||
|
|
|||
|
ipc_messages_free (&ctx->tx);
|
|||
|
}
|