+static gboolean
+collect_pollfds_from_array (MonoArrayHandle sockets, int i, int nfds, mono_pollfd *pfds, int *idx, int *mode)
+{
+ HANDLE_FUNCTION_ENTER ();
+ gboolean result = TRUE;
+ MonoObjectHandle obj = MONO_HANDLE_NEW (MonoObject, NULL);
+ MONO_HANDLE_ARRAY_GETREF (obj, sockets, i);
+ if (MONO_HANDLE_IS_NULL (obj)) {
+ (*mode)++;
+ goto leave;
+ }
+
+ if (*idx >= nfds) {
+ result = FALSE;
+ goto leave;
+ }
+
+ pfds [*idx].fd = Socket_to_SOCKET (obj);
+ pfds [*idx].events = (*mode == 0) ? MONO_POLLIN : (*mode == 1) ? MONO_POLLOUT : POLL_ERRORS;
+ (*idx)++;
+leave:
+ HANDLE_FUNCTION_RETURN_VAL (result);
+}
+
+static void
+set_socks_array_from_pollfds (MonoArrayHandle sockets, int i, mono_pollfd *pfds, int *ret, int *mode, MonoArrayHandle socks, int *idx)
+{
+ HANDLE_FUNCTION_ENTER ();
+ mono_pollfd *pfd;
+
+ MonoObjectHandle obj = MONO_HANDLE_NEW (MonoObject, NULL);
+ MONO_HANDLE_ARRAY_GETREF (obj, sockets, i);
+ if (MONO_HANDLE_IS_NULL (obj)) {
+ (*mode)++;
+ (*idx)++;
+ goto leave;
+ }
+
+ pfd = &pfds [i - *mode];
+ if (pfd->revents == 0)
+ goto leave;
+
+ (*ret)--;
+ if (((*mode == 0 && (pfd->revents & (MONO_POLLIN | POLL_ERRORS)) != 0)) ||
+ ((*mode == 1 && (pfd->revents & (MONO_POLLOUT | POLL_ERRORS)) != 0)) ||
+ ((pfd->revents & POLL_ERRORS) != 0)) {
+ MONO_HANDLE_ARRAY_SETREF (socks, *idx, obj);
+ (*idx)++;
+ }
+leave:
+ HANDLE_FUNCTION_RETURN ();
+}
+