summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbrad <brad@openbsd.org>2006-03-30 06:32:36 +0000
committerbrad <brad@openbsd.org>2006-03-30 06:32:36 +0000
commit3ac1ba99f4e58fb1a42c390f97c7508790c97eae (patch)
tree98fc8ff79d29c3d4dbae3acc011af2589818fcc6
parentAdd rlog -r[REV1][:][REV2] support (diff)
downloadwireguard-openbsd-3ac1ba99f4e58fb1a42c390f97c7508790c97eae.tar.xz
wireguard-openbsd-3ac1ba99f4e58fb1a42c390f97c7508790c97eae.zip
introduce a way to free the base.
From libevent CVS
-rw-r--r--lib/libevent/event.c30
-rw-r--r--lib/libevent/event.h4
-rw-r--r--lib/libevent/kqueue.c21
-rw-r--r--lib/libevent/poll.c24
-rw-r--r--lib/libevent/select.c28
-rw-r--r--lib/libevent/shlib_version2
6 files changed, 100 insertions, 9 deletions
diff --git a/lib/libevent/event.c b/lib/libevent/event.c
index b03918d3f11..fc77faf1964 100644
--- a/lib/libevent/event.c
+++ b/lib/libevent/event.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: event.c,v 1.12 2006/03/28 15:32:13 brad Exp $ */
+/* $OpenBSD: event.c,v 1.13 2006/03/30 06:32:36 brad Exp $ */
/*
* Copyright (c) 2000-2004 Niels Provos <provos@citi.umich.edu>
@@ -198,6 +198,33 @@ event_init(void)
return (current_base);
}
+void
+event_base_free(struct event_base *base)
+{
+ int i;
+
+ if (base == NULL && current_base)
+ base = current_base;
+ if (base == current_base)
+ current_base = NULL;
+
+ assert(base);
+ assert(TAILQ_EMPTY(&base->eventqueue));
+ for (i=0; i < base->nactivequeues; ++i)
+ assert(TAILQ_EMPTY(base->activequeues[i]));
+
+ assert(RB_EMPTY(&base->timetree));
+
+ for (i = 0; i < base->nactivequeues; ++i)
+ free(base->activequeues[i]);
+ free(base->activequeues);
+
+ if (base->evsel->dealloc != NULL)
+ base->evsel->dealloc(base->evbase);
+
+ free(base);
+}
+
int
event_priority_init(int npriorities)
{
@@ -539,6 +566,7 @@ event_pending(struct event *ev, short event, struct timeval *tv)
if (tv != NULL && (flags & event & EV_TIMEOUT)) {
gettime(&now);
timersub(&ev->ev_timeout, &now, &res);
+ /* correctly remap to real time */
gettimeofday(&now, NULL);
timeradd(&now, &res, tv);
}
diff --git a/lib/libevent/event.h b/lib/libevent/event.h
index 9e79233123c..1c8d29a2203 100644
--- a/lib/libevent/event.h
+++ b/lib/libevent/event.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: event.h,v 1.14 2006/01/25 05:25:34 brad Exp $ */
+/* $OpenBSD: event.h,v 1.15 2006/03/30 06:32:36 brad Exp $ */
/*
* Copyright (c) 2000-2004 Niels Provos <provos@citi.umich.edu>
@@ -125,6 +125,7 @@ struct eventop {
int (*del)(void *, struct event *);
int (*recalc)(struct event_base *, void *, int);
int (*dispatch)(struct event_base *, void *, struct timeval *);
+ void (*dealloc)(void *);
};
#define TIMEOUT_DEFAULT {5, 0}
@@ -132,6 +133,7 @@ struct eventop {
void *event_init(void);
int event_dispatch(void);
int event_base_dispatch(struct event_base *);
+void event_base_free(struct event_base *);
#define _EVENT_LOG_DEBUG 0
#define _EVENT_LOG_MSG 1
diff --git a/lib/libevent/kqueue.c b/lib/libevent/kqueue.c
index 2f7f8484238..500d7c4dd68 100644
--- a/lib/libevent/kqueue.c
+++ b/lib/libevent/kqueue.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kqueue.c,v 1.19 2005/12/20 02:15:28 brad Exp $ */
+/* $OpenBSD: kqueue.c,v 1.20 2006/03/30 06:32:36 brad Exp $ */
/*
* Copyright 2000-2002 Niels Provos <provos@citi.umich.edu>
@@ -75,6 +75,7 @@ int kq_del (void *, struct event *);
int kq_recalc (struct event_base *, void *, int);
int kq_dispatch (struct event_base *, void *, struct timeval *);
int kq_insert (struct kqop *, struct kevent *);
+void kq_dealloc (void *);
const struct eventop kqops = {
"kqueue",
@@ -82,7 +83,8 @@ const struct eventop kqops = {
kq_add,
kq_del,
kq_recalc,
- kq_dispatch
+ kq_dispatch,
+ kq_dealloc
};
void *
@@ -394,3 +396,18 @@ kq_del(void *arg, struct event *ev)
return (0);
}
+
+void
+kq_dealloc(void *arg)
+{
+ struct kqop *kqop = arg;
+
+ if (kqop->changes)
+ free(kqop->changes);
+ if (kqop->events)
+ free(kqop->events);
+ if (kqop->kq)
+ close(kqop->kq);
+ memset(kqop, 0, sizeof(struct kqop));
+ free(kqop);
+}
diff --git a/lib/libevent/poll.c b/lib/libevent/poll.c
index fbc5aca4eff..2e76dfc6613 100644
--- a/lib/libevent/poll.c
+++ b/lib/libevent/poll.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: poll.c,v 1.11 2005/12/02 04:41:30 deraadt Exp $ */
+/* $OpenBSD: poll.c,v 1.12 2006/03/30 06:32:36 brad Exp $ */
/*
* Copyright 2000-2003 Niels Provos <provos@citi.umich.edu>
@@ -74,6 +74,7 @@ int poll_add (void *, struct event *);
int poll_del (void *, struct event *);
int poll_recalc (struct event_base *, void *, int);
int poll_dispatch (struct event_base *, void *, struct timeval *);
+void poll_dealloc (void *);
const struct eventop pollops = {
"poll",
@@ -81,7 +82,8 @@ const struct eventop pollops = {
poll_add,
poll_del,
poll_recalc,
- poll_dispatch
+ poll_dispatch,
+ poll_dealloc
};
void *
@@ -356,3 +358,21 @@ poll_del(void *arg, struct event *ev)
poll_check_ok(pop);
return (0);
}
+
+void
+poll_dealloc(void *arg)
+{
+ struct pollop *pop = arg;
+
+ if (pop->event_set)
+ free(pop->event_set);
+ if (pop->event_r_back)
+ free(pop->event_r_back);
+ if (pop->event_w_back)
+ free(pop->event_w_back);
+ if (pop->idxplus1_by_fd)
+ free(pop->idxplus1_by_fd);
+
+ memset(pop, 0, sizeof(struct pollop));
+ free(pop);
+}
diff --git a/lib/libevent/select.c b/lib/libevent/select.c
index 48ab2e3ec0c..f3efa390f6e 100644
--- a/lib/libevent/select.c
+++ b/lib/libevent/select.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: select.c,v 1.11 2005/06/18 01:52:22 brad Exp $ */
+/* $OpenBSD: select.c,v 1.12 2006/03/30 06:32:36 brad Exp $ */
/*
* Copyright 2000-2002 Niels Provos <provos@citi.umich.edu>
@@ -76,6 +76,7 @@ int select_add (void *, struct event *);
int select_del (void *, struct event *);
int select_recalc (struct event_base *, void *, int);
int select_dispatch (struct event_base *, void *, struct timeval *);
+void select_dealloc (void *);
const struct eventop selectops = {
"select",
@@ -83,7 +84,8 @@ const struct eventop selectops = {
select_add,
select_del,
select_recalc,
- select_dispatch
+ select_dispatch,
+ select_dealloc
};
static int select_resize(struct selectop *sop, int fdsz);
@@ -350,3 +352,25 @@ select_del(void *arg, struct event *ev)
check_selectop(sop);
return (0);
}
+
+void
+select_dealloc(void *arg)
+{
+ struct selectop *sop = arg;
+
+ if (sop->event_readset_in)
+ free(sop->event_readset_in);
+ if (sop->event_writeset_in)
+ free(sop->event_writeset_in);
+ if (sop->event_readset_out)
+ free(sop->event_readset_out);
+ if (sop->event_writeset_out)
+ free(sop->event_writeset_out);
+ if (sop->event_r_by_fd)
+ free(sop->event_r_by_fd);
+ if (sop->event_w_by_fd)
+ free(sop->event_w_by_fd);
+
+ memset(sop, 0, sizeof(struct selectop));
+ free(sop);
+}
diff --git a/lib/libevent/shlib_version b/lib/libevent/shlib_version
index c8860078e50..79d3d3afd76 100644
--- a/lib/libevent/shlib_version
+++ b/lib/libevent/shlib_version
@@ -1,2 +1,2 @@
major=1
-minor=2
+minor=3