int pni_store_update(pni_store_t *store, pn_sequence_t id, pn_status_t status, int flags, bool settle, bool match) { assert(store); if (!pni_store_tracking(store, id)) { return 0; } size_t start; if (PN_CUMULATIVE & flags) { start = store->lwm; } else { start = id; } for (pn_sequence_t i = start; i <= id; i++) { pni_entry_t *e = pni_store_entry(store, i); if (e) { pn_delivery_t *d = e->delivery; if (d) { if (!pn_delivery_local_state(d)) { if (match) { pn_delivery_update(d, pn_delivery_remote_state(d)); } else { switch (status) { case PN_STATUS_ACCEPTED: pn_delivery_update(d, PN_ACCEPTED); break; case PN_STATUS_REJECTED: pn_delivery_update(d, PN_REJECTED); break; default: break; } } pni_entry_updated(e); } } if (settle) { if (d) { pn_delivery_settle(d); } pn_hash_del(store->tracked, e->id); } } } while (store->hwm - store->lwm > 0 && !pn_hash_get(store->tracked, store->lwm)) { store->lwm++; } return 0; }
static void test_hash(void) { void *one = pn_class_new(PN_OBJECT, 0); void *two = pn_class_new(PN_OBJECT, 0); void *three = pn_class_new(PN_OBJECT, 0); pn_hash_t *hash = pn_hash(PN_OBJECT, 4, 0.75); pn_hash_put(hash, 0, NULL); pn_hash_put(hash, 1, one); pn_hash_put(hash, 2, two); pn_hash_put(hash, 3, three); pn_hash_put(hash, 4, one); pn_hash_put(hash, 5, two); pn_hash_put(hash, 6, three); pn_hash_put(hash, 7, one); pn_hash_put(hash, 8, two); pn_hash_put(hash, 9, three); pn_hash_put(hash, 10, one); pn_hash_put(hash, 11, two); pn_hash_put(hash, 12, three); pn_hash_put(hash, 18, one); assert(pn_hash_get(hash, 2) == two); assert(pn_hash_get(hash, 5) == two); assert(pn_hash_get(hash, 18) == one); assert(pn_hash_get(hash, 0) == NULL); assert(pn_hash_size(hash) == 14); pn_hash_del(hash, 5); assert(pn_hash_get(hash, 5) == NULL); assert(pn_hash_size(hash) == 13); pn_hash_del(hash, 18); assert(pn_hash_get(hash, 18) == NULL); assert(pn_hash_size(hash) == 12); pn_decref(hash); pn_decref(one); pn_decref(two); pn_decref(three); }
pni_entry_t *pni_store_entry(pni_store_t *store, pn_sequence_t id) { assert(store); return (pni_entry_t *) pn_hash_get(store->tracked, id); }
iocpdesc_t *pni_iocpdesc_map_get(iocp_t *iocp, pn_socket_t s) { iocpdesc_t *iocpd = (iocpdesc_t *) pn_hash_get(iocp->iocpdesc_map, s); return iocpd; }