62 } |
62 } |
63 |
63 |
64 return ev; |
64 return ev; |
65 } |
65 } |
66 |
66 |
|
67 static volatile int ev_close = 0; |
|
68 |
|
69 void ev_instance_close(EventHandler *h) { |
|
70 EventHandlerSolaris *ev = (EventHandlerSolaris*)h; |
|
71 close(ev->port); |
|
72 ev_close = 1; |
|
73 } |
|
74 |
|
75 // unique event addr that indicates shutdown |
|
76 static Event shutdown_event; |
|
77 void ev_instance_shutdown(EventHandler *h) { |
|
78 event_send(h, &shutdown_event); |
|
79 } |
|
80 |
67 |
81 |
68 void ev_handle_events(EventHandlerSolaris *ev) { |
82 void ev_handle_events(EventHandlerSolaris *ev) { |
69 EventHandler *h = (EventHandler*)ev; |
83 EventHandler *h = (EventHandler*)ev; |
70 port_event_t events[EV_MAX_EVENTS]; |
84 port_event_t events[EV_MAX_EVENTS]; |
71 Event *finished[EV_MAX_EVENTS]; |
85 Event *finished[EV_MAX_EVENTS]; |
76 for(;;) { |
90 for(;;) { |
77 // wait for events |
91 // wait for events |
78 uint_t nev = 1; |
92 uint_t nev = 1; |
79 int ret = port_getn(ev->port, events, EV_MAX_EVENTS, &nev, &timeout); |
93 int ret = port_getn(ev->port, events, EV_MAX_EVENTS, &nev, &timeout); |
80 if(ret == -1) { |
94 if(ret == -1) { |
81 // TODO: check for error |
95 if(errno != EINTR && errno != ETIME) { |
82 perror("port_getn"); |
96 if(!ev_close) { |
|
97 log_ereport(LOG_CATASTROPHE, "port_getn failed: %s", strerror(errno)); |
|
98 } |
|
99 break; |
|
100 } |
83 continue; |
101 continue; |
84 } |
102 } |
85 |
103 |
86 int numfinished = 0; |
104 int numfinished = 0; |
87 ev->numret = 0; |
105 ev->numret = 0; |
118 perror("port_associate"); |
136 perror("port_associate"); |
119 } |
137 } |
120 } else if(event->finish) { |
138 } else if(event->finish) { |
121 event->finish(h, event); |
139 event->finish(h, event); |
122 } |
140 } |
|
141 } else if(event == &shutdown_event) { |
|
142 ev_instance_close(h); |
123 } |
143 } |
124 } |
144 } |
125 } |
145 } |
126 // call event finish handlers |
146 // call event finish handlers |
127 for(int i=0;i<numfinished;i++) { |
147 for(int i=0;i<numfinished;i++) { |
135 for(int i=0;i<ev->base.numret;i++) { |
155 for(int i=0;i<ev->base.numret;i++) { |
136 EVReturn ret = ev->base.fnreturn[i]; |
156 EVReturn ret = ev->base.fnreturn[i]; |
137 nsapi_saf_return(ret.sn, ret.rq, ret.ret); |
157 nsapi_saf_return(ret.sn, ret.rq, ret.ret); |
138 } |
158 } |
139 } |
159 } |
|
160 |
|
161 free(ev); |
140 } |
162 } |
141 |
163 |
142 int ev_convert2sys_events(int events) { |
164 int ev_convert2sys_events(int events) { |
143 int e = 0; |
165 int e = 0; |
144 if((events & EVENT_POLLIN) == EVENT_POLLIN) { |
166 if((events & EVENT_POLLIN) == EVENT_POLLIN) { |