static RefNode * newCommonRef(JNIEnv *env, jobject ref) { RefNode *node; jint slot; node = createNode(env, ref); /* * Add to reference hashtable */ slot = hashRef(ref); node->nextByRef = objectsByRef[slot]; node->refSlot = slot; objectsByRef[slot] = node; /* * Add to id hashtable */ slot = hashID((jlong)node->seqNum); node->nextByID = objectsByID[slot]; objectsByID[slot] = node; return node; }
void BitcoinP2P::processReject(unique_ptr<Payload> payload) { if (payload->type() != Payload_reject) { LOGERR << "processReject: expected payload_reject type, got " << payload->typeStr() << " instead"; return; } shared_ptr<Payload> payload_sptr(move(payload)); auto payloadReject = dynamic_pointer_cast<Payload_Reject>(payload_sptr); if (payloadReject->rejectType() == Payload_tx) { auto& txHash = payloadReject->getExtra(); BinaryDataRef hashRef(&txHash[0], txHash.size()); //let's check if we have callbacks registered for this tx hash { auto gettxcallbackmap = getTxCallbackMap_.get(); auto callbackIter = gettxcallbackmap->find(hashRef); if (callbackIter != gettxcallbackmap->end()) { callbackIter->second->setStatus(false); callbackIter->second->setMessage(payloadReject->getReasonStr()); auto prom = callbackIter->second->getPromise(); prom->set_value(payload_sptr); } } } }
/* * Returns the node which contains the common reference for the * given object. The passed reference should not be a weak reference * managed in the object hash table (i.e. returned by commonRef_idToRef) * because no sequence number checking is done. */ static RefNode * findNodeByRef(JNIEnv *env, jobject ref) { RefNode *node; jint slot = hashRef(ref); node = objectsByRef[slot]; while (node != NULL) { if (isSameObject(env, ref, node->ref)) { break; } node = node->nextByRef; } return node; }