From 4f0379299a58d68d0f3979c4c4a8dbc0d0d55d27 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Fri, 25 Apr 2014 14:10:50 +1000 Subject: [PATCH] Create new stratum instances for each new client id, adding them to a hashtable --- src/stratifier.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/stratifier.c b/src/stratifier.c index 8c63ba2c..14f232ce 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -27,6 +27,8 @@ static uchar scriptsig_header_bin[41]; static char pubkeytxnbin[25]; static char pubkeytxn[52]; +static uint64_t enonce1_64; + struct workbase { /* Hash table data */ UT_hash_handle hh; @@ -106,6 +108,19 @@ static pthread_cond_t stratum_send_cond; static stratum_msg_t *stratum_recvs; static stratum_msg_t *stratum_sends; +/* Per client stratum instance, to be further expanded */ +struct stratum_instance { + UT_hash_handle hh; + int id; + char enonce1[20]; +}; + +typedef struct stratum_instance stratum_instance_t; + +static stratum_instance_t *stratum_instances; + +static cklock_t instance_lock; + /* No error checking with these, make sure we know they're valid already! */ static inline void json_strcpy(char *buf, json_t *val, const char *key) { @@ -282,6 +297,25 @@ static void update_base(ckpool_t *ckp) ck_wunlock(&workbase_lock); } +/* Enter with instance_lock held */ +static stratum_instance_t *__instance_by_id(int id) +{ + stratum_instance_t *instance; + + HASH_FIND_INT(stratum_instances, &id, instance); + return instance; +} + +/* Enter with write instance_lock held */ +static stratum_instance_t *__stratum_add_instance(int id) +{ + stratum_instance_t *instance = ckzalloc(sizeof(stratum_instance_t)); + + instance->id = id; + HASH_ADD_INT(stratum_instances, id, instance); + return instance; +} + static void stratum_add_recvd(json_t *val) { stratum_msg_t *msg; @@ -406,6 +440,8 @@ static void *stratum_receiver(void *arg) rename_proc("receiver"); while (42) { + stratum_instance_t *instance; + /* Pop the head off the list if it exists or wait for a conditional * signal telling us there is work */ mutex_lock(&stratum_recv_lock); @@ -423,6 +459,16 @@ static void *stratum_receiver(void *arg) json_object_del(msg->json_msg, "client_id"); /* Parse the message here */ + ck_ilock(&instance_lock); + instance = __instance_by_id(msg->client_id); + if (!instance) { + /* client_id instance doesn't exist yet, create one */ + ck_ulock(&instance_lock); + instance = __stratum_add_instance(msg->client_id); + ck_dwilock(&instance_lock); + } + ck_uilock(&instance_lock); + char *s = json_dumps(msg->json_msg, 0); LOGERR("Client %d sent message %s", msg->client_id, s); free(s); @@ -480,6 +526,8 @@ int stratifier(proc_instance_t *pi) address_to_pubkeytxn(pubkeytxnbin, ckp->btcaddress); __bin2hex(pubkeytxn, pubkeytxnbin, 25); + cklock_init(&instance_lock); + mutex_init(&stratum_recv_lock); cond_init(&stratum_recv_cond); create_pthread(&pth_stratum_receiver, stratum_receiver, ckp);