// thread
static int worker_thread_cnt = 0;
-#define DEFAULT_WORKER_THREAD_CNT 4
+static int idle_thread_cnt = 0;
+#define DEFAULT_WORKER_THREAD_CNT 8
static void *maru_brill_codec_threads(void *opaque);
static void maru_brill_codec_get_cpu_cores(void)
{
worker_thread_cnt = get_number_of_processors();
- if (worker_thread_cnt == 1) {
+ if (worker_thread_cnt < DEFAULT_WORKER_THREAD_CNT) {
worker_thread_cnt = DEFAULT_WORKER_THREAD_CNT;
}
}
maru_brill_codec_add_ioparam_queue(s, (void *)ioparam);
+
qemu_mutex_lock(&s->context_mutex);
+ // W/A for threads starvation.
+ while (idle_thread_cnt == 0) {
+ qemu_mutex_unlock(&s->context_mutex);
+ TRACE("Worker threads are exhausted\n");
+ usleep(2000); // wait 2ms.
+ qemu_mutex_lock(&s->context_mutex);
+ }
qemu_cond_signal(&s->threadpool.cond);
qemu_mutex_unlock(&s->context_mutex);
}
CodecParamStg *elem = NULL;
qemu_mutex_lock(&s->context_mutex);
+ ++idle_thread_cnt; // protected under mutex.
qemu_cond_wait(&s->threadpool.cond, &s->context_mutex);
+ --idle_thread_cnt; // protected under mutex.
qemu_mutex_unlock(&s->context_mutex);
qemu_mutex_lock(&s->ioparam_queue_mutex);