X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fthreadpool.c;h=f8235f1ca6d972876a3c825ab6503f3e04f696bb;hb=3b5eb0cf5a2d48b362f64e0eaa351a56d7a0a065;hp=612090b0cececef2c8c028a705563c1d325f1cda;hpb=9869ae24b88761ab261c4311e24f7383b4af3f02;p=mono.git diff --git a/mono/metadata/threadpool.c b/mono/metadata/threadpool.c index 612090b0cec..f8235f1ca6d 100644 --- a/mono/metadata/threadpool.c +++ b/mono/metadata/threadpool.c @@ -480,6 +480,7 @@ socket_io_poll_main (gpointer p) EnterCriticalSection (&data->io_lock); if (data->inited == 0) { g_free (pfds); + LeaveCriticalSection (&data->io_lock); return; /* cleanup called */ } @@ -747,9 +748,12 @@ socket_io_init (SocketIOData *data) data->sock_to_state = g_hash_table_new (g_direct_hash, g_direct_equal); - if (data->epoll_disabled) + if (data->epoll_disabled) { data->new_sem = CreateSemaphore (NULL, 1, 1, NULL); + g_assert (data->new_sem != NULL); + } io_job_added = CreateSemaphore (NULL, 0, 0x7fffffff, NULL); + g_assert (io_job_added != NULL); InitializeCriticalSection (&io_queue_lock); if (data->epoll_disabled) { mono_thread_create (mono_get_root_domain (), socket_io_poll_main, data); @@ -785,7 +789,9 @@ socket_io_add_poll (MonoSocketAsyncResult *state) data->newpfd = g_new0 (mono_pollfd, 1); EnterCriticalSection (&data->io_lock); + /* FIXME: 64 bit issue: handle can be a pointer on windows? */ list = g_hash_table_lookup (data->sock_to_state, GINT_TO_POINTER (state->handle)); + /* FIXME: GC issue: state is an object stored in a GList */ if (list == NULL) { list = g_slist_alloc (); list->data = state; @@ -819,6 +825,7 @@ socket_io_add_epoll (MonoSocketAsyncResult *state) fd = GPOINTER_TO_INT (state->handle); EnterCriticalSection (&data->io_lock); list = g_hash_table_lookup (data->sock_to_state, GINT_TO_POINTER (fd)); + /* FIXME: GC issue: state is an object stored in a GList */ if (list == NULL) { list = g_slist_alloc (); list->data = state; @@ -917,6 +924,8 @@ mono_async_invoke (MonoAsyncResult *ares) { ASyncCall *ac = (ASyncCall *)ares->object_data; MonoThread *thread = NULL; + MonoObject *res, *exc = NULL; + MonoArray *out_args = NULL; if (ares->execution_context) { /* use captured ExecutionContext (if available) */ @@ -928,8 +937,10 @@ mono_async_invoke (MonoAsyncResult *ares) } ac->msg->exc = NULL; - ac->res = mono_message_invoke (ares->async_delegate, ac->msg, - &ac->msg->exc, &ac->out_args); + res = mono_message_invoke (ares->async_delegate, ac->msg, &exc, &out_args); + MONO_OBJECT_SETREF (ac, res, res); + MONO_OBJECT_SETREF (ac, msg->exc, exc); + MONO_OBJECT_SETREF (ac, out_args, out_args); ares->completed = 1; @@ -977,6 +988,7 @@ mono_thread_pool_init () InitializeCriticalSection (&ares_lock); ares_htable = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_KEY_VALUE_GC); job_added = CreateSemaphore (NULL, 0, 0x7fffffff, NULL); + g_assert (job_added != NULL); GetSystemInfo (&info); if (g_getenv ("MONO_THREADS_PER_CPU") != NULL) { threads_per_cpu = atoi (g_getenv ("MONO_THREADS_PER_CPU")); @@ -998,21 +1010,13 @@ mono_thread_pool_add (MonoObject *target, MonoMethodMessage *msg, MonoDelegate * MonoAsyncResult *ares; ASyncCall *ac; -#ifdef HAVE_BOEHM_GC - ac = GC_MALLOC (sizeof (ASyncCall)); -#elif defined(HAVE_SGEN_GC) - ac = mono_object_new (mono_domain_get (), async_call_klass); -#else - /* We'll leak the event if creaated... */ - ac = g_new0 (ASyncCall, 1); -#endif - ac->wait_event = 0; + ac = (ASyncCall*)mono_object_new (mono_domain_get (), async_call_klass); MONO_OBJECT_SETREF (ac, msg, msg); MONO_OBJECT_SETREF (ac, state, state); if (async_callback) { ac->cb_method = mono_get_delegate_invoke (((MonoObject *)async_callback)->vtable->klass); - ac->cb_target = async_callback; + MONO_OBJECT_SETREF (ac, cb_target, async_callback); } ares = mono_async_result_new (domain, NULL, ac->state, NULL, (MonoObject*)ac); @@ -1076,6 +1080,7 @@ mono_thread_pool_finish (MonoAsyncResult *ares, MonoArray **out_args, MonoObject if (!ares->completed) { if (ares->handle == NULL) { ac->wait_event = (gsize)CreateEvent (NULL, TRUE, FALSE, NULL); + g_assert(ac->wait_event != 0); MONO_OBJECT_SETREF (ares, handle, (MonoObject *) mono_wait_handle_new (mono_object_domain (ares), (gpointer)(gsize)ac->wait_event)); } mono_monitor_exit ((MonoObject *) ares); @@ -1106,6 +1111,7 @@ mono_thread_pool_cleanup (void) socket_io_cleanup (&socket_io_data); } +/* FIXME: GC: adds managed objects to the list... */ static void append_job (CRITICAL_SECTION *cs, GList **plist, gpointer ar) {