diff --git a/src/stratifier.c b/src/stratifier.c index f198c3f6..401e201f 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -1006,8 +1006,20 @@ static sdata_t *duplicate_sdata(const sdata_t *sdata) sdata_t *dsdata = ckzalloc(sizeof(sdata_t)); int64_t randomiser; + /* Copy the transaction binaries for workbase creation */ memcpy(dsdata->pubkeytxnbin, sdata->pubkeytxnbin, 25); memcpy(dsdata->donkeytxnbin, sdata->donkeytxnbin, 25); + + /* Use the same work queues for all subproxies */ + dsdata->ssends = sdata->ssends; + dsdata->srecvs = sdata->srecvs; + dsdata->ckdbq = sdata->ckdbq; + dsdata->sshareq = sdata->sshareq; + dsdata->sauthq = sdata->sauthq; + dsdata->stxnq = sdata->stxnq; + + /* Give the sbuproxy a unique workbase id and its own workbase list + * and lock */ randomiser = ((int64_t)time(NULL)) << 32; dsdata->blockchange_id = dsdata->workbase_id = randomiser; cklock_init(&dsdata->workbase_lock); @@ -1533,7 +1545,7 @@ static inline bool client_active(stratum_instance_t *client) /* For creating a list of sends without locking that can then be concatenated * to the stratum_sends list. Minimises locking and avoids taking recursive - * locks. */ + * locks. Sends only to sdata bound clients (everyone in ckpool) */ static void stratum_broadcast(sdata_t *sdata, json_t *val) { stratum_instance_t *client, *tmp; @@ -1550,6 +1562,8 @@ static void stratum_broadcast(sdata_t *sdata, json_t *val) ckmsg_t *client_msg; smsg_t *msg; + if (client->sdata != sdata) + continue; if (!client_active(client)) continue; client_msg = ckalloc(sizeof(ckmsg_t));