]> granicus.if.org Git - libevent/commitdiff
Do not free the event base lock until we are done removing all the events. Spotted...
authorNick Mathewson <nickm@torproject.org>
Fri, 22 May 2009 14:31:07 +0000 (14:31 +0000)
committerNick Mathewson <nickm@torproject.org>
Fri, 22 May 2009 14:31:07 +0000 (14:31 +0000)
svn:r1302

ChangeLog
event.c

index 684f7bd2ab11ae8306f571ce95ab90490a6eb7eb..939a269391a64eda43f21b5d0168e06f033ad0c0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -31,7 +31,7 @@ Changes in 2.0.2-alpha:
  o Revise the new evbuffer_reserve_space/evbuffer_commit_space() interfaces so that you can use them without causing extraneous copies or leaving gaps in the evbuffer.
  o Add a new evbuffer_peek() interface to inspect data in an evbuffer without removing it.
  o Fix a deadlock when suspending reads in a bufferevent due to a full buffer. (Spotted by Joachim Bauch.)
-
+ o Fix a memory error when freeing a thread-enabled event base with registered events. (Spotted by Joachim Bauch.)
 
 Changes in 2.0.1-alpha:
  o free minheap on event_base_free(); from Christopher Layne
diff --git a/event.c b/event.c
index 6e67ece553ed4d7e8726ec95984cc335af4f3cc9..0fdc9c8178b8149549d1b08c0fe2cb86b9ac9d0f 100644 (file)
--- a/event.c
+++ b/event.c
@@ -334,8 +334,6 @@ event_base_free(struct event_base *base)
                base->th_notify_fd[1] = -1;
        }
 
-       EVTHREAD_FREE_LOCK(base->th_base_lock);
-
        /* Delete all non-internal events. */
        for (ev = TAILQ_FIRST(&base->eventqueue); ev; ) {
                struct event *next = TAILQ_NEXT(ev, ev_next);
@@ -383,6 +381,8 @@ event_base_free(struct event_base *base)
        evmap_io_clear(&base->io);
        evmap_signal_clear(&base->sigmap);
 
+       EVTHREAD_FREE_LOCK(base->th_base_lock);
+
        mm_free(base);
 }