Commit a17bd09dfed67e5ef9f08ca90a9053f5db3382d3

Authored by Georg Hopp
1 parent 83ee50f9

create explicit event done type and reissue event is no handler has returned EVENT_DONE.

... ... @@ -32,6 +32,11 @@
32 32
33 33 TR_CLASS(TR_EventDispatcher);
34 34
  35 +typedef enum TR_EventDone_e {
  36 + TR_EVENT_DONE = 0,
  37 + TR_EVENT_PENDING
  38 +} TR_EventDone;
  39 +
35 40 #include "tr/event_handler.h"
36 41
37 42 typedef enum TR_e_EventDispatcherMode {
... ...
... ... @@ -35,7 +35,7 @@ TR_CLASS(TR_EventHandler);
35 35
36 36 #include "tr/event_dispatcher.h"
37 37
38   -typedef int (* TR_EventMethod_fptr)(TR_EventHandler, TR_Event);
  38 +typedef TR_EventDone (* TR_EventMethod_fptr)(TR_EventHandler, TR_Event);
39 39
40 40 TR_CLASS(TR_EventHandler) {
41 41 TR_EventDispatcher dispatcher[10];
... ... @@ -46,9 +46,9 @@ TR_CLASSVARS_DECL(TR_EventHandler) {
46 46 TR_Hash event_methods;
47 47 };
48 48
49   -void TR_eventHandlerSetDispatcher(TR_EventHandler, TR_EventDispatcher);
50   -void TR_eventHandlerIssueEvent(TR_EventHandler, TR_Event);
51   -int TR_eventHandlerHandleEvent(TR_EventHandler, TR_Event);
  49 +void TR_eventHandlerSetDispatcher(TR_EventHandler, TR_EventDispatcher);
  50 +void TR_eventHandlerIssueEvent(TR_EventHandler, TR_Event);
  51 +TR_EventDone TR_eventHandlerHandleEvent(TR_EventHandler, TR_Event);
52 52
53 53 #define TR_eventHandlerClassCleanup(cname) \
54 54 (TR__eventHandlerClassCleanup(TR_CLASS_BY_NAME(cname)))
... ... @@ -68,7 +68,6 @@ void TR__eventHandlerClassCleanup(TR_class_ptr);
68 68 sizeof(TR_EventMethod_fptr))); \
69 69 } while(0)
70 70
71   -
72 71 #endif // __TR_EVENT_HANDLER_H__
73 72
74 73 // vim: set ts=4 sw=4:
... ...
... ... @@ -38,7 +38,9 @@ TR_eventDispatcherStart(TR_EventDispatcher this)
38 38 while (this->running || (! TR_queueEmpty(this->events))) {
39 39 struct timespec tp;
40 40 int now; // milliseconds
41   - TR_Event current = NULL;
  41 + TR_Event event;
  42 + TR_Queue handler_queue;
  43 + TR_HashValue handler_queue_hv;
42 44
43 45 clock_gettime(CLOCK_REALTIME, &tp);
44 46 now = tp.tv_sec * 1000 + tp.tv_nsec / 1000000;
... ... @@ -55,43 +57,49 @@ TR_eventDispatcherStart(TR_EventDispatcher this)
55 57
56 58 if (TR_queueEmpty(this->events)) {
57 59 if (TR_EVD_CLIENT == this->mode) {
58   - current = TR_eventSubjectEmit(
  60 + event = TR_eventSubjectEmit(
59 61 (TR_EventSubject)this,
60 62 TR_DISPATCHER_EVENT_USER_WAIT,
61 63 NULL);
62 64 } else {
63   - current = TR_eventSubjectEmit(
  65 + event = TR_eventSubjectEmit(
64 66 (TR_EventSubject)this,
65 67 TR_DISPATCHER_EVENT_DATA_WAIT,
66 68 NULL);
67 69 }
68 70 } else {
69   - current = TR_queueGet(this->events);
  71 + event = TR_queueGet(this->events);
70 72 }
71 73
72   - if (current) {
73   - TR_Queue handler_queue;
74   - TR_HashValue handler_queue_hv = TR_hashGetByVal(
75   - this->handler,
76   - TR_sdbm(
77   - (unsigned char *)&(current->id),
78   - sizeof(current->id)));
79   -
80   - handler_queue = handler_queue_hv
81   - ? *(TR_Queue *)handler_queue_hv->value
82   - : NULL;
83   -
84   - if (handler_queue && ! TR_queueEmpty(handler_queue)) {
85   - TR_Queue queue_node = handler_queue->first;
86   -
87   - while (queue_node) {
88   - TR_EventHandler handler = queue_node->msg;
89   - if (TR_eventHandlerHandleEvent(handler, current)) break;
90   - queue_node = queue_node->next;
91   - }
  74 + handler_queue_hv = TR_hashGetByVal(
  75 + this->handler,
  76 + TR_sdbm(
  77 + (unsigned char *)&(event->id),
  78 + sizeof(event->id)));
  79 +
  80 + handler_queue = handler_queue_hv
  81 + ? *(TR_Queue *)handler_queue_hv->value
  82 + : NULL;
  83 +
  84 + if (handler_queue && ! TR_queueEmpty(handler_queue)) {
  85 + TR_Queue queue_node = handler_queue->first;
  86 + TR_EventDone done;
  87 +
  88 + while (queue_node) {
  89 + TR_EventHandler handler = queue_node->msg;
  90 + TR_EventDone this_done;
  91 +
  92 + this_done = TR_eventHandlerHandleEvent(handler, event);
  93 + done = TR_EVENT_DONE == done ? done : this_done;
  94 +
  95 + queue_node = queue_node->next;
92 96 }
93 97
94   - TR_delete(current);
  98 + if (TR_EVENT_DONE == done) {
  99 + TR_delete(event);
  100 + } else {
  101 + TR_eventDispatcherEnqueueEvent(this, event);
  102 + }
95 103 }
96 104 }
97 105 }
... ...
... ... @@ -27,7 +27,7 @@
27 27 #include "tr/event.h"
28 28 #include "tr/event_handler.h"
29 29
30   -int
  30 +TR_EventDone
31 31 TR_eventHandlerHandleEvent(TR_EventHandler this, TR_Event event)
32 32 {
33 33 TR_EventMethod_fptr event_func = NULL;
... ...
Please register or login to post a comment