Construct Windows locks using InitializeCriticalSectionAndSpinCount

Previously we were using InitializeCriticalSection, which creates a
lock that blocks immediately on contention and waits to be
rescheduled.  This is inefficient; it's better to wait for a little
while before telling the US to reschedule us, in case the lock becomes
available again really soon (since most locks mostly do).

Good pthreads implementations do this automatically.  On Windows,
though, we need to call this magic function, and we need to pick the
spin count ourselves.
This commit is contained in:
Nick Mathewson 2010-02-15 19:54:15 -05:00
parent ca46d25b01
commit 32c6f1bacd
2 changed files with 7 additions and 2 deletions

View File

@ -193,7 +193,7 @@ event_iocp_port_launch(void)
++port->n_live_threads;
}
InitializeCriticalSection(&port->lock);
InitializeCriticalSectionAndSpinCount(&port->lock, 1000);
return port;
err:

View File

@ -38,13 +38,18 @@ struct event_base;
#include "mm-internal.h"
#define SPIN_COUNT 2000
static void *
evthread_win32_lock_create(unsigned locktype)
{
CRITICAL_SECTION *lock = mm_malloc(sizeof(CRITICAL_SECTION));
if (!lock)
return NULL;
InitializeCriticalSection(lock);
if (InitializeCriticalSectionAndSpinCount(lock, SPIN_COUNT) == 0) {
mm_free(lock);
return NULL;
}
return lock;
}