2675 Commits

Author SHA1 Message Date
Nick Mathewson
a163026099 Merge branch '21_robust_monotonic' 2012-05-01 13:22:56 -04:00
Nick Mathewson
2e882a071b Merge remote-tracking branch 'origin/patches-2.0'
Conflicts:
	event.c
2012-04-30 22:00:05 -04:00
Nick Mathewson
30f0671526 Merge remote-tracking branch 'github/20_active_prio_inv' into patches-2.0 2012-04-30 21:45:43 -04:00
Nick Mathewson
b98624ef35 Merge remote-tracking branch 'origin/patches-2.0'
Conflicts:
	bufferevent_openssl.c
2012-04-30 21:33:56 -04:00
Nick Mathewson
b3887cdf3b Work-around a stupid gcov-breaking bug in OSX 10.6
This only affects the unit tests.

Fix found at http://rachelbythebay.com/w/2011/07/12/forkcrash/

(Backport from 2.1)
2012-04-30 21:17:26 -04:00
Mark Ellzey
4e62cd167b Fixed potential double-readcb execution with openssl bufferevents.
the function do_read() will call SSL_read(), and if successful, will
call _bufferevent_run_readcb() before returning to consider_reading().

consider_reading() will then check SSL_pending() to make sure all
pending data has also been read. If it does not, do_read() is called
again.

The issue with this is the possibility that the function that is
executed by _bufferevent_run_readcb() called
bufferevent_disable(ssl_bev, EV_READ) before the second do_read(); In
this case, the users read callback is executed a second time. This is
potentially bad for applications that expect the bufferevent to stay
disabled until further notice. (this is why running openssl bufferevents
without DEFER_CALLBACKS has always been troublesome).
2012-04-30 21:02:01 -04:00
Nick Mathewson
2bfda4012c If a higher-priority event becomes active, don't continue running events of the current priority.
Bug found by Ralph Castain.
2012-04-30 17:30:48 -04:00
Zack Weinberg
5859c235de Generate event-config.h with a single sed script
This approach should make the creation of the file more atomic, to
fix a bug reported by Dinh.

This patch has one change from Zack's original version: it avoids
$<, since Dave Hart tells me he thinks that's not so portable.

(commit message by nickm)
2012-04-27 09:42:01 -04:00
Nick Mathewson
e02222741e Merge remote-tracking branch 'origin/patches-2.0' 2012-04-27 09:36:13 -04:00
Zack Weinberg
30b6f889f7 Generate event-config.h with a single sed script
This approach should make the creation of the file more atomic, to
fix a bug reported by Dinh.

This patch has one change from Zack's original version: it avoids
$<, since Dave Hart tells me he thinks that's not so portable.

(commit message by nickm)
2012-04-27 09:32:51 -04:00
Nick Mathewson
26c75828b7 When PRECISE_TIMERS is set with epoll, use timerfd for microsecond precision
The epoll interface ordinarily gives us one-millisecond
precision, so on Linux it makes perfect sense to use the
CLOCK_MONOTONIC_COARSE timer.  But when the user has set the new
PRECISE_TIMER flag for an event_base (either by the
EVENT_BASE_FLAG_PRECISE_TIMER flag, or by the EVENT_PRECISE_TIMER
environment variable), they presumably want finer granularity.

On not-too-old Linuxes, we can achieve this using the Timerfd
mechanism, which accepts nanosecond granularity and understands
posix clocks.  It's a little more expensive than just calling
epoll_wait(), so we won't do it by default.
2012-04-26 16:42:21 -04:00
Nick Mathewson
7428c78a95 Improve the monotonic-time unit test: make it check the step size 2012-04-26 16:42:21 -04:00
Nick Mathewson
630f077c29 Simple unit tests for monotonic timers 2012-04-26 16:42:21 -04:00
Nick Mathewson
2c470452fb Implement fast/precise monotonic clocks on Windows
This uses code from libutp, which was released under the MIT
license; see evutil_time.c and LICENSE changes.
2012-04-26 15:44:37 -04:00
Nick Mathewson
a2598ec6bd Add EVENT_PRECISE_TIMER environment var for selecting precise-but-slow timer 2012-04-26 15:44:37 -04:00
Nick Mathewson
f5e4eb05e5 Refactor monotonic timer handling into a new type and set of functions; add a gettimeofday-based ratcheting implementation
Now, event.c can always assume that we have a monotonic timer; this
makes event.c easier to write.
2012-04-26 15:44:31 -04:00
Nick Mathewson
71bca50f12 Split out time-related prototypes into time-internal.h 2012-04-20 12:27:12 -04:00
Nick Mathewson
c419485442 Split out time-related evutil functions into a new evutil_time.c 2012-04-20 12:19:03 -04:00
Nick Mathewson
2711cda300 Split long lists in Makefile.am into one-item-per-line 2012-04-20 12:14:20 -04:00
Nick Mathewson
21205b8376 Shave 700 msec off the persistent_timeout_jump test 2012-04-20 11:53:32 -04:00
Nick Mathewson
d992d911a6 Merge remote-tracking branch 'origin/patches-2.0' 2012-04-20 11:51:33 -04:00
Nick Mathewson
03614a16cb Merge branch '20_periodic_event_overload_v2' into patches-2.0 2012-04-20 11:51:13 -04:00
Nick Mathewson
dfd808cbad If time has jumped so we'd reschedule a periodic event in the past, schedule it for the future instead
Fixes an issue reported on libevent-users in the thread "a dead
looping bug when changing system time backward". Previously, if time
jumped forward 1 hour[*] and we had a one-second periodic timer event,
that event would get invoked 3600 times.  That's almost certainly not
what anybody wants.

In a future version of Libevent, we should expose the amount of time
that the callbac kwould have been invoked somehow.

[*] Forward time jumps can happen with nonmonotonic clocks, or with
clocks that jump on suspend/resume.  It can also happen from
Libevent's point of view if the user exits from event_base_loop() and
doesn't call it again for a while.
2012-04-19 18:25:59 -04:00
Nick Mathewson
bec22b4176 Refactor event_persist_closure: raise and extract some common logic 2012-04-19 18:15:12 -04:00
Nick Mathewson
3f659e5aeb Merge remote-tracking branch 'origin/patches-2.0' 2012-04-19 11:14:58 -04:00
Nick Mathewson
37c4fc8d0c Merge pull request #52 from ghazel/20_evdns_probe
cancel the probe request when the server is freed, and ignore cancelled probe callbacks
2012-04-19 08:11:05 -07:00
Greg Hazel
46b806084e remove redundant DNS_ERR_CANCEL check, move comment 2012-04-18 21:41:48 -07:00
Greg Hazel
94d2336070 cancel the probe request when the server is freed, and ignore cancelled probe callbacks 2012-04-18 21:29:21 -07:00
Nick Mathewson
26ee5f9097 Note that make_base_notifiable should not be necessary 2012-04-18 12:24:19 -04:00
Nick Mathewson
5595a79ff1 Merge branch '21_choose_monotonic' 2012-04-17 17:54:26 -04:00
Nick Mathewson
d5e1d5ad99 Implement a GetTickCount-based monotonic timer for Windows 2012-04-17 15:37:12 -04:00
Nick Mathewson
55780a70e2 On Linux, use CLOCK_MONOTONIC_COARSE by default
You can make it use CLOCK_MONOTONIC again by setting the
EVENT_BASE_FLAG_PRECISE_TIMER flag in the event_config.
2012-04-17 13:09:49 -04:00
Nick Mathewson
ddd69d391e EVENT_BASE_FLAG_PRECISE_TIMER indicates we want fine timer precision
There are a bunch of backends that can give us a reasonably good
monotonic timer quickly, or a very precise monotonic timer less
quickly.  For example, Linux has CLOCK_MONOTONIC_COARSE (1msec
precision), which is over twice as fast as CLOCK_MONOTONIC.  Since
epoll only lets you wait with 1msec precision,
CLOCK_MONOTONIC_COARSE is a clear win.

On Windows, you've got GetTickCount{,64}() which is fast, and
QueryPerformanceCounter, which is precise but slow.

Note that even in the cases where the underlying timer claims to
have nanosecond resolution, we're still not exposing that via
Libevent.

Note also that "Precision" isn't the same as "Resolution" or
"Accuracy".  A timer's precision is the smallest change that the
clock will register; a timer's resolution is the fineness of its
underlying representation; a timer's accuracy is how much it drifts
with respect to "Real Time", whatever that means.  (Terms and
definitions from PEP 418.)
2012-04-17 13:04:02 -04:00
Nick Mathewson
1fbef7d538 Move use_monotonic and friends into event_base
The use_monotonic field used to be a static field set up at library
setup.  Unfortunately, this makes it hard to give the user a way to
make speed/accuracy tradeoffs about time.  Moving it into event_base
should let the clock implementation become configurable.
2012-04-17 12:44:39 -04:00
Nick Mathewson
b62b31f1f1 Work-around a stupid gcov-breaking bug in OSX 10.6
This only affects the unit tests.

