annotate libphobos/libdruntime/rt/tlsgc.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 *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 * Copyright: Copyright Digital Mars 2011 - 2012.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 * Authors: Martin Nowak
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 /* Copyright Digital Mars 2011.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 * Distributed under the Boost Software License, Version 1.0.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 * (See accompanying file LICENSE or copy at
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 * http://www.boost.org/LICENSE_1_0.txt)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 module rt.tlsgc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 import core.stdc.stdlib;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 static import rt.lifetime, rt.sections;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 /**
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 * Per thread record to store thread associated data for garbage collection.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 struct Data
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 typeof(rt.sections.initTLSRanges()) tlsRanges;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 rt.lifetime.BlkInfo** blockInfoCache;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 /**
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 * Initialization hook, called FROM each thread. No assumptions about
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 * module initialization state should be made.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 void* init() nothrow @nogc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 auto data = cast(Data*).malloc(Data.sizeof);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 import core.exception;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 if ( data is null ) core.exception.onOutOfMemoryError();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 *data = Data.init;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 // do module specific initialization
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 data.tlsRanges = rt.sections.initTLSRanges();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 data.blockInfoCache = &rt.lifetime.__blkcache_storage;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 return data;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 /**
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 * Finalization hook, called FOR each thread. No assumptions about
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 * module initialization state should be made.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 void destroy(void* data) nothrow @nogc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 // do module specific finalization
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 rt.sections.finiTLSRanges((cast(Data*)data).tlsRanges);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 .free(data);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 alias void delegate(void* pstart, void* pend) nothrow ScanDg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 /**
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 * GC scan hook, called FOR each thread. Can be used to scan
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 * additional thread local memory.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 void scan(void* data, scope ScanDg dg) nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 // do module specific marking
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 rt.sections.scanTLSRanges((cast(Data*)data).tlsRanges, dg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 alias int delegate(void* addr) nothrow IsMarkedDg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 /**
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 * GC sweep hook, called FOR each thread. Can be used to free
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 * additional thread local memory or associated data structures. Note
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 * that only memory allocated from the GC can have marks.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 void processGCMarks(void* data, scope IsMarkedDg dg) nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 // do module specific sweeping
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 rt.lifetime.processGCMarks(*(cast(Data*)data).blockInfoCache, dg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 }