Commit a5daf25c authored by Geoff Simmons's avatar Geoff Simmons

trackrdrd: add DATA_Reset(), prevents spurious re-use of dataentry fields

parent b51d5512
......@@ -98,6 +98,21 @@ DATA_Init(void)
return(0);
}
void
DATA_Reset(dataentry *entry)
{
CHECK_OBJ_NOTNULL(entry, DATA_MAGIC);
entry->state = DATA_EMPTY;
entry->end = 0;
*entry->data = '\0';
entry->keylen = 0;
*entry->key = '\0';
entry->hasdata = false;
entry->incomplete = false;
entry->xid = 0;
entry->tid = 0;
}
/*
* take all free entries from the datatable for lockless
* allocation
......
......@@ -96,9 +96,10 @@ static char
printf("... testing worker initialization\n");
config.maxopen_scale = 10;
config.maxdone = 1024;
config.maxdata = 1024;
config.maxopen_scale = DEF_MAXOPEN_SCALE;
config.maxdone = DEF_MAXDONE;
config.maxdata = DEF_MAXDATA;
config.maxkeylen = DEF_MAXKEYLEN;
config.nworkers = NWORKERS;
strcpy(config.mq_config_file, MQ_CONFIG);
......@@ -145,7 +146,7 @@ static const char
sprintf(errmsg, "%d of %d worker threads running", wrk_running, NWORKERS);
mu_assert(errmsg, wrk_running == NWORKERS);
for (int i = 0; i < 1024; i++) {
for (int i = 0; i < (1 << DEF_MAXOPEN_SCALE); i++) {
entry = &dtbl.entry[i];
CHECK_OBJ_NOTNULL(entry, DATA_MAGIC);
entry->xid = xid;
......@@ -161,6 +162,24 @@ static const char
AZ(mqf.global_shutdown());
LOG_Close();
/*
* Verify DATA_Reset() by checking that all data entry fields are in
* empty states after worker threads are shut down.
*/
for (int i = 0; i < (1 << DEF_MAXOPEN_SCALE); i++) {
entry = &dtbl.entry[i];
CHECK_OBJ_NOTNULL(entry, DATA_MAGIC);
MASSERT(entry->state == DATA_EMPTY);
MAZ(entry->end);
MAZ(*entry->data);
MAZ(entry->keylen);
MAZ(*entry->key);
MASSERT(entry->hasdata == false);
MASSERT(entry->incomplete == false);
MAZ(entry->xid);
MAZ(entry->tid);
}
return NULL;
}
......
......@@ -192,6 +192,7 @@ typedef struct datatable_s datatable;
datatable dtbl;
int DATA_Init(void);
void DATA_Reset(dataentry *entry);
void DATA_Take_Freelist(struct freehead_s *dst);
void DATA_Return_Freelist(struct freehead_s *returned, unsigned nreturned);
void DATA_Dump1(dataentry *entry, int i);
......
......@@ -182,7 +182,7 @@ wrk_send(void **mq_worker, dataentry *entry, worker_data_t *wrk)
LOG_Log(LOG_DEBUG, "Worker %d: Successfully sent data [%.*s]", wrk->id,
entry->end, entry->data);
}
entry->state = DATA_EMPTY;
DATA_Reset(entry);
VSTAILQ_INSERT_TAIL(&wrk->wrk_freelist, entry, freelist);
wrk->wrk_nfree++;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment