Commit a17bd09dfed67e5ef9f08ca90a9053f5db3382d3
1 parent
83ee50f9
create explicit event done type and reissue event is no handler has returned EVENT_DONE.
Showing
4 changed files
with
43 additions
and
31 deletions
@@ -32,6 +32,11 @@ | @@ -32,6 +32,11 @@ | ||
32 | 32 | ||
33 | TR_CLASS(TR_EventDispatcher); | 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 | #include "tr/event_handler.h" | 40 | #include "tr/event_handler.h" |
36 | 41 | ||
37 | typedef enum TR_e_EventDispatcherMode { | 42 | typedef enum TR_e_EventDispatcherMode { |
@@ -35,7 +35,7 @@ TR_CLASS(TR_EventHandler); | @@ -35,7 +35,7 @@ TR_CLASS(TR_EventHandler); | ||
35 | 35 | ||
36 | #include "tr/event_dispatcher.h" | 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 | TR_CLASS(TR_EventHandler) { | 40 | TR_CLASS(TR_EventHandler) { |
41 | TR_EventDispatcher dispatcher[10]; | 41 | TR_EventDispatcher dispatcher[10]; |
@@ -46,9 +46,9 @@ TR_CLASSVARS_DECL(TR_EventHandler) { | @@ -46,9 +46,9 @@ TR_CLASSVARS_DECL(TR_EventHandler) { | ||
46 | TR_Hash event_methods; | 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 | #define TR_eventHandlerClassCleanup(cname) \ | 53 | #define TR_eventHandlerClassCleanup(cname) \ |
54 | (TR__eventHandlerClassCleanup(TR_CLASS_BY_NAME(cname))) | 54 | (TR__eventHandlerClassCleanup(TR_CLASS_BY_NAME(cname))) |
@@ -68,7 +68,6 @@ void TR__eventHandlerClassCleanup(TR_class_ptr); | @@ -68,7 +68,6 @@ void TR__eventHandlerClassCleanup(TR_class_ptr); | ||
68 | sizeof(TR_EventMethod_fptr))); \ | 68 | sizeof(TR_EventMethod_fptr))); \ |
69 | } while(0) | 69 | } while(0) |
70 | 70 | ||
71 | - | ||
72 | #endif // __TR_EVENT_HANDLER_H__ | 71 | #endif // __TR_EVENT_HANDLER_H__ |
73 | 72 | ||
74 | // vim: set ts=4 sw=4: | 73 | // vim: set ts=4 sw=4: |
@@ -38,7 +38,9 @@ TR_eventDispatcherStart(TR_EventDispatcher this) | @@ -38,7 +38,9 @@ TR_eventDispatcherStart(TR_EventDispatcher this) | ||
38 | while (this->running || (! TR_queueEmpty(this->events))) { | 38 | while (this->running || (! TR_queueEmpty(this->events))) { |
39 | struct timespec tp; | 39 | struct timespec tp; |
40 | int now; // milliseconds | 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 | clock_gettime(CLOCK_REALTIME, &tp); | 45 | clock_gettime(CLOCK_REALTIME, &tp); |
44 | now = tp.tv_sec * 1000 + tp.tv_nsec / 1000000; | 46 | now = tp.tv_sec * 1000 + tp.tv_nsec / 1000000; |
@@ -55,43 +57,49 @@ TR_eventDispatcherStart(TR_EventDispatcher this) | @@ -55,43 +57,49 @@ TR_eventDispatcherStart(TR_EventDispatcher this) | ||
55 | 57 | ||
56 | if (TR_queueEmpty(this->events)) { | 58 | if (TR_queueEmpty(this->events)) { |
57 | if (TR_EVD_CLIENT == this->mode) { | 59 | if (TR_EVD_CLIENT == this->mode) { |
58 | - current = TR_eventSubjectEmit( | 60 | + event = TR_eventSubjectEmit( |
59 | (TR_EventSubject)this, | 61 | (TR_EventSubject)this, |
60 | TR_DISPATCHER_EVENT_USER_WAIT, | 62 | TR_DISPATCHER_EVENT_USER_WAIT, |
61 | NULL); | 63 | NULL); |
62 | } else { | 64 | } else { |
63 | - current = TR_eventSubjectEmit( | 65 | + event = TR_eventSubjectEmit( |
64 | (TR_EventSubject)this, | 66 | (TR_EventSubject)this, |
65 | TR_DISPATCHER_EVENT_DATA_WAIT, | 67 | TR_DISPATCHER_EVENT_DATA_WAIT, |
66 | NULL); | 68 | NULL); |
67 | } | 69 | } |
68 | } else { | 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,7 +27,7 @@ | ||
27 | #include "tr/event.h" | 27 | #include "tr/event.h" |
28 | #include "tr/event_handler.h" | 28 | #include "tr/event_handler.h" |
29 | 29 | ||
30 | -int | 30 | +TR_EventDone |
31 | TR_eventHandlerHandleEvent(TR_EventHandler this, TR_Event event) | 31 | TR_eventHandlerHandleEvent(TR_EventHandler this, TR_Event event) |
32 | { | 32 | { |
33 | TR_EventMethod_fptr event_func = NULL; | 33 | TR_EventMethod_fptr event_func = NULL; |
Please
register
or
login
to post a comment