mirror of
				https://github.com/CPunch/Laika.git
				synced 2025-11-03 20:10:33 +00:00 
			
		
		
		
	lmem.h: new laikaM_*Vector macros
- these will slowly replace laikaM_*array - lpeer.[ch] has been migrated
This commit is contained in:
		@@ -455,7 +455,7 @@ bool laikaC_iterPeersNext(struct sLaika_cnc *cnc, size_t *i, struct sLaika_peer
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    tCNC_PeerHashElem *elem;
 | 
					    tCNC_PeerHashElem *elem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (hashmap_iter(cnc->peers, i, (void *)&elem)) {
 | 
					    if (hashmap_iter(cnc->peers, i, (void **)&elem)) {
 | 
				
			||||||
        *peer = elem->peer;
 | 
					        *peer = elem->peer;
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,44 @@
 | 
				
			|||||||
#define laikaM_malloc(sz) laikaM_realloc(NULL, sz)
 | 
					#define laikaM_malloc(sz) laikaM_realloc(NULL, sz)
 | 
				
			||||||
#define laikaM_free(buf)  laikaM_realloc(buf, 0)
 | 
					#define laikaM_free(buf)  laikaM_realloc(buf, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ========================================[[ Vectors ]]======================================== */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define laikaM_countVector(name) name##_COUNT
 | 
				
			||||||
 | 
					#define laikaM_capVector(name)   name##_CAP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define laikaM_newVector(type, name)                                                               \
 | 
				
			||||||
 | 
					    type *name;                                                                                    \
 | 
				
			||||||
 | 
					    int name##_COUNT;                                                                              \
 | 
				
			||||||
 | 
					    int name##_CAP;
 | 
				
			||||||
 | 
					#define laikaM_initVector(name, startCap)                                                          \
 | 
				
			||||||
 | 
					    name = NULL;                                                                                   \
 | 
				
			||||||
 | 
					    name##_COUNT = 0;                                                                              \
 | 
				
			||||||
 | 
					    name##_CAP = startCap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define laikaM_growVector(type, name, needed)                                                      \
 | 
				
			||||||
 | 
					    if (name##_COUNT + needed >= name##_CAP || name == NULL) {                                     \
 | 
				
			||||||
 | 
					        name##_CAP = (name##_CAP + needed) * GROW_FACTOR;                                          \
 | 
				
			||||||
 | 
					        name = (type *)laikaM_realloc(name, sizeof(type) * name##_CAP);                            \
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* moves vector elements above indx down by numElem, removing numElem elements at indx */
 | 
				
			||||||
 | 
					#define laikaM_rmvVector(name, indx, numElem)                                                      \
 | 
				
			||||||
 | 
					    do {                                                                                           \
 | 
				
			||||||
 | 
					        int _i, _sz = ((name##_COUNT - indx) - numElem);                                           \
 | 
				
			||||||
 | 
					        for (_i = 0; _i < _sz; _i++)                                                               \
 | 
				
			||||||
 | 
					            name[indx + _i] = name[indx + numElem + _i];                                           \
 | 
				
			||||||
 | 
					        name##_COUNT -= numElem;                                                                   \
 | 
				
			||||||
 | 
					    } while (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* moves vector elements above indx up by numElem, inserting numElem elements at indx */
 | 
				
			||||||
 | 
					#define laikaM_insertVector(name, indx, numElem)                                                   \
 | 
				
			||||||
 | 
					    do {                                                                                           \
 | 
				
			||||||
 | 
					        int _i;                                                                                    \
 | 
				
			||||||
 | 
					        for (_i = name##_COUNT; _i > indx; _i--)                                                   \
 | 
				
			||||||
 | 
					            name[_i] = name[_i - 1];                                                               \
 | 
				
			||||||
 | 
					        name##_COUNT += numElem;                                                                   \
 | 
				
			||||||
 | 
					    } while (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define laikaM_growarray(type, buf, needed, count, capacity)                                       \
 | 
					#define laikaM_growarray(type, buf, needed, count, capacity)                                       \
 | 
				
			||||||
    if (count + needed >= capacity || buf == NULL) {                                               \
 | 
					    if (count + needed >= capacity || buf == NULL) {                                               \
 | 
				
			||||||
        capacity = (capacity + needed) * GROW_FACTOR;                                              \
 | 
					        capacity = (capacity + needed) * GROW_FACTOR;                                              \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
#include "hashmap.h"
 | 
					#include "hashmap.h"
 | 
				
			||||||
#include "laika.h"
 | 
					#include "laika.h"
 | 
				
			||||||
#include "lsocket.h"
 | 
					#include "lsocket.h"
 | 
				
			||||||
 | 
					#include "lmem.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -20,22 +21,16 @@ struct sLaika_pollEvent
 | 
				
			|||||||
struct sLaika_pollList
 | 
					struct sLaika_pollList
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    struct hashmap *sockets;
 | 
					    struct hashmap *sockets;
 | 
				
			||||||
    struct sLaika_socket **outQueue; /* holds sockets which have data needed to be sent */
 | 
					    laikaM_newVector(struct sLaika_socket *, outQueue); /* holds sockets which have data needed to be sent */
 | 
				
			||||||
    struct sLaika_pollEvent *revents;
 | 
					    laikaM_newVector(struct sLaika_pollEvent, revents);
 | 
				
			||||||
#ifdef LAIKA_USE_EPOLL
 | 
					#ifdef LAIKA_USE_EPOLL
 | 
				
			||||||
    /* epoll */
 | 
					    /* epoll */
 | 
				
			||||||
    struct epoll_event ev, ep_events[MAX_EPOLL_EVENTS];
 | 
					    struct epoll_event ev, ep_events[MAX_EPOLL_EVENTS];
 | 
				
			||||||
    SOCKET epollfd;
 | 
					    SOCKET epollfd;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    /* raw poll descriptor */
 | 
					    /* raw poll descriptor */
 | 
				
			||||||
    PollFD *fds;
 | 
					    laikaM_newVector(PollFD, fds);
 | 
				
			||||||
    int fdCapacity;
 | 
					 | 
				
			||||||
    int fdCount;
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    int reventCap;
 | 
					 | 
				
			||||||
    int reventCount;
 | 
					 | 
				
			||||||
    int outCap;
 | 
					 | 
				
			||||||
    int outCount;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void laikaP_initPList(struct sLaika_pollList *pList);
 | 
					void laikaP_initPList(struct sLaika_pollList *pList);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,12 +34,10 @@ void laikaP_initPList(struct sLaika_pollList *pList)
 | 
				
			|||||||
    /* setup hashmap */
 | 
					    /* setup hashmap */
 | 
				
			||||||
    pList->sockets = hashmap_new(sizeof(tLaika_hashMapElem), POLLSTARTCAP, 0, 0, elem_hash,
 | 
					    pList->sockets = hashmap_new(sizeof(tLaika_hashMapElem), POLLSTARTCAP, 0, 0, elem_hash,
 | 
				
			||||||
                                 elem_compare, NULL, NULL);
 | 
					                                 elem_compare, NULL, NULL);
 | 
				
			||||||
    pList->revents = NULL; /* laikaP_pollList() will allocate the buffer */
 | 
					
 | 
				
			||||||
    pList->reventCap = POLLSTARTCAP / GROW_FACTOR;
 | 
					    /* laikaP_pollList() will allocate these buffer */
 | 
				
			||||||
    pList->reventCount = 0;
 | 
					    laikaM_initVector(pList->revents, POLLSTARTCAP / GROW_FACTOR);
 | 
				
			||||||
    pList->outQueue = NULL;
 | 
					    laikaM_initVector(pList->outQueue, POLLSTARTCAP / GROW_FACTOR);
 | 
				
			||||||
    pList->outCap = POLLSTARTCAP / GROW_FACTOR;
 | 
					 | 
				
			||||||
    pList->outCount = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LAIKA_USE_EPOLL
 | 
					#ifdef LAIKA_USE_EPOLL
 | 
				
			||||||
    /* setup our epoll */
 | 
					    /* setup our epoll */
 | 
				
			||||||
@@ -48,11 +46,8 @@ void laikaP_initPList(struct sLaika_pollList *pList)
 | 
				
			|||||||
        LAIKA_ERROR("epoll_create() failed!\n");
 | 
					        LAIKA_ERROR("epoll_create() failed!\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    pList->fds = NULL; /* laikaP_addSock will allocate the buffer */
 | 
					    /* laikaP_addSock will allocate this buffer */
 | 
				
			||||||
    pList->fdCapacity =
 | 
					    laikaM_initVector(pList->fds, POLLSTARTCAP / GROW_FACTOR);
 | 
				
			||||||
        POLLSTARTCAP /
 | 
					 | 
				
			||||||
        GROW_FACTOR; /* div by GROW_FACTOR since laikaM_growarray multiplies by GROW_FACTOR */
 | 
					 | 
				
			||||||
    pList->fdCount = 0;
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -85,8 +80,8 @@ void laikaP_addSock(struct sLaika_pollList *pList, struct sLaika_socket *sock)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    /* allocate space in array & add PollFD */
 | 
					    /* allocate space in array & add PollFD */
 | 
				
			||||||
    laikaM_growarray(PollFD, pList->fds, 1, pList->fdCount, pList->fdCapacity);
 | 
					    laikaM_growVector(PollFD, pList->fds, 1);
 | 
				
			||||||
    pList->fds[pList->fdCount++] = (PollFD){sock->sock, POLLIN};
 | 
					    pList->fds[laikaM_countVector(pList->fds)++] = (PollFD){sock->sock, POLLIN};
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -98,9 +93,9 @@ void laikaP_rmvSock(struct sLaika_pollList *pList, struct sLaika_socket *sock)
 | 
				
			|||||||
    hashmap_delete(pList->sockets, &(tLaika_hashMapElem){.fd = sock->sock, .sock = sock});
 | 
					    hashmap_delete(pList->sockets, &(tLaika_hashMapElem){.fd = sock->sock, .sock = sock});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* make sure peer isn't in outQueue */
 | 
					    /* make sure peer isn't in outQueue */
 | 
				
			||||||
    for (i = 0; i < pList->outCount; i++) {
 | 
					    for (i = 0; i < laikaM_countVector(pList->outQueue); i++) {
 | 
				
			||||||
        if ((void *)pList->outQueue[i] == (void *)sock) {
 | 
					        if ((void *)pList->outQueue[i] == (void *)sock) {
 | 
				
			||||||
            laikaM_rmvarray(pList->outQueue, pList->outCount, i, 1);
 | 
					            laikaM_rmvVector(pList->outQueue, i, 1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -114,10 +109,10 @@ void laikaP_rmvSock(struct sLaika_pollList *pList, struct sLaika_socket *sock)
 | 
				
			|||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* search fds for socket, remove it and shrink array */
 | 
					    /* search fds for socket, remove it and shrink array */
 | 
				
			||||||
    for (i = 0; i < pList->fdCount; i++) {
 | 
					    for (i = 0; i < laikaM_countVector(pList->fds); i++) {
 | 
				
			||||||
        if (pList->fds[i].fd == sock->sock) {
 | 
					        if (pList->fds[i].fd == sock->sock) {
 | 
				
			||||||
            /* remove from array */
 | 
					            /* remove from array */
 | 
				
			||||||
            laikaM_rmvarray(pList->fds, pList->fdCount, i, 1);
 | 
					            laikaM_rmvVector(pList->fds, i, 1);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -140,7 +135,7 @@ void laikaP_addPollOut(struct sLaika_pollList *pList, struct sLaika_socket *sock
 | 
				
			|||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* search fds for socket, add POLLOUT flag */
 | 
					    /* search fds for socket, add POLLOUT flag */
 | 
				
			||||||
    for (i = 0; i < pList->fdCount; i++) {
 | 
					    for (i = 0; i < laikaM_countVector(pList->fds); i++) {
 | 
				
			||||||
        if (pList->fds[i].fd == sock->sock) {
 | 
					        if (pList->fds[i].fd == sock->sock) {
 | 
				
			||||||
            pList->fds[i].events = POLLIN | POLLOUT;
 | 
					            pList->fds[i].events = POLLIN | POLLOUT;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
@@ -167,7 +162,7 @@ void laikaP_rmvPollOut(struct sLaika_pollList *pList, struct sLaika_socket *sock
 | 
				
			|||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* search fds for socket, remove POLLOUT flag */
 | 
					    /* search fds for socket, remove POLLOUT flag */
 | 
				
			||||||
    for (i = 0; i < pList->fdCount; i++) {
 | 
					    for (i = 0; i < laikaM_countVector(pList->fds); i++) {
 | 
				
			||||||
        if (pList->fds[i].fd == sock->sock) {
 | 
					        if (pList->fds[i].fd == sock->sock) {
 | 
				
			||||||
            pList->fds[i].events = POLLIN;
 | 
					            pList->fds[i].events = POLLIN;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
@@ -183,18 +178,18 @@ void laikaP_pushOutQueue(struct sLaika_pollList *pList, struct sLaika_socket *so
 | 
				
			|||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* first, check that we don't have this peer in the queue already */
 | 
					    /* first, check that we don't have this peer in the queue already */
 | 
				
			||||||
    for (i = 0; i < pList->outCount; i++) {
 | 
					    for (i = 0; i < laikaM_countVector(pList->outQueue); i++) {
 | 
				
			||||||
        if (pList->outQueue[i] == sock)
 | 
					        if (pList->outQueue[i] == sock)
 | 
				
			||||||
            return; /* found it :) */
 | 
					            return; /* found it :) */
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    laikaM_growarray(struct sLaika_socket *, pList->outQueue, 1, pList->outCount, pList->outCap);
 | 
					    laikaM_growVector(struct sLaika_socket *, pList->outQueue, 1);
 | 
				
			||||||
    pList->outQueue[pList->outCount++] = sock;
 | 
					    pList->outQueue[laikaM_countVector(pList->outQueue)++] = sock;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void laikaP_resetOutQueue(struct sLaika_pollList *pList)
 | 
					void laikaP_resetOutQueue(struct sLaika_pollList *pList)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    pList->outCount = 0; /* ez lol */
 | 
					    laikaM_countVector(pList->outQueue) = 0; /* ez lol */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void laikaP_flushOutQueue(struct sLaika_pollList *pList)
 | 
					void laikaP_flushOutQueue(struct sLaika_pollList *pList)
 | 
				
			||||||
@@ -203,7 +198,7 @@ void laikaP_flushOutQueue(struct sLaika_pollList *pList)
 | 
				
			|||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* flush pList's outQueue */
 | 
					    /* flush pList's outQueue */
 | 
				
			||||||
    for (i = 0; i < pList->outCount; i++) {
 | 
					    for (i = 0; i < laikaM_countVector(pList->outQueue); i++) {
 | 
				
			||||||
        sock = pList->outQueue[i];
 | 
					        sock = pList->outQueue[i];
 | 
				
			||||||
        LAIKA_DEBUG("sending OUT to %p\n", sock);
 | 
					        LAIKA_DEBUG("sending OUT to %p\n", sock);
 | 
				
			||||||
        if (sock->onPollOut && !sock->onPollOut(sock) && sock->onPollFail)
 | 
					        if (sock->onPollOut && !sock->onPollOut(sock) && sock->onPollFail)
 | 
				
			||||||
@@ -216,7 +211,7 @@ struct sLaika_pollEvent *laikaP_poll(struct sLaika_pollList *pList, int timeout,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    int nEvents, i;
 | 
					    int nEvents, i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pList->reventCount = 0; /* reset revent array */
 | 
					    laikaM_countVector(pList->revents) = 0; /* reset revent array */
 | 
				
			||||||
#ifdef LAIKA_USE_EPOLL
 | 
					#ifdef LAIKA_USE_EPOLL
 | 
				
			||||||
    /* fastpath: we store the sLaika_socket* pointer directly in the epoll_data_t, saving us a
 | 
					    /* fastpath: we store the sLaika_socket* pointer directly in the epoll_data_t, saving us a
 | 
				
			||||||
       lookup into our socket hashmap not to mention the various improvements epoll() has over
 | 
					       lookup into our socket hashmap not to mention the various improvements epoll() has over
 | 
				
			||||||
@@ -229,9 +224,8 @@ struct sLaika_pollEvent *laikaP_poll(struct sLaika_pollList *pList, int timeout,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < nEvents; i++) {
 | 
					    for (i = 0; i < nEvents; i++) {
 | 
				
			||||||
        /* add event to revent array */
 | 
					        /* add event to revent array */
 | 
				
			||||||
        laikaM_growarray(struct sLaika_pollEvent, pList->revents, 1, pList->reventCount,
 | 
					        laikaM_growVector(struct sLaika_pollEvent, pList->revents, 1);
 | 
				
			||||||
                         pList->reventCap);
 | 
					        pList->revents[laikaM_countVector(pList->revents)++] =
 | 
				
			||||||
        pList->revents[pList->reventCount++] =
 | 
					 | 
				
			||||||
            (struct sLaika_pollEvent){.sock = pList->ep_events[i].data.ptr,
 | 
					            (struct sLaika_pollEvent){.sock = pList->ep_events[i].data.ptr,
 | 
				
			||||||
                                      .pollIn = pList->ep_events[i].events & EPOLLIN,
 | 
					                                      .pollIn = pList->ep_events[i].events & EPOLLIN,
 | 
				
			||||||
                                      .pollOut = pList->ep_events[i].events & EPOLLOUT};
 | 
					                                      .pollOut = pList->ep_events[i].events & EPOLLOUT};
 | 
				
			||||||
@@ -252,9 +246,8 @@ struct sLaika_pollEvent *laikaP_poll(struct sLaika_pollList *pList, int timeout,
 | 
				
			|||||||
                pList->sockets, &(tLaika_hashMapElem){.fd = (SOCKET)pfd.fd});
 | 
					                pList->sockets, &(tLaika_hashMapElem){.fd = (SOCKET)pfd.fd});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            /* insert event into revents array */
 | 
					            /* insert event into revents array */
 | 
				
			||||||
            laikaM_growarray(struct sLaika_pollEvent, pList->revents, 1, pList->reventCount,
 | 
					            laikaM_growVector(struct sLaika_pollEvent, pList->revents, 1);
 | 
				
			||||||
                             pList->reventCap);
 | 
					            pList->revents[laikaM_countVector(pList->revents)++] =
 | 
				
			||||||
            pList->revents[pList->reventCount++] =
 | 
					 | 
				
			||||||
                (struct sLaika_pollEvent){.sock = elem->sock,
 | 
					                (struct sLaika_pollEvent){.sock = elem->sock,
 | 
				
			||||||
                                          .pollIn = pfd.revents & POLLIN,
 | 
					                                          .pollIn = pfd.revents & POLLIN,
 | 
				
			||||||
                                          .pollOut = pfd.revents & POLLOUT};
 | 
					                                          .pollOut = pfd.revents & POLLOUT};
 | 
				
			||||||
@@ -264,7 +257,7 @@ struct sLaika_pollEvent *laikaP_poll(struct sLaika_pollList *pList, int timeout,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *_nevents = pList->reventCount;
 | 
					    *_nevents = laikaM_countVector(pList->revents);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* return revents array */
 | 
					    /* return revents array */
 | 
				
			||||||
    return pList->revents;
 | 
					    return pList->revents;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user