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; }