X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fio-layer%2Fsockets.c;h=05012d26fbbb505967a484272cb4ed1c99f6bad7;hb=86e44dfdcbc36134f56616dfe0ee1c6ae81e02b7;hp=54c8798637c27a71cae21ba763b3dea7cd9a06a9;hpb=ef48103513b187a9d700d66988e7b6020a5a9d95;p=mono.git diff --git a/mono/io-layer/sockets.c b/mono/io-layer/sockets.c index 54c8798637c..05012d26fbb 100644 --- a/mono/io-layer/sockets.c +++ b/mono/io-layer/sockets.c @@ -39,10 +39,12 @@ #include #include #include -#include #include +#include #include #include +#include +#include #include #include @@ -54,38 +56,38 @@ #include #endif -#if 0 -#define DEBUG(...) g_message(__VA_ARGS__) -#else -#define DEBUG(...) -#endif - static guint32 in_cleanup = 0; static void socket_close (gpointer handle, gpointer data); +static void socket_details (gpointer data); +static const gchar* socket_typename (void); +static gsize socket_typesize (void); -struct _WapiHandleOps _wapi_socket_ops = { +static MonoW32HandleOps _wapi_socket_ops = { socket_close, /* close */ NULL, /* signal */ NULL, /* own */ NULL, /* is_owned */ NULL, /* special_wait */ - NULL /* prewait */ + NULL, /* prewait */ + socket_details, /* details */ + socket_typename, /* typename */ + socket_typesize, /* typesize */ }; -static mono_once_t socket_ops_once=MONO_ONCE_INIT; - -static void socket_ops_init (void) +void +_wapi_socket_init (void) { - /* No capabilities to register */ + mono_w32handle_register_ops (MONO_W32HANDLE_SOCKET, &_wapi_socket_ops); } static void socket_close (gpointer handle, gpointer data) { int ret; struct _WapiHandle_socket *socket_handle = (struct _WapiHandle_socket *)data; + MonoThreadInfo *info = mono_thread_info_current (); - DEBUG ("%s: closing socket handle %p", __func__, handle); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: closing socket handle %p", __func__, handle); /* Shutdown the socket for reading, to interrupt any potential * receives that may be blocking for data. See bug 75705. @@ -95,11 +97,11 @@ static void socket_close (gpointer handle, gpointer data) do { ret = close (GPOINTER_TO_UINT(handle)); } while (ret == -1 && errno == EINTR && - !_wapi_thread_cur_apc_pending ()); + !mono_thread_info_is_interrupt_state (info)); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: close error: %s", __func__, strerror (errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: close error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); if (!in_cleanup) WSASetLastError (errnum); @@ -109,19 +111,36 @@ static void socket_close (gpointer handle, gpointer data) socket_handle->saved_error = 0; } +static void socket_details (gpointer data) +{ + /* FIXME: do something */ +} + +static const gchar* socket_typename (void) +{ + return "Socket"; +} + +static gsize socket_typesize (void) +{ + return sizeof (struct _WapiHandle_socket); +} + static gboolean -cleanup_close (gpointer handle, gpointer data) +cleanup_close (gpointer handle, gpointer data, gpointer user_data) { - _wapi_handle_ops_close (handle, NULL); - return TRUE; + if (mono_w32handle_get_type (handle) == MONO_W32HANDLE_SOCKET) + mono_w32handle_ops_close (handle, data); + + return FALSE; } void _wapi_cleanup_networking(void) { - DEBUG ("%s: cleaning up", __func__); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: cleaning up", __func__); in_cleanup = 1; - _wapi_handle_foreach (WAPI_HANDLE_SOCKET, cleanup_close, NULL); + mono_w32handle_foreach (cleanup_close, NULL); in_cleanup = 0; } @@ -139,12 +158,12 @@ int closesocket(guint32 fd) { gpointer handle = GUINT_TO_POINTER (fd); - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(0); } - _wapi_handle_unref (handle); + mono_w32handle_unref (handle); return(0); } @@ -156,18 +175,19 @@ guint32 _wapi_accept(guint32 fd, struct sockaddr *addr, socklen_t *addrlen) struct _WapiHandle_socket new_socket_handle = {0}; gboolean ok; int new_fd; + MonoThreadInfo *info = mono_thread_info_current (); if (addr != NULL && *addrlen < sizeof(struct sockaddr)) { WSASetLastError (WSAEFAULT); return(INVALID_SOCKET); } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(INVALID_SOCKET); } - ok = _wapi_lookup_handle (handle, WAPI_HANDLE_SOCKET, + ok = mono_w32handle_lookup (handle, MONO_W32HANDLE_SOCKET, (gpointer *)&socket_handle); if (ok == FALSE) { g_warning ("%s: error looking up socket handle %p", @@ -179,11 +199,11 @@ guint32 _wapi_accept(guint32 fd, struct sockaddr *addr, socklen_t *addrlen) do { new_fd = accept (fd, addr, addrlen); } while (new_fd == -1 && errno == EINTR && - !_wapi_thread_cur_apc_pending()); + !mono_thread_info_is_interrupt_state (info)); if (new_fd == -1) { gint errnum = errno; - DEBUG ("%s: accept error: %s", __func__, strerror(errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: accept error: %s", __func__, strerror(errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -191,8 +211,8 @@ guint32 _wapi_accept(guint32 fd, struct sockaddr *addr, socklen_t *addrlen) return(INVALID_SOCKET); } - if (new_fd >= _wapi_fd_reserve) { - DEBUG ("%s: File descriptor is too big", __func__); + if (new_fd >= mono_w32handle_fd_reserve) { + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: File descriptor is too big", __func__); WSASetLastError (WSASYSCALLFAILURE); @@ -206,15 +226,15 @@ guint32 _wapi_accept(guint32 fd, struct sockaddr *addr, socklen_t *addrlen) new_socket_handle.protocol = socket_handle->protocol; new_socket_handle.still_readable = 1; - new_handle = _wapi_handle_new_fd (WAPI_HANDLE_SOCKET, new_fd, + new_handle = mono_w32handle_new_fd (MONO_W32HANDLE_SOCKET, new_fd, &new_socket_handle); - if(new_handle == _WAPI_HANDLE_INVALID) { + if(new_handle == INVALID_HANDLE_VALUE) { g_warning ("%s: error creating socket handle", __func__); WSASetLastError (ERROR_GEN_FAILURE); return(INVALID_SOCKET); } - DEBUG ("%s: returning newly accepted socket handle %p with", + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: returning newly accepted socket handle %p with", __func__, new_handle); return(new_fd); @@ -225,7 +245,7 @@ int _wapi_bind(guint32 fd, struct sockaddr *my_addr, socklen_t addrlen) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -233,7 +253,7 @@ int _wapi_bind(guint32 fd, struct sockaddr *my_addr, socklen_t addrlen) ret = bind (fd, my_addr, addrlen); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: bind error: %s", __func__, strerror(errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: bind error: %s", __func__, strerror(errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -249,8 +269,9 @@ int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, struct _WapiHandle_socket *socket_handle; gboolean ok; gint errnum; - - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + MonoThreadInfo *info = mono_thread_info_current (); + + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -263,7 +284,7 @@ int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, errnum = errno; if (errno != EINTR) { - DEBUG ("%s: connect error: %s", __func__, + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: connect error: %s", __func__, strerror (errnum)); errnum = errno_to_WSA (errnum, __func__); @@ -279,8 +300,8 @@ int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, * But don't do this for EWOULDBLOCK (bug 317315) */ if (errnum != WSAEWOULDBLOCK) { - ok = _wapi_lookup_handle (handle, - WAPI_HANDLE_SOCKET, + ok = mono_w32handle_lookup (handle, + MONO_W32HANDLE_SOCKET, (gpointer *)&socket_handle); if (ok == FALSE) { /* ECONNRESET means the socket was closed by another thread */ @@ -297,11 +318,11 @@ int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, fds.fd = fd; fds.events = MONO_POLLOUT; while (mono_poll (&fds, 1, -1) == -1 && - !_wapi_thread_cur_apc_pending ()) { + !mono_thread_info_is_interrupt_state (info)) { if (errno != EINTR) { errnum = errno_to_WSA (errno, __func__); - DEBUG ("%s: connect poll error: %s", + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: connect poll error: %s", __func__, strerror (errno)); WSASetLastError (errnum); @@ -314,7 +335,7 @@ int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, &len) == -1) { errnum = errno_to_WSA (errno, __func__); - DEBUG ("%s: connect getsockopt error: %s", + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: connect getsockopt error: %s", __func__, strerror (errno)); WSASetLastError (errnum); @@ -325,7 +346,7 @@ int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, errnum = errno_to_WSA (so_error, __func__); /* Need to save this socket error */ - ok = _wapi_lookup_handle (handle, WAPI_HANDLE_SOCKET, + ok = mono_w32handle_lookup (handle, MONO_W32HANDLE_SOCKET, (gpointer *)&socket_handle); if (ok == FALSE) { g_warning ("%s: error looking up socket handle %p", __func__, handle); @@ -333,7 +354,7 @@ int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, socket_handle->saved_error = errnum; } - DEBUG ("%s: connect getsockopt returned error: %s", + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: connect getsockopt returned error: %s", __func__, strerror (so_error)); WSASetLastError (errnum); @@ -349,7 +370,7 @@ int _wapi_getpeername(guint32 fd, struct sockaddr *name, socklen_t *namelen) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -357,7 +378,7 @@ int _wapi_getpeername(guint32 fd, struct sockaddr *name, socklen_t *namelen) ret = getpeername (fd, name, namelen); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: getpeername error: %s", __func__, + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: getpeername error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); @@ -374,7 +395,7 @@ int _wapi_getsockname(guint32 fd, struct sockaddr *name, socklen_t *namelen) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -382,7 +403,7 @@ int _wapi_getsockname(guint32 fd, struct sockaddr *name, socklen_t *namelen) ret = getsockname (fd, name, namelen); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: getsockname error: %s", __func__, + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: getsockname error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); @@ -404,7 +425,7 @@ int _wapi_getsockopt(guint32 fd, int level, int optname, void *optval, struct _WapiHandle_socket *socket_handle; gboolean ok; - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -419,7 +440,7 @@ int _wapi_getsockopt(guint32 fd, int level, int optname, void *optval, ret = getsockopt (fd, level, optname, tmp_val, optlen); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: getsockopt error: %s", __func__, + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: getsockopt error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); @@ -435,7 +456,7 @@ int _wapi_getsockopt(guint32 fd, int level, int optname, void *optval, } if (optname == SO_ERROR) { - ok = _wapi_lookup_handle (handle, WAPI_HANDLE_SOCKET, + ok = mono_w32handle_lookup (handle, MONO_W32HANDLE_SOCKET, (gpointer *)&socket_handle); if (ok == FALSE) { g_warning ("%s: error looking up socket handle %p", @@ -463,7 +484,7 @@ int _wapi_listen(guint32 fd, int backlog) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -471,7 +492,7 @@ int _wapi_listen(guint32 fd, int backlog) ret = listen (fd, backlog); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: listen error: %s", __func__, strerror (errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: listen error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -494,8 +515,9 @@ int _wapi_recvfrom(guint32 fd, void *buf, size_t len, int recv_flags, struct _WapiHandle_socket *socket_handle; gboolean ok; int ret; + MonoThreadInfo *info = mono_thread_info_current (); - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -503,7 +525,7 @@ int _wapi_recvfrom(guint32 fd, void *buf, size_t len, int recv_flags, do { ret = recvfrom (fd, buf, len, recv_flags, from, fromlen); } while (ret == -1 && errno == EINTR && - !_wapi_thread_cur_apc_pending ()); + !mono_thread_info_is_interrupt_state (info)); if (ret == 0 && len > 0) { /* According to the Linux man page, recvfrom only @@ -524,7 +546,7 @@ int _wapi_recvfrom(guint32 fd, void *buf, size_t len, int recv_flags, * still_readable != 1 then shutdown * (SHUT_RD|SHUT_RDWR) has been called locally. */ - ok = _wapi_lookup_handle (handle, WAPI_HANDLE_SOCKET, + ok = mono_w32handle_lookup (handle, MONO_W32HANDLE_SOCKET, (gpointer *)&socket_handle); if (ok == FALSE || socket_handle->still_readable != 1) { ret = -1; @@ -534,7 +556,7 @@ int _wapi_recvfrom(guint32 fd, void *buf, size_t len, int recv_flags, if (ret == -1) { gint errnum = errno; - DEBUG ("%s: recv error: %s", __func__, strerror(errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: recv error: %s", __func__, strerror(errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -551,8 +573,9 @@ _wapi_recvmsg(guint32 fd, struct msghdr *msg, int recv_flags) struct _WapiHandle_socket *socket_handle; gboolean ok; int ret; + MonoThreadInfo *info = mono_thread_info_current (); - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -560,11 +583,11 @@ _wapi_recvmsg(guint32 fd, struct msghdr *msg, int recv_flags) do { ret = recvmsg (fd, msg, recv_flags); } while (ret == -1 && errno == EINTR && - !_wapi_thread_cur_apc_pending ()); + !mono_thread_info_is_interrupt_state (info)); if (ret == 0) { /* see _wapi_recvfrom */ - ok = _wapi_lookup_handle (handle, WAPI_HANDLE_SOCKET, + ok = mono_w32handle_lookup (handle, MONO_W32HANDLE_SOCKET, (gpointer *)&socket_handle); if (ok == FALSE || socket_handle->still_readable != 1) { ret = -1; @@ -574,7 +597,7 @@ _wapi_recvmsg(guint32 fd, struct msghdr *msg, int recv_flags) if (ret == -1) { gint errnum = errno; - DEBUG ("%s: recvmsg error: %s", __func__, strerror(errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: recvmsg error: %s", __func__, strerror(errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -588,8 +611,9 @@ int _wapi_send(guint32 fd, const void *msg, size_t len, int send_flags) { gpointer handle = GUINT_TO_POINTER (fd); int ret; + MonoThreadInfo *info = mono_thread_info_current (); - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -597,11 +621,11 @@ int _wapi_send(guint32 fd, const void *msg, size_t len, int send_flags) do { ret = send (fd, msg, len, send_flags); } while (ret == -1 && errno == EINTR && - !_wapi_thread_cur_apc_pending ()); + !mono_thread_info_is_interrupt_state (info)); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: send error: %s", __func__, strerror (errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: send error: %s", __func__, strerror (errno)); #ifdef O_NONBLOCK /* At least linux returns EAGAIN/EWOULDBLOCK when the timeout has been set on @@ -625,8 +649,9 @@ int _wapi_sendto(guint32 fd, const void *msg, size_t len, int send_flags, { gpointer handle = GUINT_TO_POINTER (fd); int ret; + MonoThreadInfo *info = mono_thread_info_current (); - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -634,11 +659,11 @@ int _wapi_sendto(guint32 fd, const void *msg, size_t len, int send_flags, do { ret = sendto (fd, msg, len, send_flags, to, tolen); } while (ret == -1 && errno == EINTR && - !_wapi_thread_cur_apc_pending ()); + !mono_thread_info_is_interrupt_state (info)); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: send error: %s", __func__, strerror (errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: send error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -653,8 +678,9 @@ _wapi_sendmsg(guint32 fd, const struct msghdr *msg, int send_flags) { gpointer handle = GUINT_TO_POINTER (fd); int ret; + MonoThreadInfo *info = mono_thread_info_current (); - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -662,11 +688,11 @@ _wapi_sendmsg(guint32 fd, const struct msghdr *msg, int send_flags) do { ret = sendmsg (fd, msg, send_flags); } while (ret == -1 && errno == EINTR && - !_wapi_thread_cur_apc_pending ()); + !mono_thread_info_is_interrupt_state (info)); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: sendmsg error: %s", __func__, strerror (errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: sendmsg error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -688,7 +714,7 @@ int _wapi_setsockopt(guint32 fd, int level, int optname, #endif struct timeval tv; - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -719,7 +745,7 @@ int _wapi_setsockopt(guint32 fd, int level, int optname, ret = setsockopt (fd, level, optname, tmp_val, optlen); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: setsockopt error: %s", __func__, + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: setsockopt error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); @@ -751,14 +777,14 @@ int _wapi_shutdown(guint32 fd, int how) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } if (how == SHUT_RD || how == SHUT_RDWR) { - ok = _wapi_lookup_handle (handle, WAPI_HANDLE_SOCKET, + ok = mono_w32handle_lookup (handle, MONO_W32HANDLE_SOCKET, (gpointer *)&socket_handle); if (ok == FALSE) { g_warning ("%s: error looking up socket handle %p", @@ -773,7 +799,7 @@ int _wapi_shutdown(guint32 fd, int how) ret = shutdown (fd, how); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: shutdown error: %s", __func__, + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: shutdown error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); @@ -808,16 +834,16 @@ guint32 _wapi_socket(int domain, int type, int protocol, void *unused, if (fd == -1) { gint errnum = errno; - DEBUG ("%s: socket error: %s", __func__, strerror (errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: socket error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); return(INVALID_SOCKET); } - if (fd >= _wapi_fd_reserve) { - DEBUG ("%s: File descriptor is too big (%d >= %d)", - __func__, fd, _wapi_fd_reserve); + if (fd >= mono_w32handle_fd_reserve) { + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: File descriptor is too big (%d >= %d)", + __func__, fd, mono_w32handle_fd_reserve); WSASetLastError (WSASYSCALLFAILURE); close (fd); @@ -848,7 +874,7 @@ guint32 _wapi_socket(int domain, int type, int protocol, void *unused, if (ret == -1) { int errnum = errno; - DEBUG ("%s: Error setting SO_REUSEADDR", __func__); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Error setting SO_REUSEADDR", __func__); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -860,17 +886,15 @@ guint32 _wapi_socket(int domain, int type, int protocol, void *unused, } - mono_once (&socket_ops_once, socket_ops_init); - - handle = _wapi_handle_new_fd (WAPI_HANDLE_SOCKET, fd, &socket_handle); - if (handle == _WAPI_HANDLE_INVALID) { + handle = mono_w32handle_new_fd (MONO_W32HANDLE_SOCKET, fd, &socket_handle); + if (handle == INVALID_HANDLE_VALUE) { g_warning ("%s: error creating socket handle", __func__); WSASetLastError (WSASYSCALLFAILURE); close (fd); return(INVALID_SOCKET); } - DEBUG ("%s: returning socket handle %p", __func__, handle); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: returning socket handle %p", __func__, handle); return(fd); } @@ -882,7 +906,7 @@ static gboolean socket_disconnect (guint32 fd) gpointer handle = GUINT_TO_POINTER (fd); int newsock, ret; - ok = _wapi_lookup_handle (handle, WAPI_HANDLE_SOCKET, + ok = mono_w32handle_lookup (handle, MONO_W32HANDLE_SOCKET, (gpointer *)&socket_handle); if (ok == FALSE) { g_warning ("%s: error looking up socket handle %p", __func__, @@ -896,7 +920,7 @@ static gboolean socket_disconnect (guint32 fd) if (newsock == -1) { gint errnum = errno; - DEBUG ("%s: socket error: %s", __func__, strerror (errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: socket error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -916,7 +940,7 @@ static gboolean socket_disconnect (guint32 fd) if (ret == -1) { gint errnum = errno; - DEBUG ("%s: dup2 error: %s", __func__, strerror (errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: dup2 error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -932,7 +956,7 @@ static gboolean socket_disconnect (guint32 fd) static gboolean wapi_disconnectex (guint32 fd, WapiOverlapped *overlapped, guint32 flags, guint32 reserved) { - DEBUG ("%s: called on socket %d!", __func__, fd); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: called on socket %d!", __func__, fd); if (reserved != 0) { WSASetLastError (WSAEINVAL); @@ -951,6 +975,7 @@ static gboolean wapi_disconnectex (guint32 fd, WapiOverlapped *overlapped, static gint wapi_sendfile (guint32 socket, gpointer fd, guint32 bytes_to_write, guint32 bytes_per_send, guint32 flags) { + MonoThreadInfo *info = mono_thread_info_current (); #if defined(HAVE_SENDFILE) && (defined(__linux__) || defined(DARWIN)) gint file = GPOINTER_TO_INT (fd); gint n; @@ -973,7 +998,7 @@ wapi_sendfile (guint32 socket, gpointer fd, guint32 bytes_to_write, guint32 byte /* TODO: Might not send the entire file for non-blocking sockets */ res = sendfile (file, socket, 0, &statbuf.st_size, NULL, 0); #endif - } while (res != -1 && (errno == EINTR || errno == EAGAIN) && !_wapi_thread_cur_apc_pending ()); + } while (res != -1 && errno == EINTR && !mono_thread_info_is_interrupt_state (info)); if (res == -1) { errnum = errno; errnum = errno_to_WSA (errnum, __func__); @@ -990,7 +1015,7 @@ wapi_sendfile (guint32 socket, gpointer fd, guint32 bytes_to_write, guint32 byte do { do { n = read (file, buffer, SF_BUFFER_SIZE); - } while (n == -1 && errno == EINTR && !_wapi_thread_cur_apc_pending ()); + } while (n == -1 && errno == EINTR && !mono_thread_info_is_interrupt_state (info)); if (n == -1) break; if (n == 0) { @@ -999,8 +1024,8 @@ wapi_sendfile (guint32 socket, gpointer fd, guint32 bytes_to_write, guint32 byte } do { n = send (socket, buffer, n, 0); /* short sends? enclose this in a loop? */ - } while (n == -1 && errno == EINTR && !_wapi_thread_cur_apc_pending ()); - } while (n != -1); + } while (n == -1 && errno == EINTR && !mono_thread_info_is_interrupt_state (info)); + } while (n != -1 && errno == EINTR && !mono_thread_info_is_interrupt_state (info)); if (n == -1) { gint errnum = errno; @@ -1021,7 +1046,7 @@ TransmitFile (guint32 socket, gpointer file, guint32 bytes_to_write, guint32 byt gpointer sock = GUINT_TO_POINTER (socket); gint ret; - if (_wapi_handle_type (sock) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (sock) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return FALSE; } @@ -1070,7 +1095,7 @@ WSAIoctl (guint32 fd, gint32 command, int ret; gchar *buffer = NULL; - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return SOCKET_ERROR; } @@ -1171,7 +1196,7 @@ WSAIoctl (guint32 fd, gint32 command, ret = ioctl (fd, command, buffer); if (ret == -1) { gint errnum = errno; - DEBUG("%s: WSAIoctl error: %s", __func__, + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: WSAIoctl error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); @@ -1208,7 +1233,7 @@ int ioctlsocket(guint32 fd, unsigned long command, gpointer arg) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); } @@ -1264,7 +1289,7 @@ int ioctlsocket(guint32 fd, unsigned long command, gpointer arg) if (ret == -1) { gint errnum = errno; - DEBUG ("%s: ioctl error: %s", __func__, strerror (errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: ioctl error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -1279,6 +1304,7 @@ int _wapi_select(int nfds G_GNUC_UNUSED, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { int ret, maxfd; + MonoThreadInfo *info = mono_thread_info_current (); for (maxfd = FD_SETSIZE-1; maxfd >= 0; maxfd--) { if ((readfds && FD_ISSET (maxfd, readfds)) || @@ -1297,11 +1323,11 @@ int _wapi_select(int nfds G_GNUC_UNUSED, fd_set *readfds, fd_set *writefds, ret = select(maxfd + 1, readfds, writefds, exceptfds, timeout); } while (ret == -1 && errno == EINTR && - !_wapi_thread_cur_apc_pending ()); + !mono_thread_info_is_interrupt_state (info)); if (ret == -1) { gint errnum = errno; - DEBUG ("%s: select error: %s", __func__, strerror (errno)); + MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: select error: %s", __func__, strerror (errno)); errnum = errno_to_WSA (errnum, __func__); WSASetLastError (errnum); @@ -1320,7 +1346,7 @@ void _wapi_FD_CLR(guint32 fd, fd_set *set) return; } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return; } @@ -1337,7 +1363,7 @@ int _wapi_FD_ISSET(guint32 fd, fd_set *set) return(0); } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(0); } @@ -1354,7 +1380,7 @@ void _wapi_FD_SET(guint32 fd, fd_set *set) return; } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return; }