Add HashMap keyed by id for quick id lookups

This commit is contained in:
Stephen Seo 2019-03-12 13:49:14 +09:00
parent 05ece7c626
commit 78db1a58c7
2 changed files with 16 additions and 14 deletions

View file

@ -24,6 +24,7 @@ UDPC_Context* UDPC_init(uint16_t listenPort, uint32_t listenAddr, int isClient)
if(isClient != 0) context->flags |= 0x2; if(isClient != 0) context->flags |= 0x2;
context->threadFlags = 0; context->threadFlags = 0;
context->conMap = UDPC_HashMap_init(13, sizeof(UDPC_INTERNAL_ConnectionData)); context->conMap = UDPC_HashMap_init(13, sizeof(UDPC_INTERNAL_ConnectionData));
context->idMap = UDPC_HashMap_init(13, sizeof(UDPC_INTERNAL_ConnectionData*));
timespec_get(&context->lastUpdated, TIME_UTC); timespec_get(&context->lastUpdated, TIME_UTC);
context->atostrBuf[UDPC_ATOSTR_BUF_SIZE - 1] = 0; context->atostrBuf[UDPC_ATOSTR_BUF_SIZE - 1] = 0;
context->connectedEvents = UDPC_Deque_init( context->connectedEvents = UDPC_Deque_init(
@ -174,6 +175,7 @@ void UDPC_destroy(UDPC_Context *ctx)
CleanupSocket(ctx->socketHandle); CleanupSocket(ctx->socketHandle);
UDPC_HashMap_itercall(ctx->conMap, UDPC_INTERNAL_destroy_conMap, NULL); UDPC_HashMap_itercall(ctx->conMap, UDPC_INTERNAL_destroy_conMap, NULL);
UDPC_HashMap_destroy(ctx->conMap); UDPC_HashMap_destroy(ctx->conMap);
UDPC_HashMap_destroy(ctx->idMap);
UDPC_Deque_destroy(ctx->connectedEvents); UDPC_Deque_destroy(ctx->connectedEvents);
UDPC_Deque_destroy(ctx->disconnectedEvents); UDPC_Deque_destroy(ctx->disconnectedEvents);
@ -571,6 +573,10 @@ void UDPC_update(UDPC_Context *ctx)
} }
UDPC_Deque_destroy(cd->priorityPktQueue); UDPC_Deque_destroy(cd->priorityPktQueue);
if((cd->flags & 0x10) != 0)
{
UDPC_HashMap_remove(ctx->idMap, cd->id);
}
UDPC_HashMap_remove(ctx->conMap, *key); UDPC_HashMap_remove(ctx->conMap, *key);
} }
UDPC_Deque_destroy(us.removedQueue); UDPC_Deque_destroy(us.removedQueue);
@ -636,7 +642,7 @@ void UDPC_update(UDPC_Context *ctx)
UDPC_INTERNAL_atostr(ctx, receivedData.sin_addr.s_addr), UDPC_INTERNAL_atostr(ctx, receivedData.sin_addr.s_addr),
ntohs(receivedData.sin_port)); ntohs(receivedData.sin_port));
UDPC_INTERNAL_ConnectionData newCD = { UDPC_INTERNAL_ConnectionData newCD = {
0x9, 0x19,
UDPC_INTERNAL_generate_id(ctx), UDPC_INTERNAL_generate_id(ctx),
0, 0,
0, 0,
@ -655,6 +661,7 @@ void UDPC_update(UDPC_Context *ctx)
0.0f 0.0f
}; };
UDPC_HashMap_insert(ctx->conMap, newCD.addr, &newCD); UDPC_HashMap_insert(ctx->conMap, newCD.addr, &newCD);
UDPC_HashMap_insert(ctx->idMap, newCD.id, UDPC_HashMap_get(ctx->conMap, newCD.addr));
if(UDPC_Deque_get_available(ctx->connectedEvents) == 0) if(UDPC_Deque_get_available(ctx->connectedEvents) == 0)
{ {
UDPC_Deque_pop_front(ctx->connectedEvents, 4); UDPC_Deque_pop_front(ctx->connectedEvents, 4);
@ -673,6 +680,7 @@ void UDPC_update(UDPC_Context *ctx)
if(!cd) { return; } if(!cd) { return; }
cd->flags &= 0xFFFFFFF7; cd->flags &= 0xFFFFFFF7;
cd->flags |= 0x10;
cd->id = conID; cd->id = conID;
UDPC_INTERNAL_log(ctx, 2, "Got id %u from server %s", conID, UDPC_INTERNAL_log(ctx, 2, "Got id %u from server %s", conID,
UDPC_INTERNAL_atostr(ctx, receivedData.sin_addr.s_addr)); UDPC_INTERNAL_atostr(ctx, receivedData.sin_addr.s_addr));
@ -1450,21 +1458,15 @@ uint32_t UDPC_INTERNAL_generate_id(UDPC_Context *ctx)
while(newID == 0x10000000) while(newID == 0x10000000)
{ {
newID = rand() % 0x10000000; newID = rand() % 0x10000000;
UDPC_HashMap_itercall(ctx->conMap, UDPC_INTERNAL_check_ids, &newID); if(UDPC_HashMap_has(ctx->idMap, newID) != 0)
{
newID = 0x10000000;
}
} }
return newID; return newID;
} }
void UDPC_INTERNAL_check_ids(void *userData, uint32_t addr, char *data)
{
UDPC_INTERNAL_ConnectionData *cd = (UDPC_INTERNAL_ConnectionData*)data;
if(cd->id == *((uint32_t*)userData))
{
*((uint32_t*)userData) = 0x10000000;
}
}
uint32_t UDPC_strtoa(const char *addrStr) uint32_t UDPC_strtoa(const char *addrStr)
{ {
uint32_t addr = 0; uint32_t addr = 0;

View file

@ -75,7 +75,8 @@ typedef struct {
* 0x1 - trigger send * 0x1 - trigger send
* 0x2 - is good mode * 0x2 - is good mode
* 0x4 - is good rtt * 0x4 - is good rtt
* 0x8 - is id not set yet / initiating connection to server * 0x8 - initiating connection to server
* 0x10 - is id set
*/ */
uint32_t flags; uint32_t flags;
uint32_t id; uint32_t id;
@ -122,6 +123,7 @@ typedef struct {
mtx_t tflagsMtx; mtx_t tflagsMtx;
cnd_t threadCV; cnd_t threadCV;
UDPC_HashMap *conMap; UDPC_HashMap *conMap;
UDPC_HashMap *idMap;
struct timespec lastUpdated; struct timespec lastUpdated;
char atostrBuf[UDPC_ATOSTR_BUF_SIZE]; char atostrBuf[UDPC_ATOSTR_BUF_SIZE];
char recvBuf[UDPC_PACKET_MAX_SIZE]; char recvBuf[UDPC_PACKET_MAX_SIZE];
@ -306,8 +308,6 @@ char* UDPC_INTERNAL_atostr(UDPC_Context *ctx, uint32_t addr);
uint32_t UDPC_INTERNAL_generate_id(UDPC_Context *ctx); uint32_t UDPC_INTERNAL_generate_id(UDPC_Context *ctx);
void UDPC_INTERNAL_check_ids(void *userData, uint32_t addr, char *data);
/*1 /*1
* \brief Converts a IPV4 string to a 32-bit unsigned integer address in big-endian * \brief Converts a IPV4 string to a 32-bit unsigned integer address in big-endian
* \return 0 if string is invalid, address in big-endian format otherwise * \return 0 if string is invalid, address in big-endian format otherwise