void iomplx_init(iomplx_instance *mplx, init_func init, unsigned int threads) { int set = 1; mplx->thread_init = init; mplx->threads = threads; mplx->active_list_size[THREAD_0] = 10; mplx->active_list_size[THREAD_N] = IOMPLX_MAX_ACTIVE_ITEMS/threads + (IOMPLX_MAX_ACTIVE_ITEMS%threads != 0? 1 : 0); uqueue_init(&mplx->accept_uqueue); uqueue_init(&mplx->n_uqueue); pipe(mplx->recycler); ioctl(mplx->recycler[0], FIONBIO, &set); mplx->recycler_item.fd = mplx->recycler[0]; mplx->recycler_item.oneshot = 1; iomplx_item_filter_set(&mplx->recycler_item, IOMPLX_READ); iomplx_item_add(mplx, &mplx->recycler_item, 1); DLIST_INIT(&mplx->items_to_check); }
/** @internal @This allocates an nacl audio pipe. * * @param mgr common management structure * @param uprobe structure used to raise events * @param signature signature of the pipe allocator * @param args optional arguments * @return pointer to upipe or NULL in case of allocation error */ static struct upipe *upipe_nacl_audio_alloc(struct upipe_mgr *mgr, struct uprobe *uprobe, uint32_t signature, va_list args) { if (signature != UPIPE_VOID_SIGNATURE) return NULL; struct upipe_nacl_audio *upipe_nacl_audio = malloc(sizeof(struct upipe_nacl_audio) + uqueue_sizeof(MAX_QUEUE_LENGTH)); if (unlikely(upipe_nacl_audio == NULL)) return NULL; if(unlikely(!uqueue_init(&upipe_nacl_audio->uqueue, MAX_QUEUE_LENGTH, upipe_nacl_audio->uqueue_extra))) { free(upipe_nacl_audio); return NULL; } struct upipe *upipe = upipe_nacl_audio_to_upipe(upipe_nacl_audio); upipe_init(upipe, mgr, uprobe); upipe_nacl_audio_init_urefcount(upipe); upipe_nacl_audio_init_input(upipe); upipe_nacl_audio_init_upump_mgr(upipe); upipe_nacl_audio_init_upump(upipe); upipe_nacl_audio_init_uclock(upipe); upipe_nacl_audio->started = false; PPB_AudioConfig *audio_config_interface = (PPB_AudioConfig *)PSGetInterface(PPB_AUDIO_CONFIG_INTERFACE); upipe_nacl_audio->nb_samples = audio_config_interface->RecommendSampleFrameCount(PSGetInstanceId(), SAMPLE_RATE, NB_SAMPLES); upipe_nacl_audio->audio_config = audio_config_interface->CreateStereo16Bit(PSGetInstanceId(), SAMPLE_RATE, upipe_nacl_audio->nb_samples); upipe_nacl_audio->core_interface = (PPB_Core *)PSGetInterface(PPB_CORE_INTERFACE); upipe_nacl_audio->audio_interface = (PPB_Audio *)PSGetInterface(PPB_AUDIO_INTERFACE); upipe_nacl_audio->audio = upipe_nacl_audio->audio_interface->Create(PSGetInstanceId(), upipe_nacl_audio->audio_config, upipe_nacl_audio_worker, upipe); upipe_throw_ready(upipe); return upipe; }
/** @internal @This is the callback of upumpstart, start the QT Thread * * @param upumpstart pump that start this */ void start(struct upump *upumpstart){ struct upipe *upipe = upump_get_opaque(upumpstart, struct upipe *); struct upipe_qt_html *upipe_qt_html = upipe_qt_html_from_upipe(upipe); upipe_qt_html->qtthreadfree = false; upipe_qt_html->uqueue_extra = (uint8_t*)malloc(uqueue_sizeof(MAX_QUEUE_LENGTH)); uqueue_init(&upipe_qt_html->uqueue, MAX_QUEUE_LENGTH, upipe_qt_html->uqueue_extra); upipe_qt_html->uqueue_extra2 = (uint8_t*)malloc(uqueue_sizeof(MAX_QUEUE_LENGTH)); uqueue_init(&upipe_qt_html->uqueue2, MAX_QUEUE_LENGTH, upipe_qt_html->uqueue_extra2); struct upump *upump = uqueue_upump_alloc_pop(&upipe_qt_html->uqueue, upipe_qt_html->upump_mgr, upipe_qt_html_worker, upipe, upipe->refcount); upipe_qt_html_set_upump(upipe, upump); upump_start(upump); upipe_qt_html->url = "http://upipe.org/blog/"; pthread_create(&upipe_qt_html->thread, NULL, thread_start, (void *)upipe_qt_html); upipe_qt_html_clean_upumpstart(upipe); upipe_qt_html_set_upumpstart(upipe,NULL); }