EnterCriticalSection (&data->io_lock);
if (data->inited == 0) {
g_free (pfds);
+ LeaveCriticalSection (&data->io_lock);
return; /* cleanup called */
}
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);
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;
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;
{
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) */
}
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;
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"));
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);
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);
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)
{