Browse Source

Recycle used client structs instead of freeing them

master
Con Kolivas 10 years ago
parent
commit
9706b52965
  1. 33
      src/stratifier.c

33
src/stratifier.c

@ -326,6 +326,7 @@ struct stratifier_data {
* is sorted by enonce1_64. */ * is sorted by enonce1_64. */
stratum_instance_t *stratum_instances; stratum_instance_t *stratum_instances;
stratum_instance_t *disconnected_instances; stratum_instance_t *disconnected_instances;
stratum_instance_t *recycled_instances;
int stratum_generated; int stratum_generated;
int disconnected_generated; int disconnected_generated;
@ -905,18 +906,21 @@ static void update_base(ckpool_t *ckp, const int prio)
create_pthread(pth, do_update, ur); create_pthread(pth, do_update, ur);
} }
static void __kill_instance(stratum_instance_t *client) /* Instead of removing the client instance, we add it to a list of recycled
* clients allowing us to reuse it instead of callocing a new one */
static void __kill_instance(sdata_t *sdata, stratum_instance_t *client)
{ {
free(client->workername); free(client->workername);
free(client->useragent); free(client->useragent);
free(client); memset(client, 0, sizeof(stratum_instance_t));
DL_APPEND(sdata->recycled_instances, client);
} }
static void __del_disconnected(sdata_t *sdata, stratum_instance_t *client) static void __del_disconnected(sdata_t *sdata, stratum_instance_t *client)
{ {
HASH_DEL(sdata->disconnected_instances, client); HASH_DEL(sdata->disconnected_instances, client);
sdata->stats.disconnected--; sdata->stats.disconnected--;
__kill_instance(client); __kill_instance(sdata, client);
} }
/* Removes a client instance we know is on the stratum_instances list and from /* Removes a client instance we know is on the stratum_instances list and from
@ -941,7 +945,7 @@ static void drop_allclients(ckpool_t *ckp)
if (!client->ref) { if (!client->ref) {
__del_client(sdata, client, client->user_instance); __del_client(sdata, client, client->user_instance);
__kill_instance(client); __kill_instance(sdata, client);
} else } else
client->dropped = true; client->dropped = true;
kills++; kills++;
@ -1215,7 +1219,7 @@ static int __drop_client(sdata_t *sdata, stratum_instance_t *client, user_instan
ret = 2; ret = 2;
else else
ret = 3; ret = 3;
__kill_instance(client); __kill_instance(sdata, client);
} }
return ret; return ret;
} }
@ -1268,13 +1272,28 @@ static void _dec_instance_ref(sdata_t *sdata, stratum_instance_t *client, const
#define dec_instance_ref(sdata, instance) _dec_instance_ref(sdata, instance, __FILE__, __func__, __LINE__) #define dec_instance_ref(sdata, instance) _dec_instance_ref(sdata, instance, __FILE__, __func__, __LINE__)
/* If we have a no longer used stratum instance in the recycled linked list,
* use that, otherwise calloc a fresh one. */
static stratum_instance_t *__recruit_stratum_instance(sdata_t *sdata)
{
stratum_instance_t *client = sdata->recycled_instances;
if (client)
DL_DELETE(sdata->recycled_instances, client);
else {
client = ckzalloc(sizeof(stratum_instance_t));
sdata->stratum_generated++;
}
return client;
}
/* Enter with write instance_lock held */ /* Enter with write instance_lock held */
static stratum_instance_t *__stratum_add_instance(ckpool_t *ckp, const int64_t id, const int server) static stratum_instance_t *__stratum_add_instance(ckpool_t *ckp, const int64_t id, const int server)
{ {
stratum_instance_t *client = ckzalloc(sizeof(stratum_instance_t)); stratum_instance_t *client;
sdata_t *sdata = ckp->data; sdata_t *sdata = ckp->data;
sdata->stratum_generated++; client = __recruit_stratum_instance(sdata);
client->id = id; client->id = id;
client->server = server; client->server = server;
client->diff = client->old_diff = ckp->startdiff; client->diff = client->old_diff = ckp->startdiff;

Loading…
Cancel
Save