Add `before_loop' parameter to lwevent_wait()
This commit is contained in:
parent
b1b20b641c
commit
20c828b73c
|
@ -90,7 +90,7 @@ void lwevent_exit(void)
|
||||||
int lwevent_loop(void)
|
int lwevent_loop(void)
|
||||||
{
|
{
|
||||||
while(!lwevent_loop_exit) {
|
while(!lwevent_loop_exit) {
|
||||||
if(lwevent_wait(-1) == -1) {
|
if(lwevent_wait(-1, 0) == -1) {
|
||||||
if(errno == EINTR) continue;
|
if(errno == EINTR) continue;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,7 @@ static void _lwevent_invalid(struct lwevent* ev)
|
||||||
* Wrapper around epoll_wait(2). For every returned event, we assume the object has an associated
|
* Wrapper around epoll_wait(2). For every returned event, we assume the object has an associated
|
||||||
* struct lwevent in the struct epoll_event.
|
* struct lwevent in the struct epoll_event.
|
||||||
*/
|
*/
|
||||||
int lwevent_wait(int timeout_ms)
|
int lwevent_wait(int timeout_ms, void (*before_loop)(void))
|
||||||
{
|
{
|
||||||
int ret, i, revents;
|
int ret, i, revents;
|
||||||
struct lwevent* ev;
|
struct lwevent* ev;
|
||||||
|
@ -137,6 +137,8 @@ int lwevent_wait(int timeout_ms)
|
||||||
ret = epoll_wait(lwevent_epoll_fd, _lw_revents, _lw_revents_size, timeout_ms);
|
ret = epoll_wait(lwevent_epoll_fd, _lw_revents, _lw_revents_size, timeout_ms);
|
||||||
if(ret == -1) return -1;
|
if(ret == -1) return -1;
|
||||||
|
|
||||||
|
if(before_loop) before_loop();
|
||||||
|
|
||||||
/* process returned events */
|
/* process returned events */
|
||||||
for(i = 0; i < ret; ++i) {
|
for(i = 0; i < ret; ++i) {
|
||||||
ev = (struct lwevent*)(_lw_revents[i].data.ptr);
|
ev = (struct lwevent*)(_lw_revents[i].data.ptr);
|
||||||
|
|
|
@ -73,6 +73,8 @@ int lwevent_loop(void);
|
||||||
|
|
||||||
\param timeout_ms A timeout, in milliseconds. This function will return as soon as any events occur,
|
\param timeout_ms A timeout, in milliseconds. This function will return as soon as any events occur,
|
||||||
but will return after \a timeout_ms milliseconds have elapsed.
|
but will return after \a timeout_ms milliseconds have elapsed.
|
||||||
|
\param before_loop If specified, a function which is called after \c epoll_wait(2) but before
|
||||||
|
processing events. May be 0.
|
||||||
\returns Number of events processed.
|
\returns Number of events processed.
|
||||||
\retval 0 on timeout.
|
\retval 0 on timeout.
|
||||||
\retval -1 on error (system call failed; see \a errno).
|
\retval -1 on error (system call failed; see \a errno).
|
||||||
|
@ -85,12 +87,16 @@ objects that are closed during the callbacks.
|
||||||
\a timeout_ms may be specified as a negative number to disable timeouts and wait forever, or as 0 to
|
\a timeout_ms may be specified as a negative number to disable timeouts and wait forever, or as 0 to
|
||||||
return immediately even if no events are available. A positive number is a duration in milliseconds.
|
return immediately even if no events are available. A positive number is a duration in milliseconds.
|
||||||
|
|
||||||
|
\a before_loop may be used to run a function before looping over any returned events. Some programs
|
||||||
|
may wish to record the time at the top of the event loop, for example, to avoid polling for it
|
||||||
|
multiple times while processing events.
|
||||||
|
|
||||||
\note If a signal is received while in \c epoll_wait(2), this function will return -1 and \a errno
|
\note If a signal is received while in \c epoll_wait(2), this function will return -1 and \a errno
|
||||||
will be set to \c EINTR. This is not a permanent error condition. lwevent_loop() will catch this
|
will be set to \c EINTR. This is not a permanent error condition. lwevent_loop() will catch this
|
||||||
condition and continue to loop.
|
condition and continue to loop.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
int lwevent_wait(int timeout_ms);
|
int lwevent_wait(int timeout_ms, void (*before_loop)(void));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue