static void initialize (void) { g_assert (!threadpool_io); threadpool_io = g_new0 (ThreadPoolIO, 1); g_assert (threadpool_io); mono_mutex_init_recursive (&threadpool_io->updates_lock); mono_cond_init (&threadpool_io->updates_cond, 0); mono_gc_register_root ((void*)&threadpool_io->updates [0], sizeof (threadpool_io->updates), MONO_GC_DESCRIPTOR_NULL, MONO_ROOT_SOURCE_THREAD_POOL, "i/o thread pool updates list"); threadpool_io->updates_size = 0; threadpool_io->backend = backend_poll; if (g_getenv ("MONO_ENABLE_AIO") != NULL) { #if defined(HAVE_EPOLL) threadpool_io->backend = backend_epoll; #elif defined(HAVE_KQUEUE) threadpool_io->backend = backend_kqueue; #endif } wakeup_pipes_init (); if (!threadpool_io->backend.init (threadpool_io->wakeup_pipes [0])) g_error ("initialize: backend->init () failed"); if (!mono_thread_create_internal (mono_get_root_domain (), selector_thread, NULL, TRUE, SMALL_STACK)) g_error ("initialize: mono_thread_create_internal () failed"); }
void* mono_gc_alloc_fixed (size_t size, void *descr) { /* FIXME: do a single allocation */ void *res = calloc (1, size); if (!res) return NULL; if (!mono_gc_register_root (res, size, descr)) { free (res); res = NULL; } return res; }