|
|
|
@ -38,7 +38,9 @@ TR_eventDispatcherStart(TR_EventDispatcher this) |
|
|
|
while (this->running || (! TR_queueEmpty(this->events))) { |
|
|
|
struct timespec tp; |
|
|
|
int now; // milliseconds |
|
|
|
TR_Event current = NULL; |
|
|
|
TR_Event event; |
|
|
|
TR_Queue handler_queue; |
|
|
|
TR_HashValue handler_queue_hv; |
|
|
|
|
|
|
|
clock_gettime(CLOCK_REALTIME, &tp); |
|
|
|
now = tp.tv_sec * 1000 + tp.tv_nsec / 1000000; |
|
|
|
@ -55,27 +57,25 @@ TR_eventDispatcherStart(TR_EventDispatcher this) |
|
|
|
|
|
|
|
if (TR_queueEmpty(this->events)) { |
|
|
|
if (TR_EVD_CLIENT == this->mode) { |
|
|
|
current = TR_eventSubjectEmit( |
|
|
|
event = TR_eventSubjectEmit( |
|
|
|
(TR_EventSubject)this, |
|
|
|
TR_DISPATCHER_EVENT_USER_WAIT, |
|
|
|
NULL); |
|
|
|
} else { |
|
|
|
current = TR_eventSubjectEmit( |
|
|
|
event = TR_eventSubjectEmit( |
|
|
|
(TR_EventSubject)this, |
|
|
|
TR_DISPATCHER_EVENT_DATA_WAIT, |
|
|
|
NULL); |
|
|
|
} |
|
|
|
} else { |
|
|
|
current = TR_queueGet(this->events); |
|
|
|
event = TR_queueGet(this->events); |
|
|
|
} |
|
|
|
|
|
|
|
if (current) { |
|
|
|
TR_Queue handler_queue; |
|
|
|
TR_HashValue handler_queue_hv = TR_hashGetByVal( |
|
|
|
handler_queue_hv = TR_hashGetByVal( |
|
|
|
this->handler, |
|
|
|
TR_sdbm( |
|
|
|
(unsigned char *)&(current->id), |
|
|
|
sizeof(current->id))); |
|
|
|
(unsigned char *)&(event->id), |
|
|
|
sizeof(event->id))); |
|
|
|
|
|
|
|
handler_queue = handler_queue_hv |
|
|
|
? *(TR_Queue *)handler_queue_hv->value |
|
|
|
@ -83,15 +83,23 @@ TR_eventDispatcherStart(TR_EventDispatcher this) |
|
|
|
|
|
|
|
if (handler_queue && ! TR_queueEmpty(handler_queue)) { |
|
|
|
TR_Queue queue_node = handler_queue->first; |
|
|
|
TR_EventDone done; |
|
|
|
|
|
|
|
while (queue_node) { |
|
|
|
TR_EventHandler handler = queue_node->msg; |
|
|
|
if (TR_eventHandlerHandleEvent(handler, current)) break; |
|
|
|
TR_EventDone this_done; |
|
|
|
|
|
|
|
this_done = TR_eventHandlerHandleEvent(handler, event); |
|
|
|
done = TR_EVENT_DONE == done ? done : this_done; |
|
|
|
|
|
|
|
queue_node = queue_node->next; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
TR_delete(current); |
|
|
|
if (TR_EVENT_DONE == done) { |
|
|
|
TR_delete(event); |
|
|
|
} else { |
|
|
|
TR_eventDispatcherEnqueueEvent(this, event); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|