void ijkio_manager_destroy(IjkIOManagerContext *h) { if (h->ijkio_app_ctx) { ijk_map_traversal_handle(h->ijkio_app_ctx->cache_info_map, tree_destroy); ijk_map_destroy(h->ijkio_app_ctx->cache_info_map); h->ijkio_app_ctx->cache_info_map = NULL; if (h->ijkio_app_ctx->threadpool_ctx) { ijk_threadpool_destroy(h->ijkio_app_ctx->threadpool_ctx, IJK_IMMEDIATE_SHUTDOWN); } if (0 != strlen(h->ijkio_app_ctx->cache_file_path)) { if (h->ijkio_app_ctx->fd >= 0) { close(h->ijkio_app_ctx->fd); } remove(h->ijkio_app_ctx->cache_file_path); } ijkio_application_closep(&h->ijkio_app_ctx); } ijk_map_destroy(h->ijk_ctx_map); h->ijk_ctx_map = NULL; free(h); }
IjkThreadPoolContext *ijk_threadpool_create(int thread_count, int queue_size, int flags) { IjkThreadPoolContext *ctx; int i; if(thread_count <= 0 || thread_count > MAX_THREADS || queue_size <= 0 || queue_size > MAX_QUEUE) { return NULL; } if((ctx = (IjkThreadPoolContext *)calloc(1, sizeof(IjkThreadPoolContext))) == NULL) { goto err; } ctx->queue_size = queue_size; /* Allocate thread and task queue */ ctx->threads = (pthread_t *)calloc(1, sizeof(pthread_t) * thread_count); ctx->queue = (IjkThreadPoolTask *)calloc (queue_size, sizeof(IjkThreadPoolTask)); /* Initialize mutex and conditional variable first */ if((pthread_mutex_init(&(ctx->lock), NULL) != 0) || (pthread_cond_init(&(ctx->notify), NULL) != 0) || (ctx->threads == NULL) || (ctx->queue == NULL)) { goto err; } /* Start worker threads */ for(i = 0; i < thread_count; i++) { if(pthread_create(&(ctx->threads[i]), NULL, ijk_threadpool_thread, (void*)ctx) != 0) { ijk_threadpool_destroy(ctx, 0); return NULL; } ctx->thread_count++; ctx->started_count++; } return ctx; err: if(ctx) { ijk_threadpool_free(ctx); } return NULL; }