Skip to content

Commit 6af643e

Browse files
luhenrytstuefe
authored andcommitted
8248657: Windows: strengthening in ThreadCritical regarding memory model
Reviewed-by: dholmes, kbarrett, aph, stuefe
1 parent 3349e10 commit 6af643e

File tree

1 file changed

+17
-29
lines changed

1 file changed

+17
-29
lines changed

src/hotspot/os/windows/threadCritical_windows.cpp

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
// See threadCritical.hpp for details of this class.
3636
//
3737

38-
static bool initialized = false;
39-
static volatile int lock_count = -1;
38+
static INIT_ONCE initialized = INIT_ONCE_STATIC_INIT;
39+
static int lock_count = 0;
4040
static HANDLE lock_event;
41-
static DWORD lock_owner = -1;
41+
static DWORD lock_owner = 0;
4242

4343
//
4444
// Note that Microsoft's critical region code contains a race
@@ -51,48 +51,36 @@ static DWORD lock_owner = -1;
5151
// and found them ~30 times slower than the critical region code.
5252
//
5353

54+
static BOOL WINAPI initialize(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context) {
55+
lock_event = CreateEvent(NULL, false, true, NULL);
56+
assert(lock_event != NULL, "unexpected return value from CreateEvent");
57+
return true;
58+
}
59+
5460
ThreadCritical::ThreadCritical() {
55-
DWORD current_thread = GetCurrentThreadId();
61+
InitOnceExecuteOnce(&initialized, &initialize, NULL, NULL);
5662

63+
DWORD current_thread = GetCurrentThreadId();
5764
if (lock_owner != current_thread) {
5865
// Grab the lock before doing anything.
59-
while (Atomic::cmpxchg(&lock_count, -1, 0) != -1) {
60-
if (initialized) {
61-
DWORD ret = WaitForSingleObject(lock_event, INFINITE);
62-
assert(ret == WAIT_OBJECT_0, "unexpected return value from WaitForSingleObject");
63-
}
64-
}
65-
66-
// Make sure the event object is allocated.
67-
if (!initialized) {
68-
// Locking will not work correctly unless this is autoreset.
69-
lock_event = CreateEvent(NULL, false, false, NULL);
70-
initialized = true;
71-
}
72-
73-
assert(lock_owner == -1, "Lock acquired illegally.");
66+
DWORD ret = WaitForSingleObject(lock_event, INFINITE);
67+
assert(ret == WAIT_OBJECT_0, "unexpected return value from WaitForSingleObject");
7468
lock_owner = current_thread;
75-
} else {
76-
// Atomicity isn't required. Bump the recursion count.
77-
lock_count++;
7869
}
79-
80-
assert(lock_owner == GetCurrentThreadId(), "Lock acquired illegally.");
70+
// Atomicity isn't required. Bump the recursion count.
71+
lock_count++;
8172
}
8273

8374
ThreadCritical::~ThreadCritical() {
8475
assert(lock_owner == GetCurrentThreadId(), "unlock attempt by wrong thread");
8576
assert(lock_count >= 0, "Attempt to unlock when already unlocked");
8677

78+
lock_count--;
8779
if (lock_count == 0) {
8880
// We're going to unlock
89-
lock_owner = -1;
90-
lock_count = -1;
81+
lock_owner = 0;
9182
// No lost wakeups, lock_event stays signaled until reset.
9283
DWORD ret = SetEvent(lock_event);
9384
assert(ret != 0, "unexpected return value from SetEvent");
94-
} else {
95-
// Just unwinding a recursive lock;
96-
lock_count--;
9785
}
9886
}

0 commit comments

Comments
 (0)