php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | |
Patch fpm-solaris-event_ports for FPM related Bug #65800Patch version 2015-09-20 08:18 UTC Return to Bug #65800 | Download this patchThis patch renders other patches obsolete Obsolete patches: Patch Revisions:Developer: rainer.jung@kippdata.de--- sapi/fpm/fpm/events/port.c 2015-09-03 23:32:51.000000000 +0200 +++ sapi/fpm/fpm/events/port.c 2015-09-20 09:36:53.865300000 +0200 @@ -116,8 +116,10 @@ */ static int fpm_event_port_wait(struct fpm_event_queue_s *queue, unsigned long int timeout) /* {{{ */ { - int ret, i, nget; + int ret; + unsigned int i, nget; timespec_t t; + struct fpm_event_s *ev; /* convert timeout into timespec_t */ t.tv_sec = (int)(timeout / 1000); @@ -125,6 +127,8 @@ /* wait for inconming event or timeout. We want at least one event or timeout */ nget = 1; + events[0].portev_user = (void *)-1; /* so we can double check that an event was returned */ + ret = port_getn(pfd, events, nevents, &nget, &t); if (ret < 0) { @@ -132,6 +136,16 @@ if (errno != EINTR && errno != ETIME) { zlog(ZLOG_WARNING, "poll() returns %d", errno); return -1; + } else if (nget > 0 && events[0].portev_user == (void *)-1) { + /* This confusing API can return an event at the same time + * that it reports EINTR or ETIME. If that occurs, just + * report the event. With EINTR, nget can be > 0 without + * any event, so check that portev_user was filled in. + * + * See discussion thread + * http://marc.info/?l=opensolaris-networking-discuss&m=125071205204540 + */ + nget = 0; } } @@ -142,8 +156,13 @@ continue; } + ev = (struct fpm_event_s *)events[i].portev_user; + + /* TODO: Escalate an error? */ + fpm_event_port_add(ev); + /* fire the event */ - fpm_event_fire((struct fpm_event_s *)events[i].portev_user); + fpm_event_fire(ev); /* sanity check */ if (fpm_globals.parent_pid != getpid()) { |
Copyright © 2001-2024 The PHP Group All rights reserved. |
Last updated: Thu Oct 10 20:01:26 2024 UTC |