src/server/daemon/event_solaris.c

changeset 547
280bf87c8689
parent 541
1e1fca11aaff
child 552
4ed0e46aa9dc
equal deleted inserted replaced
546:5494c28db896 547:280bf87c8689
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) {

mercurial