static void save_socket(struct SocketWatcherData *watcher, pubnub_t *pb)
{
    size_t i;
    pbpal_native_socket_t sockt = pubnub_get_native_socket(pb);

    PUBNUB_ASSERT(watcher->apoll_size <= watcher->apoll_cap);

    if (INVALID_SOCKET == sockt) {
        return;
    }
    for (i = 0; i < watcher->apoll_size; ++i) {
        PUBNUB_ASSERT_OPT(watcher->apoll[i].fd != sockt);
    }
    if (watcher->apoll_size == watcher->apoll_cap) {
        size_t newcap = watcher->apoll_cap + 2;
        WSAPOLLFD *npapoll = (WSAPOLLFD*)realloc(watcher->apoll, sizeof watcher->apoll[0] * newcap);
        if (NULL == npapoll) {
            return;
        }
        else {
            pubnub_t **npapb = (pubnub_t**)realloc(watcher->apb, sizeof watcher->apb[0] * newcap);
            watcher->apoll = npapoll;
            if (NULL == npapb) {
                return;
            }
            watcher->apb = npapb;
        }
        watcher->apoll_cap = newcap;
    }

    watcher->apoll[watcher->apoll_size].fd = sockt;
    watcher->apoll[watcher->apoll_size].events = POLLOUT;
    watcher->apb[watcher->apoll_size] = pb;
    ++watcher->apoll_size;
}
void pbpal_ntf_callback_remove_socket(struct pbpal_poll_data* data, pubnub_t* pb)
{
    size_t                i;
    int                   new_nfds = 0;
    pbpal_native_socket_t sockt    = pubnub_get_native_socket(pb);

    PUBNUB_ASSERT_OPT(data != NULL);

    if (INVALID_SOCKET == sockt) {
        return;
    }
    PUBNUB_ASSERT(FD_ISSET(sockt, &data->exceptfds));
    PUBNUB_ASSERT_EX(we_ve_got_ya(data, pb));

    for (i = 0; i < data->size; ++i) {
        pbpal_native_socket_t i_sckt = data->asocket[i];
        PUBNUB_ASSERT(pubnub_get_native_socket(data->apb[i]) == data->asocket[i]);
        if ((int)i_sckt > new_nfds) {
            new_nfds = i_sckt;
        }
        if (data->apb[i] == pb) {
            size_t to_move = data->size - i - 1;
            if (to_move > 0) {
                memmove(data->apb + i, data->apb + i + 1, sizeof data->apb[0] * to_move);
                memmove(data->asocket + i,
                        data->asocket + i + 1,
                        sizeof data->asocket[0] * to_move);
            }
            --data->size;
            break;
        }
    }

    FD_CLR(sockt, &data->exceptfds);
    FD_CLR(sockt, &data->writefds);
    FD_CLR(sockt, &data->readfds);

    for (; i < data->size; ++i) {
        pbpal_native_socket_t i_sckt = data->asocket[i];
        PUBNUB_ASSERT(pubnub_get_native_socket(data->apb[i]) == data->asocket[i]);
        if ((int)i_sckt > new_nfds) {
            new_nfds = i_sckt;
        }
    }
    data->nfds = new_nfds;
}
int pbpal_ntf_watch_in_events(struct pbpal_poll_data* data, pubnub_t* pbp)
{
    pbpal_native_socket_t scket = pubnub_get_native_socket(pbp);

    PUBNUB_ASSERT_OPT(data != NULL);
    if (!we_ve_got_ya(data, pbp)) {
        return -1;
    }

    FD_SET(scket, &data->readfds);
    FD_CLR(scket, &data->writefds);

    return 0;
}
static void update_socket(struct SocketWatcherData *watcher, pubnub_t *pb)
{
    size_t i;
    pbpal_native_socket_t scket = pubnub_get_native_socket(pb);
    if (INVALID_SOCKET == scket) {
        return;
    }

    for (i = 0; i < watcher->apoll_size; ++i) {
        if (watcher->apb[i] == pb) {
            watcher->apoll[i].fd = scket;
            return;
        }
    }
}
void pbpal_ntf_callback_update_socket(struct pbpal_poll_data* data, pubnub_t* pb)
{
    size_t i;

    PUBNUB_ASSERT_OPT(data != NULL);
    for (i = 0; i < data->size; ++i) {
        if (data->apb[i] == pb) {
            pbpal_native_socket_t sckt = data->asocket[i];

            FD_CLR(sckt, &data->readfds);
            FD_CLR(sckt, &data->readfds);
            FD_CLR(sckt, &data->readfds);

            sckt = pubnub_get_native_socket(data->apb[i]);
            FD_CLR(sckt, &data->readfds);
            FD_SET(sckt, &data->writefds);
            FD_SET(sckt, &data->exceptfds);
            data->asocket[i] = sckt;
            break;
        }
    }
}
static void remove_socket(struct SocketWatcherData *watcher, pubnub_t *pb)
{
    size_t i;
    pbpal_native_socket_t sockt = pubnub_get_native_socket(pb);

    PUBNUB_ASSERT(watcher->apoll_size <= watcher->apoll_cap);

    if (INVALID_SOCKET == sockt) {
        return;
    }
    for (i = 0; i < watcher->apoll_size; ++i) {
        if (watcher->apoll[i].fd == sockt) {
            size_t to_move = watcher->apoll_size - i - 1;
            PUBNUB_ASSERT(watcher->apb[i] == pb);
            if (to_move > 0) {
                memmove(watcher->apoll + i, watcher->apoll + i + 1, sizeof watcher->apoll[0] * to_move);
                memmove(watcher->apb + i, watcher->apb + i + 1, sizeof watcher->apb[0] * to_move);
            }
            --watcher->apoll_size;
            break;
        }
    }
}
void pbpal_ntf_callback_save_socket(struct pbpal_poll_data* data, pubnub_t* pb)
{
    pbpal_native_socket_t sockt = pubnub_get_native_socket(pb);

    PUBNUB_ASSERT_OPT(data != NULL);

    if (INVALID_SOCKET == sockt) {
        return;
    }
    PUBNUB_ASSERT(!FD_ISSET(sockt, &data->exceptfds));
    PUBNUB_ASSERT(!FD_ISSET(sockt, &data->writefds));
    PUBNUB_ASSERT(!FD_ISSET(sockt, &data->readfds));
    PUBNUB_ASSERT_EX(!we_ve_got_ya(data, pb));

    if ((int)sockt > data->nfds) {
        data->nfds = sockt;
    }
    FD_SET(sockt, &data->exceptfds);
    FD_SET(sockt, &data->writefds);
    data->apb[data->size]     = pb;
    data->asocket[data->size] = sockt;
    ++data->size;
}