summaryrefslogtreecommitdiff
path: root/lib/tevent/tevent_select.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2009-01-05 17:36:50 +0100
committerStefan Metzmacher <metze@samba.org>2009-01-05 22:44:53 +0100
commitceac26008c6f36602259d0180f1e7f7a756ea4ad (patch)
tree31df7bfbfdf29dc922e481b1fe163fd4e4a21404 /lib/tevent/tevent_select.c
parentb24924d6a6438b361fb903227bd56d2afe40d2f2 (diff)
downloadsamba-ceac26008c6f36602259d0180f1e7f7a756ea4ad.tar.gz
samba-ceac26008c6f36602259d0180f1e7f7a756ea4ad.tar.bz2
samba-ceac26008c6f36602259d0180f1e7f7a756ea4ad.zip
tevent: keep a linked list of fd_events
metze
Diffstat (limited to 'lib/tevent/tevent_select.c')
-rw-r--r--lib/tevent/tevent_select.c55
1 files changed, 16 insertions, 39 deletions
diff --git a/lib/tevent/tevent_select.c b/lib/tevent/tevent_select.c
index c1b01bb84f..64f2dd24f2 100644
--- a/lib/tevent/tevent_select.c
+++ b/lib/tevent/tevent_select.c
@@ -18,11 +18,6 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/*
- This is SAMBA's default event loop code
-
-*/
-
#include "replace.h"
#include "system/filesys.h"
#include "system/select.h"
@@ -34,12 +29,6 @@ struct select_event_context {
/* a pointer back to the generic event_context */
struct tevent_context *ev;
- /* list of filedescriptor events */
- struct tevent_fd *fd_events;
-
- /* list of timed events */
- struct tevent_timer *timed_events;
-
/* the maximum file descriptor number in fd_events */
int maxfd;
@@ -74,7 +63,7 @@ static void calc_maxfd(struct select_event_context *select_ev)
struct tevent_fd *fde;
select_ev->maxfd = 0;
- for (fde = select_ev->fd_events; fde; fde = fde->next) {
+ for (fde = select_ev->ev->fd_events; fde; fde = fde->next) {
if (fde->fd > select_ev->maxfd) {
select_ev->maxfd = fde->fd;
}
@@ -93,22 +82,20 @@ static void calc_maxfd(struct select_event_context *select_ev)
static int select_event_fd_destructor(struct tevent_fd *fde)
{
struct tevent_context *ev = fde->event_ctx;
- struct select_event_context *select_ev = talloc_get_type(ev->additional_data,
- struct select_event_context);
+ struct select_event_context *select_ev = NULL;
- if (select_ev->maxfd == fde->fd) {
- select_ev->maxfd = EVENT_INVALID_MAXFD;
- }
+ if (ev) {
+ select_ev = talloc_get_type(ev->additional_data,
+ struct select_event_context);
- DLIST_REMOVE(select_ev->fd_events, fde);
- select_ev->destruction_count++;
+ if (select_ev->maxfd == fde->fd) {
+ select_ev->maxfd = EVENT_INVALID_MAXFD;
+ }
- if (fde->close_fn) {
- fde->close_fn(ev, fde, fde->fd, fde->private_data);
- fde->fd = -1;
+ select_ev->destruction_count++;
}
- return 0;
+ return tevent_common_fd_destructor(fde);
}
/*
@@ -126,21 +113,11 @@ static struct tevent_fd *select_event_add_fd(struct tevent_context *ev, TALLOC_C
struct select_event_context);
struct tevent_fd *fde;
- fde = talloc(mem_ctx?mem_ctx:ev, struct tevent_fd);
+ fde = tevent_common_add_fd(ev, mem_ctx, fd, flags,
+ handler, private_data,
+ handler_name, location);
if (!fde) return NULL;
- fde->event_ctx = ev;
- fde->fd = fd;
- fde->flags = flags;
- fde->handler = handler;
- fde->close_fn = NULL;
- fde->private_data = private_data;
- fde->handler_name = handler_name;
- fde->location = location;
- fde->additional_flags = 0;
- fde->additional_data = NULL;
-
- DLIST_ADD(select_ev->fd_events, fde);
if (fde->fd > select_ev->maxfd) {
select_ev->maxfd = fde->fd;
}
@@ -168,7 +145,7 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru
FD_ZERO(&w_fds);
/* setup any fd events */
- for (fde = select_ev->fd_events; fde; fde = fde->next) {
+ for (fde = select_ev->ev->fd_events; fde; fde = fde->next) {
if (fde->flags & TEVENT_FD_READ) {
FD_SET(fde->fd, &r_fds);
}
@@ -212,7 +189,7 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru
/* at least one file descriptor is ready - check
which ones and call the handler, being careful to allow
the handler to remove itself when called */
- for (fde = select_ev->fd_events; fde; fde = fde->next) {
+ for (fde = select_ev->ev->fd_events; fde; fde = fde->next) {
uint16_t flags = 0;
if (FD_ISSET(fde->fd, &r_fds)) flags |= TEVENT_FD_READ;
@@ -255,7 +232,7 @@ static int select_event_loop_wait(struct tevent_context *ev)
struct select_event_context);
select_ev->exit_code = 0;
- while (select_ev->fd_events && select_ev->exit_code == 0) {
+ while (ev->fd_events && select_ev->exit_code == 0) {
if (select_event_loop_once(ev) != 0) {
break;
}