int gh_heap_remove(gh_heap_t *heap, gh_hnode_t *hnode) { unsigned int count = heap->count; unsigned int cur_idx = hnode->index; gh_hnode_t **cur_ptr; gh_hnode_t *last; assert(gh_hnode_is_valid(hnode)); assert(cur_idx < count); cur_ptr = hnode_ptr(heap, cur_idx); assert(*cur_ptr == hnode); count--; last = *hnode_ptr(heap, count); heap->count = count; if (last == hnode) return 0; last->index = cur_idx; *cur_ptr = last; if (!hnode_up(heap, *cur_ptr)) hnode_down(heap, *cur_ptr); gh_hnode_invalidate(hnode); return 0; }
/* Create a new event structure -- must be deleted later with msevent_delete, * unless it returns NULL (failure). NULL can be passed in for the msiod and * the userdata if not available */ msevent *msevent_new(mspool *nsp, enum nse_type type, msiod *msiod, int timeout_msecs, nsock_ev_handler handler, void *userdata) { msevent *nse; gh_lnode_t *lnode; /* Bring us up to date for the timeout calculation. */ gettimeofday(&nsock_tod, NULL); if (msiod) { msiod->events_pending++; assert(msiod->state != NSIOD_STATE_DELETED); } /* First we check if one is available from the free list ... */ lnode = gh_list_pop(&nsp->free_events); if (!lnode) nse = (msevent *)safe_malloc(sizeof(msevent)); else nse = lnode_msevent(lnode); memset(nse, 0, sizeof(msevent)); nse->id = get_new_event_id(nsp, type); nse->type = type; nse->status = NSE_STATUS_NONE; gh_hnode_invalidate(&nse->expire); #if HAVE_OPENSSL nse->sslinfo.ssl_desire = SSL_ERROR_NONE; #endif if (type == NSE_TYPE_READ || type == NSE_TYPE_WRITE) filespace_init(&(nse->iobuf), 1024); #if HAVE_PCAP if (type == NSE_TYPE_PCAP_READ) { mspcap *mp; int sz; assert(msiod != NULL); mp = (mspcap *)msiod->pcap; assert(mp); sz = mp->snaplen+1 + sizeof(nsock_pcap); filespace_init(&(nse->iobuf), sz); } #endif if (timeout_msecs != -1) { assert(timeout_msecs >= 0); TIMEVAL_MSEC_ADD(nse->timeout, nsock_tod, timeout_msecs); } nse->iod = msiod; nse->handler = handler; nse->userdata = userdata; if (nse->iod == NULL) nsock_log_debug(nsp, "msevent_new (IOD #NULL) (EID #%li)", nse->id); else nsock_log_debug(nsp, "msevent_new (IOD #%li) (EID #%li)", nse->iod->id, nse->id); return nse; }