int pubnub_free(pubnub_t* pb) { int result = -1; PUBNUB_ASSERT(check_ctx_ptr(pb)); PUBNUB_LOG_TRACE("pubnub_free(%p)\n", pb); pubnub_mutex_lock(pb->monitor); pbnc_stop(pb, PNR_CANCELLED); if (PBS_IDLE == pb->state) { PUBNUB_LOG_TRACE("pubnub_free(%p) PBS_IDLE\n", pb); pb->state = PBS_NULL; #if defined(PUBNUB_CALLBACK_API) pbntf_requeue_for_processing(pb); pubnub_mutex_unlock(pb->monitor); #else pubnub_mutex_unlock(pb->monitor); pballoc_free_at_last(pb); #endif result = 0; } else { PUBNUB_LOG_TRACE("pubnub_free(%p) pb->state=%d\n", pb, pb->state); pubnub_mutex_unlock(pb->monitor); } return result; }
int pbpal_ntf_poll_away(struct pbpal_poll_data* data, int ms) { int i; int rslt; fd_set readfds; fd_set writefds; fd_set exceptfds; struct timeval timeout; if (0 == data->size) { return 0; } timeout.tv_sec = ms / 1000; timeout.tv_usec = (ms % 1000) * 1000; memcpy(&readfds, &data->readfds, sizeof readfds); memcpy(&writefds, &data->writefds, sizeof writefds); memcpy(&exceptfds, &data->exceptfds, sizeof exceptfds); rslt = select(data->nfds + 1, &readfds, &writefds, &exceptfds, &timeout); if (SOCKET_ERROR == rslt) { int last_err = #if defined(_WIN32) WSAGetLastError() #else errno #endif ; /* error? what to do about it? */ PUBNUB_LOG_WARNING( "poll size = %u, error = %d\n", (unsigned)data->size, last_err); return -1; } for (i = 0; (i < (int)data->size) && (rslt > 0); ++i) { bool should_process = false; if (FD_ISSET(data->asocket[i], &readfds)) { should_process = true; --rslt; } if (FD_ISSET(data->asocket[i], &writefds)) { should_process = true; --rslt; PUBNUB_ASSERT_OPT(rslt >= 0); } if (FD_ISSET(data->asocket[i], &exceptfds)) { should_process = true; --rslt; PUBNUB_ASSERT_OPT(rslt >= 0); } if (should_process) { pbntf_requeue_for_processing(data->apb[i]); } } PUBNUB_ASSERT_OPT(0 == rslt); return rslt; }
void pbnc_stop(struct pubnub_ *pb, enum pubnub_res outcome_to_report) { pb->core.last_result = outcome_to_report; switch (pb->state) { case PBS_WAIT_CANCEL: case PBS_WAIT_CANCEL_CLOSE: break; case PBS_IDLE: case PBS_NULL: pbntf_trans_outcome(pb); break; default: pb->state = PBS_WAIT_CANCEL; pbntf_requeue_for_processing(pb); break; } }