* polling system does not notify when the socket is closed */
mono_threadpool_ms_io_remove_socket (GPOINTER_TO_INT (sock));
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
closesocket (sock);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
}
gint32
return NULL;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
#ifdef HOST_WIN32
{
newsock = _wapi_accept (sock, NULL, 0);
#endif
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
*werror = 0;
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = _wapi_listen (sock, backlog);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
if (ret == SOCKET_ERROR)
*werror = WSAGetLastError ();
}
sa = (salen <= 128) ? (gchar *)alloca (salen) : (gchar *)g_malloc0 (salen);
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = _wapi_getsockname (sock, (struct sockaddr *)sa, &salen);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
if (ret == SOCKET_ERROR) {
*werror = WSAGetLastError ();
sa = (salen <= 128) ? (gchar *)alloca (salen) : (gchar *)g_malloc0 (salen);
/* Note: linux returns just 2 for AF_UNIX. Always. */
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = _wapi_getpeername (sock, (struct sockaddr *)sa, &salen);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
if (ret == SOCKET_ERROR) {
*werror = WSAGetLastError ();
return FALSE;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = mono_poll (pfds, 1, timeout);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
return;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = _wapi_connect (sock, sa, sa_size);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
LOGDEBUG (g_message("%s: disconnecting from socket %p (reuse %d)", __func__, sock, reuse));
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
/* I _think_ the extension function pointers need to be looked
* up for each socket. FIXME: check the best way to store
ret = WSAIoctl (sock, SIO_GET_EXTENSION_FUNCTION_POINTER, (gchar *)&disco_guid, sizeof (GUID),
(gchar *)&_wapi_disconnectex, sizeof (void *), &output_bytes, NULL, NULL);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
if (ret != 0) {
/* make sure that WSAIoctl didn't put crap in the
*/
_wapi_disconnectex = NULL;
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
/*
* Use the SIO_GET_EXTENSION_FUNCTION_POINTER to
ret = WSAIoctl (sock, SIO_GET_EXTENSION_FUNCTION_POINTER, (gchar *)&trans_guid, sizeof(GUID),
(gchar *)&_wapi_transmitfile, sizeof(void *), &output_bytes, NULL, NULL);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
if (ret != 0)
_wapi_transmitfile = NULL;
return;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
if (_wapi_disconnectex != NULL) {
if (!_wapi_disconnectex (sock, NULL, TF_REUSE_SOCKET, 0))
*werror = ERROR_NOT_SUPPORTED;
}
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted)
if (interrupted)
return 0;
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
#ifdef HOST_WIN32
{
ret = _wapi_recv (sock, buf, count, recvflags);
#endif
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
return 0;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = WSARecv (sock, wsabufs, count, &recv, &recvflags, NULL, NULL);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
return 0;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = _wapi_recvfrom (sock, buf, count, recvflags, sa, &sa_size);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
return 0;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = _wapi_send (sock, buf, count, sendflags);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
return 0;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = WSASend (sock, wsabufs, count, &sent, sendflags, NULL, NULL);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
return 0;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = _wapi_sendto (sock, buf, count, sendflags, sa, sa_size);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
return;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = mono_poll (pfds, nfds, timeout);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
return;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
/* No need to deal with MulticastOption names here, because
* you cant getsockopt AddMembership or DropMembership (the
ret = _wapi_getsockopt (sock, system_level, system_name, &val, &valsize);
}
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
if (ret == SOCKET_ERROR) {
*werror = WSAGetLastError ();
valsize = mono_array_length (*byte_val);
buf = mono_array_addr (*byte_val, guchar, 0);
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = _wapi_getsockopt (sock, system_level, system_name, buf, &valsize);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
if (ret == SOCKET_ERROR)
*werror = WSAGetLastError ();
return;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
/* Currently, the values for how (recv=0, send=1, both=2) match the BSD API */
ret = _wapi_shutdown (sock, how);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
o_len = mono_array_length (output);
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = WSAIoctl (sock, code, i_buffer, i_len, o_buffer, o_len, &output_bytes, NULL, NULL);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
if (ret == SOCKET_ERROR) {
*werror = WSAGetLastError ();
MonoBoolean
ves_icall_System_Net_Dns_GetHostByName_internal (MonoString *host, MonoString **h_name, MonoArray **h_aliases, MonoArray **h_addr_list)
{
+ MonoError error;
gboolean add_local_ips = FALSE, add_info_ok = TRUE;
gchar this_hostname [256];
MonoAddressInfo *info = NULL;
- char *hostname = mono_string_to_utf8 (host);
- MonoError error;
int hint;
+ char *hostname = mono_string_to_utf8_checked (host, &error);
+ if (mono_error_set_pending_exception (&error))
+ return FALSE;
+
hint = get_addrinfo_family_hint (&error);
if (!mono_error_ok (&error)) {
mono_error_set_pending_exception (&error);
gchar hostname [NI_MAXHOST] = { 0 };
gboolean ret;
- address = mono_string_to_utf8 (addr);
+ address = mono_string_to_utf8_checked (addr, &error);
+ if (mono_error_set_pending_exception (&error))
+ return FALSE;
if (inet_pton (AF_INET, address, &saddr.sin_addr ) == 1) {
family = AF_INET;
g_free (address);
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
switch (family) {
case AF_INET: {
g_assert_not_reached ();
}
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
if (!ret)
return FALSE;
return FALSE;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
ret = TransmitFile (sock, file, 0, 0, NULL, &buffers, flags);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted) {
return FALSE;
}
- MONO_PREPARE_BLOCKING;
+ MONO_ENTER_GC_SAFE;
CloseHandle (file);
- MONO_FINISH_BLOCKING;
+ MONO_EXIT_GC_SAFE;
return ret;
}