Esempio n. 1
0
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;
}
Esempio n. 3
0
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;
    }
}