mirror of
https://github.com/libevent/libevent.git
synced 2025-01-09 00:56:20 +08:00
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:
parent
ca46d25b01
commit
32c6f1bacd
@ -193,7 +193,7 @@ event_iocp_port_launch(void)
|
||||
++port->n_live_threads;
|
||||
}
|
||||
|
||||
InitializeCriticalSection(&port->lock);
|
||||
InitializeCriticalSectionAndSpinCount(&port->lock, 1000);
|
||||
|
||||
return port;
|
||||
err:
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user