Commit f6254dfb48838da1409f8fd846c5160065e79332
1 parent
a17bd09d
preparation for edge triggerd events
Showing
3 changed files
with
24 additions
and
15 deletions
... | ... | @@ -51,8 +51,10 @@ TR_CLASS(TR_EventDispatcher) { |
51 | 51 | TR_Hash handler; |
52 | 52 | TR_EventHandler default_handler; |
53 | 53 | int running; |
54 | - int heartbeat; // milliseconds | |
55 | - int nextbeat; // milliseconds | |
54 | + int pollinterval; // milliseconds | |
55 | + int nextpoll; // milliseconds | |
56 | + int heartbeat; // milliseconds | |
57 | + int nextbeat; // milliseconds | |
56 | 58 | TR_EventDispatcherMode mode; |
57 | 59 | }; |
58 | 60 | TR_INSTANCE_INIT(TR_EventDispatcher); | ... | ... |
... | ... | @@ -23,6 +23,7 @@ |
23 | 23 | #include <stdint.h> |
24 | 24 | #include <signal.h> |
25 | 25 | #include <stdio.h> |
26 | +#include <time.h> | |
26 | 27 | |
27 | 28 | #include "trbase.h" |
28 | 29 | #include "trdata.h" |
... | ... | @@ -63,6 +64,8 @@ static |
63 | 64 | int |
64 | 65 | eventDispatcherCtor(void * _this, va_list * params) { |
65 | 66 | TR_EventDispatcher this = _this; |
67 | + struct timespec tp; | |
68 | + int now; // milliseconds | |
66 | 69 | |
67 | 70 | this->events = TR_new(TR_Queue); |
68 | 71 | this->handler = TR_new(TR_Hash); |
... | ... | @@ -71,6 +74,12 @@ eventDispatcherCtor(void * _this, va_list * params) { |
71 | 74 | this->running = 0; |
72 | 75 | this->heartbeat = 0; |
73 | 76 | this->nextbeat = 0; |
77 | + this->pollinterval = va_arg(*params, int); | |
78 | + | |
79 | + clock_gettime(CLOCK_REALTIME, &tp); | |
80 | + now = tp.tv_sec * 1000 + tp.tv_nsec / 1000000; | |
81 | + | |
82 | + this->nextpoll = now + this->pollinterval; | |
74 | 83 | |
75 | 84 | if (! _TR_controlDispatcher) { |
76 | 85 | _TR_controlDispatcher = this; | ... | ... |
... | ... | @@ -30,6 +30,8 @@ |
30 | 30 | #include "tr/event_subject.h" |
31 | 31 | #include "tr/event_dispatcher.h" |
32 | 32 | |
33 | +int ZERO = 0; | |
34 | + | |
33 | 35 | void |
34 | 36 | TR_eventDispatcherStart(TR_EventDispatcher this) |
35 | 37 | { |
... | ... | @@ -55,18 +57,14 @@ TR_eventDispatcherStart(TR_EventDispatcher this) |
55 | 57 | NULL)); |
56 | 58 | } |
57 | 59 | |
58 | - if (TR_queueEmpty(this->events)) { | |
59 | - if (TR_EVD_CLIENT == this->mode) { | |
60 | - event = TR_eventSubjectEmit( | |
61 | - (TR_EventSubject)this, | |
62 | - TR_DISPATCHER_EVENT_USER_WAIT, | |
63 | - NULL); | |
64 | - } else { | |
65 | - event = TR_eventSubjectEmit( | |
66 | - (TR_EventSubject)this, | |
67 | - TR_DISPATCHER_EVENT_DATA_WAIT, | |
68 | - NULL); | |
69 | - } | |
60 | + if (TR_queueEmpty(this->events) || this->nextpoll <= now) { | |
61 | + int evtid = TR_EVD_CLIENT == this->mode | |
62 | + ? TR_DISPATCHER_EVENT_USER_WAIT | |
63 | + : TR_DISPATCHER_EVENT_DATA_WAIT; | |
64 | + int * toutptr = TR_queueEmpty(this->events) ? NULL : &ZERO; | |
65 | + | |
66 | + this->nextpoll += this->pollinterval; | |
67 | + event = TR_eventSubjectEmit((TR_EventSubject)this, evtid, toutptr); | |
70 | 68 | } else { |
71 | 69 | event = TR_queueGet(this->events); |
72 | 70 | } |
... | ... | @@ -83,7 +81,7 @@ TR_eventDispatcherStart(TR_EventDispatcher this) |
83 | 81 | |
84 | 82 | if (handler_queue && ! TR_queueEmpty(handler_queue)) { |
85 | 83 | TR_Queue queue_node = handler_queue->first; |
86 | - TR_EventDone done; | |
84 | + TR_EventDone done = TR_EVENT_PENDING; | |
87 | 85 | |
88 | 86 | while (queue_node) { |
89 | 87 | TR_EventHandler handler = queue_node->msg; | ... | ... |
Please
register
or
login
to post a comment