I am using libevent 1.1a in our product. We have ever ported our product
from 32-bit Solaris to 64-bit Solaris,
that time I did not make any change to libevent source code, for from my
point of view, libevent is safe for 64-bit porting.
The first question I would like to confirm is, whether libevent pass 64-bit
Solaris environment test?
The second problem is, our tester came across the following problem when he
run our product with high call load on 64-bit Solaris environment.
Assertion failed: events[i].fd < devpollop->nfds, file
/vobs/css/siptrans/contrib/libevent/src/devpoll.c, line 271.
I can not figure out what caused such failure, appreciate your help.
Thanks a lot,
Liang
I pasted the related function as below,
227 int
228 devpoll_dispatch(struct event_base *base, void *arg, struct timeval
*tv)
229 {
230 struct devpollop *devpollop = arg;
231 struct pollfd *events = devpollop->events;
232 struct dvpoll dvp;
233 struct evdevpoll *evdp;
234 int i, res, timeout;
235
236 if (evsignal_deliver(&devpollop->evsigmask) == -1)
237 return (-1);
238
239 if (devpollop->nchanges)
240 devpoll_commit(devpollop);
241
242 timeout = tv->tv_sec * 1000 + (tv->tv_usec + 999) / 1000;
243
244 dvp.dp_fds = devpollop->events;
245 dvp.dp_nfds = devpollop->nevents;
246 dvp.dp_timeout = timeout;
247
248 res = ioctl(devpollop->dpfd, DP_POLL, &dvp);
249
250 if (evsignal_recalc(&devpollop->evsigmask) == -1)
251 return (-1);
252
253 if (res == -1) {
254 if (errno != EINTR) {
255 event_warn("ioctl: DP_POLL");
256 return (-1);
257 }
258
259 evsignal_process();
260 return (0);
261 } else if (evsignal_caught)
262 evsignal_process();
263
264 event_debug(("%s: devpoll_wait reports %d", __func__, res));
265
266 for (i = 0; i < res; i++) {
267 int which = 0;
268 int what = events[i].revents;
269 struct event *evread = NULL, *evwrite = NULL;
270
271 assert(events[i].fd < devpollop->nfds);
272 evdp = &devpollop->fds[events[i].fd];
273
274 if (what & POLLHUP)
275 what |= POLLIN | POLLOUT;
276 else if (what & POLLERR)
277 what |= POLLIN | POLLOUT;
278
279 if (what & POLLIN) {
280 evread = evdp->evread;
281 which |= EV_READ;
282 }
283
284 if (what & POLLOUT) {
285 evwrite = evdp->evwrite;
286 which |= EV_WRITE;
287 }
288
289 if (!which)
290 continue;
291
292 if (evread != NULL && !(evread->ev_events &
EV_PERSIST))
293 event_del(evread);
294 if (evwrite != NULL && evwrite != evread &&
295 !(evwrite->ev_events & EV_PERSIST))
296 event_del(evwrite);
297
298 if (evread != NULL)
299 event_active(evread, EV_READ, 1);
300 if (evwrite != NULL)
301 event_active(evwrite, EV_WRITE, 1);
302 }
303
304 return (0);
305 }
_______________________________________________
Libevent-users mailing list
[email protected]
http://monkey.org/mailman/listinfo/libevent-users