Merge pull request #1698 from ludovic-henry/socket-reorg-2
authorRodrigo Kumpera <kumpera@gmail.com>
Thu, 9 Apr 2015 22:04:38 +0000 (17:04 -0500)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 9 Apr 2015 22:04:38 +0000 (17:04 -0500)
Reorganize Socket code

1  2 
mono/metadata/class-internals.h
mono/metadata/domain.c
mono/metadata/icall-def.h
mono/metadata/threadpool-ms-io.c

index f69a2e7685ae2c8323ac887b3227f550ae962df3,dba88a9bf348645dc211b02c808d8c23a1a1e2e4..d2b6722e17324624778405c360ea83c36f19d658
@@@ -1062,7 -1062,6 +1062,6 @@@ mono_inflate_generic_signature (MonoMet
  
  typedef struct {
        MonoImage *corlib;
-       MonoImage *system;
        MonoClass *object_class;
        MonoClass *byte_class;
        MonoClass *void_class;
        MonoClass *methodhandle_class;
        MonoClass *systemtype_class;
        MonoClass *monotype_class;
 +      MonoClass *runtimetype_class;
        MonoClass *exception_class;
        MonoClass *threadabortexception_class;
        MonoClass *thread_class;
diff --combined mono/metadata/domain.c
index 6bd4f86a1b44bd31e7f9cdd752b6c8ef06549a0c,e791b07ce2b020bfb46eacf4bfa2efe00fad0b01..d2d92fd51c9868342956d7ca8876457c1d0fca8f
@@@ -600,9 -600,6 +600,6 @@@ mono_init_internal (const char *filenam
        }
        mono_defaults.corlib = mono_assembly_get_image (ass);
  
-       /* might be NULL if System.dll is not yet loaded */
-       mono_defaults.system = mono_image_loaded ("System");
        mono_defaults.object_class = mono_class_from_name (
                  mono_defaults.corlib, "System", "Object");
        g_assert (mono_defaults.object_class != 0);
                  mono_defaults.corlib, "System", "MonoType");
        g_assert (mono_defaults.monotype_class != 0);
  
 +      mono_defaults.runtimetype_class = mono_class_from_name (
 +                mono_defaults.corlib, "System", "RuntimeType");
 +      g_assert (mono_defaults.runtimetype_class != 0);
 +
        mono_defaults.exception_class = mono_class_from_name (
                  mono_defaults.corlib, "System", "Exception");
        g_assert (mono_defaults.exception_class != 0);
index 9b5dac81308bc1eecd9bc6854da43b61cde84cf6,7537498b0c4ac71ed2e7601ac8616dfa98037778..530ad048095c15fc113f3e1a75c5c92642085ebf
@@@ -105,10 -105,10 +105,10 @@@ ICALL(ARRAY_12, "SetValue",         ves
  ICALL(ARRAY_13, "SetValueImpl",     ves_icall_System_Array_SetValueImpl)
  
  ICALL_TYPE(BUFFER, "System.Buffer", BUFFER_1)
 -ICALL(BUFFER_1, "BlockCopyInternal", ves_icall_System_Buffer_BlockCopyInternal)
 -ICALL(BUFFER_2, "ByteLengthInternal", ves_icall_System_Buffer_ByteLengthInternal)
 -ICALL(BUFFER_3, "GetByteInternal", ves_icall_System_Buffer_GetByteInternal)
 -ICALL(BUFFER_4, "SetByteInternal", ves_icall_System_Buffer_SetByteInternal)
 +ICALL(BUFFER_1, "InternalBlockCopy", ves_icall_System_Buffer_BlockCopyInternal)
 +ICALL(BUFFER_2, "_ByteLength", ves_icall_System_Buffer_ByteLengthInternal)
 +ICALL(BUFFER_3, "_GetByte", ves_icall_System_Buffer_GetByteInternal)
 +ICALL(BUFFER_4, "_SetByte", ves_icall_System_Buffer_SetByteInternal)
  
  ICALL_TYPE (COMPO_W, "System.ComponentModel.Win32Exception", COMPO_W_1)
  ICALL (COMPO_W_1, "W32ErrorMessage", ves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage)
@@@ -426,22 -426,22 +426,22 @@@ ICALL(SOCK_6, "Connect_internal(intptr,
  ICALL (SOCK_6a, "Disconnect_internal(intptr,bool,int&)", ves_icall_System_Net_Sockets_Socket_Disconnect_internal)
  ICALL(SOCK_7, "GetSocketOption_arr_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,byte[]&,int&)", ves_icall_System_Net_Sockets_Socket_GetSocketOption_arr_internal)
  ICALL(SOCK_8, "GetSocketOption_obj_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object&,int&)", ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal)
+ ICALL(SOCK_21, "IOControl_internal(intptr,int,byte[],byte[],int&)", ves_icall_System_Net_Sockets_Socket_IOControl_internal)
  ICALL(SOCK_9, "Listen_internal(intptr,int,int&)", ves_icall_System_Net_Sockets_Socket_Listen_internal)
  ICALL(SOCK_10, "LocalEndPoint_internal(intptr,int,int&)", ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal)
  ICALL(SOCK_11, "Poll_internal", ves_icall_System_Net_Sockets_Socket_Poll_internal)
+ ICALL(SOCK_13, "ReceiveFrom_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress&,int&)", ves_icall_System_Net_Sockets_Socket_ReceiveFrom_internal)
  ICALL(SOCK_11a, "Receive_internal(intptr,System.Net.Sockets.Socket/WSABUF[],System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Receive_array_internal)
  ICALL(SOCK_12, "Receive_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Receive_internal)
- ICALL(SOCK_13, "RecvFrom_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress&,int&)", ves_icall_System_Net_Sockets_Socket_RecvFrom_internal)
  ICALL(SOCK_14, "RemoteEndPoint_internal(intptr,int,int&)", ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal)
  ICALL(SOCK_15, "Select_internal(System.Net.Sockets.Socket[]&,int,int&)", ves_icall_System_Net_Sockets_Socket_Select_internal)
- ICALL(SOCK_15a, "SendFile(intptr,string,byte[],byte[],System.Net.Sockets.TransmitFileOptions)", ves_icall_System_Net_Sockets_Socket_SendFile)
+ ICALL(SOCK_15a, "SendFile_internal(intptr,string,byte[],byte[],System.Net.Sockets.TransmitFileOptions)", ves_icall_System_Net_Sockets_Socket_SendFile_internal)
  ICALL(SOCK_16, "SendTo_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_SendTo_internal)
  ICALL(SOCK_16a, "Send_internal(intptr,System.Net.Sockets.Socket/WSABUF[],System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Send_array_internal)
  ICALL(SOCK_17, "Send_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Send_internal)
  ICALL(SOCK_18, "SetSocketOption_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object,byte[],int,int&)", ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal)
  ICALL(SOCK_19, "Shutdown_internal(intptr,System.Net.Sockets.SocketShutdown,int&)", ves_icall_System_Net_Sockets_Socket_Shutdown_internal)
  ICALL(SOCK_20, "Socket_internal(System.Net.Sockets.AddressFamily,System.Net.Sockets.SocketType,System.Net.Sockets.ProtocolType,int&)", ves_icall_System_Net_Sockets_Socket_Socket_internal)
- ICALL(SOCK_21, "WSAIoctl(intptr,int,byte[],byte[],int&)", ves_icall_System_Net_Sockets_Socket_WSAIoctl)
  ICALL(SOCK_21a, "cancel_blocking_socket_operation", icall_cancel_blocking_socket_operation)
  ICALL(SOCK_22, "socket_pool_queue", icall_append_io_job)
  
@@@ -733,7 -733,7 +733,7 @@@ ICALL(RT_1, "CreateInstanceInternal", v
  ICALL(RT_2, "GetConstructors_internal", ves_icall_Type_GetConstructors_internal)
  ICALL(RT_3, "GetEvents_internal", ves_icall_Type_GetEvents_internal)
  ICALL(RT_5, "GetFields_internal", ves_icall_Type_GetFields_internal)
 -ICALL(RT_6, "GetGenericArguments", ves_icall_MonoType_GetGenericArguments)
 +ICALL(RT_6, "GetGenericArgumentsInternal", ves_icall_MonoType_GetGenericArguments)
  ICALL(RT_7, "GetGenericParameterAttributes", ves_icall_Type_GetGenericParameterAttributes)
  ICALL(RT_8, "GetGenericParameterConstraints_impl", ves_icall_Type_GetGenericParameterConstraints)
  ICALL(RT_9, "GetGenericParameterPosition", ves_icall_Type_GetGenericParameterPosition)
index 9ecf176cd239de4826cb81c9c72d76c482e5185a,e92caac8682e0502388a4df44557391cbf159b4a..772a2fe5c6cef28614acadbf5c93efc698131fc5
@@@ -259,7 -259,7 +259,7 @@@ epoll_init (void
  #ifdef EPOOL_CLOEXEC
        threadpool_io->epoll.fd = epoll_create1 (EPOLL_CLOEXEC);
  #else
 -      threadpool_io->epoll.fd = epoll_create1 (256);
 +      threadpool_io->epoll.fd = epoll_create (256);
        fcntl (threadpool_io->epoll.fd, F_SETFD, FD_CLOEXEC);
  #endif
  
@@@ -1062,43 -1062,39 +1062,39 @@@ ensure_cleanedup (void
        io_status = STATUS_CLEANED_UP;
  }
  
- gboolean
mono_threadpool_ms_is_io (MonoObject *target, MonoObject *state)
static gboolean
is_socket_async_callback (MonoImage *system_image, MonoClass *class)
  {
-       static MonoClass *socket_class = NULL;
-       static MonoClass *socket_async_class = NULL;
-       static MonoClass *process_class = NULL;
-       static MonoClass *async_read_handler_class = NULL;
-       MonoClass *class;
-       MonoSocketAsyncResult *sockares;
+       MonoClass *socket_async_callback_class = NULL;
  
-       if (!mono_defaults.system)
-               mono_defaults.system = mono_image_loaded ("System");
-       if (!mono_defaults.system)
-               return FALSE;
-       g_assert (mono_defaults.system);
+       socket_async_callback_class = mono_class_from_name (system_image, "System.Net.Sockets", "SocketAsyncCallback");
+       g_assert (socket_async_callback_class);
  
-       if (!socket_class)
-               socket_class = mono_class_from_name (mono_defaults.system, "System.Net.Sockets", "Socket");
-       g_assert (socket_class);
+       return class == socket_async_callback_class;
+ }
+ static gboolean
+ is_async_read_handler (MonoImage *system_image, MonoClass *class)
+ {
+       MonoClass *process_class = NULL;
  
-       if (!process_class)
-               process_class = mono_class_from_name (mono_defaults.system, "System.Diagnostics", "Process");
+       process_class = mono_class_from_name (system_image, "System.Diagnostics", "Process");
        g_assert (process_class);
  
-       class = target->vtable->klass;
+       return class->nested_in && class->nested_in == process_class && strcmp (class->name, "AsyncReadHandler") == 0;
+ }
  
-       if (!socket_async_class) {
-               if (class->nested_in && class->nested_in == socket_class && strcmp (class->name, "SocketAsyncCall") == 0)
-                       socket_async_class = class;
-       }
+ gboolean
+ mono_threadpool_ms_is_io (MonoObject *target, MonoObject *state)
+ {
+       MonoImage *system_image;
+       MonoSocketAsyncResult *sockares;
  
-       if (!async_read_handler_class) {
-               if (class->nested_in && class->nested_in == process_class && strcmp (class->name, "AsyncReadHandler") == 0)
-                       async_read_handler_class = class;
-       }
+       system_image = mono_image_loaded ("System");
+       if (!system_image)
+               return FALSE;
  
-       if (class != socket_async_class && class != async_read_handler_class)
+       if (!is_socket_async_callback (system_image, target->vtable->klass) && !is_async_read_handler (system_image, target->vtable->klass))
                return FALSE;
  
        sockares = (MonoSocketAsyncResult*) state;
@@@ -1237,17 -1233,16 +1233,16 @@@ mono_threadpool_ms_io_remove_domain_job
  void
  mono_threadpool_io_enqueue_socket_async_result (MonoDomain *domain, MonoSocketAsyncResult *sockares)
  {
-       static MonoClass *socket_runtime_work_item_class = NULL;
+       MonoImage *system_image;
+       MonoClass *socket_runtime_work_item_class;
        MonoSocketRuntimeWorkItem *srwi;
  
        g_assert (sockares);
  
-       if (!mono_defaults.system)
-               mono_defaults.system = mono_image_loaded ("System");
-       g_assert (mono_defaults.system);
+       system_image = mono_image_loaded ("System");
+       g_assert (system_image);
  
-       if (!socket_runtime_work_item_class)
-               socket_runtime_work_item_class = mono_class_from_name (mono_defaults.system, "System.Net.Sockets", "MonoSocketRuntimeWorkItem");
+       socket_runtime_work_item_class = mono_class_from_name (system_image, "System.Net.Sockets", "MonoSocketRuntimeWorkItem");
        g_assert (socket_runtime_work_item_class);
  
        srwi = (MonoSocketRuntimeWorkItem*) mono_object_new (domain, socket_runtime_work_item_class);