struct list_head *list, *other_list;
struct list_head call_list;
static pid_t waiting_tid = 0;
+ static tdm_thread_cb_type waiting_cb_type = TDM_THREAD_CB_NONE;
tdm_error ret;
TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
assert(find_funcs[cb_base->type] != NULL);
+ /* When there is the previous waiting sync call, the other type sync call CAN't be handlered */
+ if (waiting_tid > 0 && cb_base->sync == 1)
+ assert(waiting_cb_type == cb_base->type);
+
if (!object) {
object = find_funcs[cb_base->type](private_display, cb_base->object_stamp);
if (!object) {
assert(LIST_IS_EMPTY(&call_list));
- if (waiting_tid == 0) {
+ if (waiting_tid == 0 || waiting_cb_type != cb_base->type) {
LIST_FOR_EACH_ENTRY_SAFE(cb, hh, other_list, link) {
if (cb->object != object ||
cb->cb_type != cb_base->type ||
if (keep_private_thread) {
if (cb_base->sync) {
waiting_tid = 0;
+ waiting_cb_type = TDM_THREAD_CB_NONE;
pthread_cond_signal(&keep_private_thread->event_cond);
if (tdm_debug_module & TDM_DEBUG_THREAD)
TDM_INFO("pthread broadcase");
*/
tdm_mutex_locked = 0;
waiting_tid = caller_tid;
+ waiting_cb_type = cb_base->type;
+
pthread_cond_wait(&keep_private_thread->event_cond, &private_display->lock);
tdm_mutex_locked = 1;
}