Fix found at http://rachelbythebay.com/w/2011/07/12/forkcrash/
2012-04-11 21:33:51 -04:00
Nick Mathewson
53a07fe2f9 Replace pipe-based notification with EVFILT_USER where possible
Sufficiently recent kqueue implementations have an EVFILT_USER filter
that we can use to wake up an event base from another thread.  When
it's supported, we now use this mechanism rather than our old
(pipe-based) mechanism.  This should save some time and complications
on newer OSX and freebsds.
2012-04-11 16:14:09 -04:00
Nick Mathewson
9bf866f5d1 Merge remote-tracking branch 'github/21_mach_time' 2012-04-09 19:49:58 -04:00
Nick Mathewson
cb653a0027 Do not track use_monotonic field when is no monotonic clock 2012-04-09 18:29:30 -04:00
Nick Mathewson
b8fd6f918b Use mach_absolute_time() for monotonic clock support on OSX. 2012-04-09 18:29:30 -04:00
Nick Mathewson
a969f7e706 Merge pull request #50 from rosslagerwall/simplify-test
Simplify test.sh code significantly.
2012-04-09 08:40:45 -07:00
Nick Mathewson
0af23d5911 Merge branch '21_weakrand' 2012-04-09 11:33:08 -04:00
Nick Mathewson
3aa44159c5 Tweak the new evutil_weakrand_() code
Make its state actually get seeded.

Document it more thoroughly.

Turn its state into a structure.

Fix a bug in evutil_weakrand_range_() where it could return the top of
the range.

Change its return type to ev_int32_t.

Add a quick unit test to make sure that the value of
evutil_weakrand_range_() is in range.
2012-04-09 11:30:46 -04:00
Nicholas Marriott
e86af4b7e5 Change evutil_weakrand_() to avoid platform random()
This change allows us to avoid perturbing the platform's random(), and
to avoid hitting locks on random() in the platform's libc.

evutil_weakrand_() is, well, weak, so we choose here an algorithm that
favors speed over a number of other possibly desirable properties.
We're using a linear congruential generator, and taking our parameters
from those shared by the OpenBSD random() implementation, and
Glibc's fastest random() implementation.

The low bits of a LCG of modulus 2^32 are (notoriously) less random
than the higher bits.  So to generate a random value in a range, using
the % operator is no good; we ought to divide.  We add an
evutil_weakrand_range_() function to do that.

This code also changes the interface of evutil_weakrand_() so that it
now manipulates an explicit seed, rather than having the seed in a
static variable.  This change enables us to use existing locks to
achieve thread-safety, rather than having to rely on an additional lock.

(Patch by Nicholas Marriott; commit message by Nick Mathewson.)
2012-04-09 10:46:32 -04:00
Ross Lagerwall
9b856fd594 Simplify test.sh code significantly.
Also make it easier to add new tests/backends.
2012-04-07 17:32:00 +02:00
Nick Mathewson
d9a5515336 Increment the version to 2.1.1-alpha-dev 2012-04-03 20:30:54 -04:00
Nick Mathewson
6f2337dd0e Merge remote-tracking branch 'origin/patches-2.0' release-2.1.1-alpha 2012-04-03 18:39:30 -04:00
Nick Mathewson
d1a03b2ff1 Backport: provide EVENT_LOG_* names, and deprecate _EVENT_LOG_*
This is a partial backport of cb9da0bf and a backport of c9635349.

Because C doesn't like us to declare identifiers starting with an
underscore, Libevent 2.1 has renamed every such identifier.  The
only change that affects a public API is that the _EVENT_LOG_*
macros have been renamed to start with EVENT_LOG instead.  The old
names are still present, but deprecated.

I'm doing this backport because it represents the deprecation of a
Libevent 2.0 interface, and folks should have the opportunity to
write code that isn't deprecated and works with both 2.0 and 2.1.
2012-04-03 18:31:08 -04:00
Nick Mathewson
3ef4b3532f Merge remote-tracking branch 'origin/patches-2.0' 2012-04-03 17:27:07 -04:00
Nick Mathewson
88b4f0bb0d fix some typos in the 2.1 changelog 2012-04-03 17:26:25 -04:00
Nick Mathewson
3faaad49c4 Bump the version to Libevent 2.1.1-alpha 2012-04-03 17:26:12 -04:00