int b1_handle_acquire(B1Handle **handlep, B1Peer *peer, uint64_t handle_id) { B1Handle *handle; CRBNode **slot, *p; int r; assert(handlep); assert(peer); if (handle_id == BUS1_HANDLE_INVALID) { *handlep = NULL; return 0; } slot = c_rbtree_find_slot(&peer->handles, handles_compare, &handle_id, &p); if (slot) { r = b1_handle_new(peer, handle_id, &handle); if (r < 0) return r; c_rbtree_add(&peer->handles, p, slot, &handle->rb); } else { handle = c_container_of(p, B1Handle, rb); b1_handle_ref(handle); b1_handle_release(handle); } *handlep = handle; return 0; }
static void test_node(void) { _c_cleanup_(b1_peer_unrefp) B1Peer *peer = NULL; _c_cleanup_(b1_node_freep) B1Node *node = NULL; B1Handle *handle; int r; r = b1_peer_new(&peer); assert(r >= 0); r = b1_node_new(peer, &node); assert(r >= 0); assert(node); assert(b1_node_get_peer(node) == peer); handle = b1_node_get_handle(node); assert(handle); handle = b1_handle_ref(handle); assert(handle); b1_handle_unref(handle); }