{
int ret = CAMERA_ERROR_NONE;
- if (!job) {
- LOGE("NULL job");
- return;
- }
-
if (!muse_camera) {
LOGE("NULL handle");
goto _PROCESS_DONE;
{
muse_camera_handle_s *muse_camera = (muse_camera_handle_s *)data;
muse_camera_task_job_s *job = NULL;
+ gint64 end_time = 0;
+ bool is_signaled = false;
+ bool use_wait_until = false;
if (!muse_camera) {
LOGE("NULL handle");
return NULL;
}
- LOGD("enter");
+ LOGW("enter");
g_mutex_lock(&muse_camera->task_lock);
while (muse_camera->task_run) {
if (g_queue_is_empty(&muse_camera->task_queue)) {
- LOGD("empty queue. wait signal");
- g_cond_wait(&muse_camera->task_cond, &muse_camera->task_lock);
- LOGD("signal received");
+ LOGD("empty queue. wait signal [wait until %d]", use_wait_until);
+
+ if (use_wait_until) {
+ end_time = g_get_monotonic_time() + G_TIME_SPAN_SECOND;
+ is_signaled = g_cond_wait_until(&muse_camera->task_cond, &muse_camera->task_lock, end_time);
+ } else {
+ g_cond_wait(&muse_camera->task_cond, &muse_camera->task_lock);
+ is_signaled = true;
+ }
+
+ /*LOGD("is_signaled %d", is_signaled);*/
}
if (!muse_camera->task_run) {
- LOGD("stop task thread");
+ LOGW("stop task thread : is_signaled %d", is_signaled);
break;
}
job = (muse_camera_task_job_s *)g_queue_pop_head(&muse_camera->task_queue);
+ if (!job) {
+ if (is_signaled)
+ LOGE("signal received, but no job");
+
+ continue;
+ }
+
+ if (job->api == MUSE_CAMERA_API_STOP_PREVIEW)
+ use_wait_until = true;
+ else
+ use_wait_until = false;
g_mutex_unlock(&muse_camera->task_lock);
while (!g_queue_is_empty(&muse_camera->task_queue)) {
job = (muse_camera_task_job_s *)g_queue_pop_head(&muse_camera->task_queue);
-
- if (job)
+ if (job) {
LOGW("remained job - api %d", job->api);
-
- __camera_task_process_job(muse_camera, job);
+ __camera_task_process_job(muse_camera, job);
+ }
}
g_mutex_unlock(&muse_camera->task_lock);
- LOGD("leave");
+ LOGW("leave");
return NULL;
}