CF_EXPORT void rwsched_CFRunLoopInit(void) { // Register the rwsched_CFRunLoop types RW_CF_TYPE_REGISTER(rwsched_CFRunLoopSourceRef); RW_CF_TYPE_REGISTER(rwsched_CFRunLoopTimerRef); }
void rwmsg_toysched_init(rwmsg_toysched_t *tsched) { rwsched_instance_ptr_t instance; rwmsg_toysched_t *toysched = tsched; // Register the rwmsg types RW_CF_TYPE_REGISTER(rwtoytask_tasklet_ptr_t); RW_CF_TYPE_REGISTER(rwmsg_toyfd_ptr_t); RW_CF_TYPE_REGISTER(rwmsg_toytimer_ptr_t); // Zero out the toysched structure RW_ZERO_VARIABLE(toysched); // Create an instance of the toy scheduler instance = rwsched_instance_new(); RW_CF_TYPE_VALIDATE(instance, rwsched_instance_ptr_t); // Store the rwsched instance into the toysched data structure toysched->rwsched_instance = instance; }
RwTaskletPluginComponentHandle * rwlogd__component__component_init(RwTaskletPluginComponent *self) { rwlogd_component_ptr_t component; RwTaskletPluginComponentHandle *h_component; gpointer handle; // Register the RW.Init types RW_CF_TYPE_REGISTER(rwlogd_component_ptr_t); RW_CF_TYPE_REGISTER(rwlogd_instance_ptr_t); // Allocate a new rwlogd_component structure component = RW_CF_TYPE_MALLOC0(sizeof(*component), rwlogd_component_ptr_t); RW_CF_TYPE_VALIDATE(component, rwlogd_component_ptr_t); // Allocate a gobject for the handle handle = g_object_new(RW_TASKLET_PLUGIN_TYPE_COMPONENT_HANDLE, 0); h_component = RW_TASKLET_PLUGIN_COMPONENT_HANDLE(handle); h_component->priv = (gpointer) component; // Return the handle to the rwtasklet component return h_component; }
rwsched_instance_t * rwsched_instance_new(void) { struct rwsched_instance_s *instance; // Allocate memory for the new instance // Register the rwsched instance types RW_CF_TYPE_REGISTER(rwsched_instance_ptr_t); RW_CF_TYPE_REGISTER(rwsched_tasklet_ptr_t); rwsched_CFRunLoopInit(); rwsched_CFSocketInit(); // Allocate the Master Resource-Tracking Handle g_rwresource_track_handle = RW_RESOURCE_TRACK_CREATE_CONTEXT("The Master Context"); // Allocate a rwsched instance type and track it instance = RW_CF_TYPE_MALLOC0(sizeof(*instance), rwsched_instance_ptr_t); RW_CF_TYPE_VALIDATE(instance, rwsched_instance_ptr_t); // Set the instance configuration instance->config.single_thread = TRUE; // For now use libdispatch only instance->use_libdispatch_only = TRUE; // libdispatch_init(); // Fake up a rwqueue placeholder object to use as the (NULL) DISPATCH_TARGET_QUEUE_DEFAULT RW_ASSERT(instance->use_libdispatch_only); instance->default_rwqueue = (rwsched_dispatch_queue_t) RW_MALLOC0_TYPE(sizeof(*instance->default_rwqueue), rwsched_dispatch_queue_t); RW_ASSERT_TYPE(instance->default_rwqueue, rwsched_dispatch_queue_t); instance->default_rwqueue->header.libdispatch_object._dq = DISPATCH_TARGET_QUEUE_DEFAULT; // Fake up a rwqueue placeholder object to use as DISPATCH_TARGET_QUEUE_MAIN RW_ASSERT(instance->use_libdispatch_only); instance->main_rwqueue = (rwsched_dispatch_queue_t) RW_MALLOC0_TYPE(sizeof(*instance->main_rwqueue), rwsched_dispatch_queue_t); RW_ASSERT_TYPE(instance->main_rwqueue, rwsched_dispatch_queue_t); instance->main_rwqueue->header.libdispatch_object._dq = dispatch_get_main_queue(); // Fake up rwqueue placeholder objects for the usual four global // queues. The pri values are not 0,1,2,3 or similar, they are // -MAX, -2, 0, 2. We do not support arbitrary pri values, although // I think the dispatch API is intended to. RW_ASSERT(instance->use_libdispatch_only); RW_STATIC_ASSERT(RWSCHED_DISPATCH_QUEUE_GLOBAL_CT == 4); static long pris[RWSCHED_DISPATCH_QUEUE_GLOBAL_CT] = { DISPATCH_QUEUE_PRIORITY_HIGH, DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_PRIORITY_LOW, DISPATCH_QUEUE_PRIORITY_BACKGROUND }; int i; for (i=0; i<RWSCHED_DISPATCH_QUEUE_GLOBAL_CT; i++) { instance->global_rwqueue[i].pri = pris[i]; instance->global_rwqueue[i].rwq = (rwsched_dispatch_queue_t) RW_MALLOC0_TYPE(sizeof(*instance->global_rwqueue[i].rwq), rwsched_dispatch_queue_t); RW_ASSERT_TYPE(instance->global_rwqueue[i].rwq, rwsched_dispatch_queue_t); instance->global_rwqueue[i].rwq->header.libdispatch_object._dq = dispatch_get_global_queue(pris[i], 0); RW_ASSERT(instance->global_rwqueue[i].rwq->header.libdispatch_object._dq); } instance->main_cfrunloop_mode = kCFRunLoopDefaultMode; //instance->main_cfrunloop_mode = CFSTR("TimerMode"); //instance->deferred_cfrunloop_mode = CFSTR("Deferred Mode"); // Allocate an array of tasklet pointers and track it rwsched_tasklet_t *tasklet = NULL; instance->tasklet_array = g_array_sized_new(TRUE, TRUE, sizeof(void *), 256); g_array_append_val(instance->tasklet_array, tasklet); rwsched_instance_ref(instance); ck_pr_inc_32(&g_rwsched_instance_count); //RW_ASSERT(g_rwsched_instance_count <= 2); g_rwsched_instance = instance; instance->rwlog_instance = rwlog_init("RW.Sched"); // Return the instance pointer return instance; }