diff --git a/src/liblwevent/300_fdevent.c b/src/liblwevent/300_fdevent.c index 5d04bf4..4b1a88a 100644 --- a/src/liblwevent/300_fdevent.c +++ b/src/liblwevent/300_fdevent.c @@ -47,11 +47,11 @@ struct lwevent* lwevent_new(int fd, int events, lwevent_callback callback) -/* lwevent_free() +/* lwevent_free_and_close() * Mark `ev' as invalid, closing its file descriptor and calling the destructor (if there is one). * If the object is already invalid, or is null, do nothing. */ -void lwevent_free(struct lwevent* ev) +void lwevent_free_and_close(struct lwevent* ev) { if(!ev || ev->fd == -1) return; @@ -63,6 +63,24 @@ void lwevent_free(struct lwevent* ev) +/* lwevent_free() + * Mark `ev' as invalid, calling the destructor (if there is one). If the object is already + * invalid, or is null, do nothing. Also remove `ev->fd' from epoll's consideration. + */ +void lwevent_free(struct lwevent* ev) +{ + int dummy; + + if(!ev || ev->fd == -1) return; + + /* call destructor, deregister from epoll, mark as invalid */ + if(ev->dtor) ev->dtor(ev); + dummy = lwevent_deactivate(ev); + _lwevent_invalid(ev); +} + + + /* lwevent_deactivate() * Temporarily deactivate `ev'. Calls epoll_ctl(EPOLL_CTL_DEL). */ diff --git a/src/liblwevent/300_fdevent.h b/src/liblwevent/300_fdevent.h index 24ce749..ea3cdbc 100644 --- a/src/liblwevent/300_fdevent.h +++ b/src/liblwevent/300_fdevent.h @@ -98,6 +98,20 @@ without consequence. At the end of the event loop, once no more callbacks are qu objects are freed. This means that you cannot continue to refer to invalid objects after a completed call to lwevent_wait(). +*/ +void lwevent_free_and_close(struct lwevent* ev); + + + +/*! \brief Free an event structure. + +\param ev Event structure. May be 0. + +This function will call the registered destructor of \a ev (see \ref fdparams) and free any memory +used by \a ev. It may be called at any time in the event loop. If called with a null argument, it is +a no-op. The file descriptor associated with \a ev is not modified (but it is deregistered from the +event loop). + */ void lwevent_free(struct lwevent* ev);