annotate libphobos/libdruntime/rt/critical_.d @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /**
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 * Implementation of support routines for synchronized blocks.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 * Copyright: Copyright Digital Mars 2000 - 2011.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 * Authors: Walter Bright, Sean Kelly
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 /* Copyright Digital Mars 2000 - 2011.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 * Distributed under the Boost Software License, Version 1.0.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 * (See accompanying file LICENSE or copy at
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 * http://www.boost.org/LICENSE_1_0.txt)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 module rt.critical_;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 nothrow:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 import rt.monitor_, core.atomic;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 extern (C) void _d_critical_init()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 initMutex(cast(Mutex*)&gcs.mtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 head = &gcs;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 extern (C) void _d_critical_term()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 for (auto p = head; p; p = p.next)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 destroyMutex(cast(Mutex*)&p.mtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 extern (C) void _d_criticalenter(D_CRITICAL_SECTION* cs)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 ensureMutex(cast(shared(D_CRITICAL_SECTION*)) cs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 lockMutex(&cs.mtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 extern (C) void _d_criticalexit(D_CRITICAL_SECTION* cs)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 unlockMutex(&cs.mtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 shared D_CRITICAL_SECTION* head;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 shared D_CRITICAL_SECTION gcs;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 struct D_CRITICAL_SECTION
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 D_CRITICAL_SECTION* next;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 Mutex mtx;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 void ensureMutex(shared(D_CRITICAL_SECTION)* cs)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 if (atomicLoad!(MemoryOrder.acq)(cs.next) is null)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 lockMutex(cast(Mutex*)&gcs.mtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 if (atomicLoad!(MemoryOrder.raw)(cs.next) is null)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 initMutex(cast(Mutex*)&cs.mtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 auto ohead = head;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 head = cs;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 atomicStore!(MemoryOrder.rel)(cs.next, ohead);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 unlockMutex(cast(Mutex*)&gcs.mtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 }