detached 9e27b96

internal/fakecgo: let darwin pthread stacksize follow rlimit (#84)

This commit matches the changes at golang/go#7d3a5a5

Updates #12
commit
9e27b968aa9a43c41e11aeae2b1d39079278c99d
author
TotallyGamerJet · · 2022-12-18 19:21 UTC
committer
GitHub · · 2022-12-18 19:21 UTC
parent
b4ba55d
signature
GPG Unverified4AEE18F83AFDEB23 The key is unknown
7 files · +54 -16
M internal/fakecgo/gen.go +3 -0
@@ -117,7 +117,10 @@ var symbols = []Symbol{
117117 {"pthread_create", [5]Arg{{"thread", "*pthread_t"}, {"attr", "*pthread_attr_t"}, {"start", "unsafe.Pointer"}, {"arg", "unsafe.Pointer"}}, "int32"},
118118 {"pthread_detach", [5]Arg{{"thread", "pthread_t"}}, "int32"},
119119 {"pthread_sigmask", [5]Arg{{"how", "sighow"}, {"ign", "*sigset_t"}, {"oset", "*sigset_t"}}, "int32"},
120+ {"pthread_self", [5]Arg{}, "pthread_t"},
121+ {"pthread_get_stacksize_np", [5]Arg{{"thread", "pthread_t"}}, "size_t"},
120122 {"pthread_attr_getstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"stacksize", "*size_t"}}, "int32"},
123+ {"pthread_attr_setstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"size", "size_t"}}, "int32"},
121124 {"pthread_attr_destroy", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32"},
122125 {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32"},
123126 {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32"},
@@ -117,7 +117,10 @@ var symbols = []Symbol{
117 {"pthread_create", [5]Arg{{"thread", "*pthread_t"}, {"attr", "*pthread_attr_t"}, {"start", "unsafe.Pointer"}, {"arg", "unsafe.Pointer"}}, "int32"},117 {"pthread_create", [5]Arg{{"thread", "*pthread_t"}, {"attr", "*pthread_attr_t"}, {"start", "unsafe.Pointer"}, {"arg", "unsafe.Pointer"}}, "int32"},
118 {"pthread_detach", [5]Arg{{"thread", "pthread_t"}}, "int32"},118 {"pthread_detach", [5]Arg{{"thread", "pthread_t"}}, "int32"},
119 {"pthread_sigmask", [5]Arg{{"how", "sighow"}, {"ign", "*sigset_t"}, {"oset", "*sigset_t"}}, "int32"},119 {"pthread_sigmask", [5]Arg{{"how", "sighow"}, {"ign", "*sigset_t"}, {"oset", "*sigset_t"}}, "int32"},
120+ {"pthread_self", [5]Arg{}, "pthread_t"},
121+ {"pthread_get_stacksize_np", [5]Arg{{"thread", "pthread_t"}}, "size_t"},
120 {"pthread_attr_getstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"stacksize", "*size_t"}}, "int32"},122 {"pthread_attr_getstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"stacksize", "*size_t"}}, "int32"},
123+ {"pthread_attr_setstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"size", "size_t"}}, "int32"},
121 {"pthread_attr_destroy", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32"},124 {"pthread_attr_destroy", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32"},
122 {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32"},125 {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32"},
123 {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32"},126 {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32"},
M internal/fakecgo/go_darwin_amd64.go +5 -7
@@ -15,12 +15,12 @@ func _cgo_sys_thread_start(ts *ThreadStart) {
1515 var size size_t
1616 var err int
1717
18- //fprintf(stderr, "runtime/cgo: _cgo_sys_thread_start: fn=%p, g=%p\n", ts->fn, ts->g); // debug
1918 sigfillset(&ign)
2019 pthread_sigmask(SIG_SETMASK, &ign, &oset)
2120
21+ size = pthread_get_stacksize_np(pthread_self())
2222 pthread_attr_init(&attr)
23- pthread_attr_getstacksize(&attr, &size)
23+ pthread_attr_setstacksize(&attr, size)
2424 // Leave stacklo=0 and set stackhi=size; mstart will do the rest.
2525 ts.g.stackhi = uintptr(size)
2626
@@ -63,11 +63,9 @@ var setg_func uintptr
6363 //go:norace
6464 func x_cgo_init(g *G, setg uintptr) {
6565 var size size_t
66- var attr pthread_attr_t
6766
6867 setg_func = setg
69- pthread_attr_init(&attr)
70- pthread_attr_getstacksize(&attr, &size)
71- g.stacklo = uintptr(unsafe.Pointer(&size)) - uintptr(size) + 4096
72- pthread_attr_destroy(&attr)
68+
69+ size = pthread_get_stacksize_np(pthread_self())
70+ g.stacklo = uintptr(unsafe.Add(unsafe.Pointer(&size), -size+4096))
7371 }
@@ -15,12 +15,12 @@ func _cgo_sys_thread_start(ts *ThreadStart) {
15 var size size_t15 var size size_t
16 var err int16 var err int
17 17
18- //fprintf(stderr, "runtime/cgo: _cgo_sys_thread_start: fn=%p, g=%p\n", ts->fn, ts->g); // debug
19 sigfillset(&ign)18 sigfillset(&ign)
20 pthread_sigmask(SIG_SETMASK, &ign, &oset)19 pthread_sigmask(SIG_SETMASK, &ign, &oset)
21 20
21+ size = pthread_get_stacksize_np(pthread_self())
22 pthread_attr_init(&attr)22 pthread_attr_init(&attr)
23- pthread_attr_getstacksize(&attr, &size)23+ pthread_attr_setstacksize(&attr, size)
24 // Leave stacklo=0 and set stackhi=size; mstart will do the rest.24 // Leave stacklo=0 and set stackhi=size; mstart will do the rest.
25 ts.g.stackhi = uintptr(size)25 ts.g.stackhi = uintptr(size)
26 26
@@ -63,11 +63,9 @@ var setg_func uintptr
63 //go:norace63 //go:norace
64 func x_cgo_init(g *G, setg uintptr) {64 func x_cgo_init(g *G, setg uintptr) {
65 var size size_t65 var size size_t
66- var attr pthread_attr_t
67 66
68 setg_func = setg67 setg_func = setg
69- pthread_attr_init(&attr)68+
70- pthread_attr_getstacksize(&attr, &size)69+ size = pthread_get_stacksize_np(pthread_self())
71- g.stacklo = uintptr(unsafe.Pointer(&size)) - uintptr(size) + 409670+ g.stacklo = uintptr(unsafe.Add(unsafe.Pointer(&size), -size+4096))
72- pthread_attr_destroy(&attr)
73 }71 }
M internal/fakecgo/go_darwin_arm64.go +4 -7
@@ -15,12 +15,12 @@ func _cgo_sys_thread_start(ts *ThreadStart) {
1515 var size size_t
1616 var err int
1717
18- //fprintf(stderr, "runtime/cgo: _cgo_sys_thread_start: fn=%p, g=%p\n", ts->fn, ts->g); // debug
1918 sigfillset(&ign)
2019 pthread_sigmask(SIG_SETMASK, &ign, &oset)
2120
21+ size = pthread_get_stacksize_np(pthread_self())
2222 pthread_attr_init(&attr)
23- pthread_attr_getstacksize(&attr, &size)
23+ pthread_attr_setstacksize(&attr, size)
2424 // Leave stacklo=0 and set stackhi=size; mstart will do the rest.
2525 ts.g.stackhi = uintptr(size)
2626
@@ -72,13 +72,10 @@ var setg_func uintptr
7272 //go:norace
7373 func x_cgo_init(g *G, setg uintptr) {
7474 var size size_t
75- var attr pthread_attr_t
7675
7776 setg_func = setg
78- pthread_attr_init(&attr)
79- pthread_attr_getstacksize(&attr, &size)
80- g.stacklo = uintptr(unsafe.Pointer(&size)) - uintptr(size) + 4096
81- pthread_attr_destroy(&attr)
77+ size = pthread_get_stacksize_np(pthread_self())
78+ g.stacklo = uintptr(unsafe.Add(unsafe.Pointer(&size), -size+4096))
8279
8380 //TODO: support ios
8481 //#if TARGET_OS_IPHONE
@@ -15,12 +15,12 @@ func _cgo_sys_thread_start(ts *ThreadStart) {
15 var size size_t15 var size size_t
16 var err int16 var err int
17 17
18- //fprintf(stderr, "runtime/cgo: _cgo_sys_thread_start: fn=%p, g=%p\n", ts->fn, ts->g); // debug
19 sigfillset(&ign)18 sigfillset(&ign)
20 pthread_sigmask(SIG_SETMASK, &ign, &oset)19 pthread_sigmask(SIG_SETMASK, &ign, &oset)
21 20
21+ size = pthread_get_stacksize_np(pthread_self())
22 pthread_attr_init(&attr)22 pthread_attr_init(&attr)
23- pthread_attr_getstacksize(&attr, &size)23+ pthread_attr_setstacksize(&attr, size)
24 // Leave stacklo=0 and set stackhi=size; mstart will do the rest.24 // Leave stacklo=0 and set stackhi=size; mstart will do the rest.
25 ts.g.stackhi = uintptr(size)25 ts.g.stackhi = uintptr(size)
26 26
@@ -72,13 +72,10 @@ var setg_func uintptr
72 //go:norace72 //go:norace
73 func x_cgo_init(g *G, setg uintptr) {73 func x_cgo_init(g *G, setg uintptr) {
74 var size size_t74 var size size_t
75- var attr pthread_attr_t
76 75
77 setg_func = setg76 setg_func = setg
78- pthread_attr_init(&attr)77+ size = pthread_get_stacksize_np(pthread_self())
79- pthread_attr_getstacksize(&attr, &size)78+ g.stacklo = uintptr(unsafe.Add(unsafe.Pointer(&size), -size+4096))
80- g.stacklo = uintptr(unsafe.Pointer(&size)) - uintptr(size) + 4096
81- pthread_attr_destroy(&attr)
82 79
83 //TODO: support ios80 //TODO: support ios
84 //#if TARGET_OS_IPHONE81 //#if TARGET_OS_IPHONE
M internal/fakecgo/symbols.go +24 -0
@@ -55,10 +55,22 @@ func pthread_sigmask(how sighow, ign *sigset_t, oset *sigset_t) int32 {
5555 return int32(call5(pthread_sigmaskABI0, uintptr(how), uintptr(unsafe.Pointer(ign)), uintptr(unsafe.Pointer(oset)), 0, 0))
5656 }
5757
58+func pthread_self() pthread_t {
59+ return pthread_t(call5(pthread_selfABI0, 0, 0, 0, 0, 0))
60+}
61+
62+func pthread_get_stacksize_np(thread pthread_t) size_t {
63+ return size_t(call5(pthread_get_stacksize_npABI0, uintptr(thread), 0, 0, 0, 0))
64+}
65+
5866 func pthread_attr_getstacksize(attr *pthread_attr_t, stacksize *size_t) int32 {
5967 return int32(call5(pthread_attr_getstacksizeABI0, uintptr(unsafe.Pointer(attr)), uintptr(unsafe.Pointer(stacksize)), 0, 0, 0))
6068 }
6169
70+func pthread_attr_setstacksize(attr *pthread_attr_t, size size_t) int32 {
71+ return int32(call5(pthread_attr_setstacksizeABI0, uintptr(unsafe.Pointer(attr)), uintptr(size), 0, 0, 0))
72+}
73+
6274 func pthread_attr_destroy(attr *pthread_attr_t) int32 {
6375 return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0))
6476 }
@@ -107,10 +119,22 @@ var pthread_detachABI0 = uintptr(unsafe.Pointer(&_pthread_detach))
107119 var _pthread_sigmask uintptr
108120 var pthread_sigmaskABI0 = uintptr(unsafe.Pointer(&_pthread_sigmask))
109121
122+//go:linkname _pthread_self _pthread_self
123+var _pthread_self uintptr
124+var pthread_selfABI0 = uintptr(unsafe.Pointer(&_pthread_self))
125+
126+//go:linkname _pthread_get_stacksize_np _pthread_get_stacksize_np
127+var _pthread_get_stacksize_np uintptr
128+var pthread_get_stacksize_npABI0 = uintptr(unsafe.Pointer(&_pthread_get_stacksize_np))
129+
110130 //go:linkname _pthread_attr_getstacksize _pthread_attr_getstacksize
111131 var _pthread_attr_getstacksize uintptr
112132 var pthread_attr_getstacksizeABI0 = uintptr(unsafe.Pointer(&_pthread_attr_getstacksize))
113133
134+//go:linkname _pthread_attr_setstacksize _pthread_attr_setstacksize
135+var _pthread_attr_setstacksize uintptr
136+var pthread_attr_setstacksizeABI0 = uintptr(unsafe.Pointer(&_pthread_attr_setstacksize))
137+
114138 //go:linkname _pthread_attr_destroy _pthread_attr_destroy
115139 var _pthread_attr_destroy uintptr
116140 var pthread_attr_destroyABI0 = uintptr(unsafe.Pointer(&_pthread_attr_destroy))
@@ -55,10 +55,22 @@ func pthread_sigmask(how sighow, ign *sigset_t, oset *sigset_t) int32 {
55 return int32(call5(pthread_sigmaskABI0, uintptr(how), uintptr(unsafe.Pointer(ign)), uintptr(unsafe.Pointer(oset)), 0, 0))55 return int32(call5(pthread_sigmaskABI0, uintptr(how), uintptr(unsafe.Pointer(ign)), uintptr(unsafe.Pointer(oset)), 0, 0))
56 }56 }
57 57
58+func pthread_self() pthread_t {
59+ return pthread_t(call5(pthread_selfABI0, 0, 0, 0, 0, 0))
60+}
61+
62+func pthread_get_stacksize_np(thread pthread_t) size_t {
63+ return size_t(call5(pthread_get_stacksize_npABI0, uintptr(thread), 0, 0, 0, 0))
64+}
65+
58 func pthread_attr_getstacksize(attr *pthread_attr_t, stacksize *size_t) int32 {66 func pthread_attr_getstacksize(attr *pthread_attr_t, stacksize *size_t) int32 {
59 return int32(call5(pthread_attr_getstacksizeABI0, uintptr(unsafe.Pointer(attr)), uintptr(unsafe.Pointer(stacksize)), 0, 0, 0))67 return int32(call5(pthread_attr_getstacksizeABI0, uintptr(unsafe.Pointer(attr)), uintptr(unsafe.Pointer(stacksize)), 0, 0, 0))
60 }68 }
61 69
70+func pthread_attr_setstacksize(attr *pthread_attr_t, size size_t) int32 {
71+ return int32(call5(pthread_attr_setstacksizeABI0, uintptr(unsafe.Pointer(attr)), uintptr(size), 0, 0, 0))
72+}
73+
62 func pthread_attr_destroy(attr *pthread_attr_t) int32 {74 func pthread_attr_destroy(attr *pthread_attr_t) int32 {
63 return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0))75 return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0))
64 }76 }
@@ -107,10 +119,22 @@ var pthread_detachABI0 = uintptr(unsafe.Pointer(&_pthread_detach))
107 var _pthread_sigmask uintptr119 var _pthread_sigmask uintptr
108 var pthread_sigmaskABI0 = uintptr(unsafe.Pointer(&_pthread_sigmask))120 var pthread_sigmaskABI0 = uintptr(unsafe.Pointer(&_pthread_sigmask))
109 121
122+//go:linkname _pthread_self _pthread_self
123+var _pthread_self uintptr
124+var pthread_selfABI0 = uintptr(unsafe.Pointer(&_pthread_self))
125+
126+//go:linkname _pthread_get_stacksize_np _pthread_get_stacksize_np
127+var _pthread_get_stacksize_np uintptr
128+var pthread_get_stacksize_npABI0 = uintptr(unsafe.Pointer(&_pthread_get_stacksize_np))
129+
110 //go:linkname _pthread_attr_getstacksize _pthread_attr_getstacksize130 //go:linkname _pthread_attr_getstacksize _pthread_attr_getstacksize
111 var _pthread_attr_getstacksize uintptr131 var _pthread_attr_getstacksize uintptr
112 var pthread_attr_getstacksizeABI0 = uintptr(unsafe.Pointer(&_pthread_attr_getstacksize))132 var pthread_attr_getstacksizeABI0 = uintptr(unsafe.Pointer(&_pthread_attr_getstacksize))
113 133
134+//go:linkname _pthread_attr_setstacksize _pthread_attr_setstacksize
135+var _pthread_attr_setstacksize uintptr
136+var pthread_attr_setstacksizeABI0 = uintptr(unsafe.Pointer(&_pthread_attr_setstacksize))
137+
114 //go:linkname _pthread_attr_destroy _pthread_attr_destroy138 //go:linkname _pthread_attr_destroy _pthread_attr_destroy
115 var _pthread_attr_destroy uintptr139 var _pthread_attr_destroy uintptr
116 var pthread_attr_destroyABI0 = uintptr(unsafe.Pointer(&_pthread_attr_destroy))140 var pthread_attr_destroyABI0 = uintptr(unsafe.Pointer(&_pthread_attr_destroy))
M internal/fakecgo/symbols_darwin.go +3 -0
@@ -7,6 +7,9 @@ package fakecgo
77 //go:cgo_import_dynamic purego_free free "/usr/lib/libSystem.B.dylib"
88 //go:cgo_import_dynamic purego_setenv setenv "/usr/lib/libSystem.B.dylib"
99 //go:cgo_import_dynamic purego_unsetenv unsetenv "/usr/lib/libSystem.B.dylib"
10+//go:cgo_import_dynamic purego_pthread_self pthread_self "/usr/lib/libSystem.B.dylib"
11+//go:cgo_import_dynamic purego_pthread_get_stacksize_np pthread_get_stacksize_np "/usr/lib/libSystem.B.dylib"
12+//go:cgo_import_dynamic purego_pthread_attr_setstacksize pthread_attr_setstacksize "/usr/lib/libSystem.B.dylib"
1013 //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "/usr/lib/libSystem.B.dylib"
1114 //go:cgo_import_dynamic purego_pthread_create pthread_create "/usr/lib/libSystem.B.dylib"
1215 //go:cgo_import_dynamic purego_pthread_detach pthread_detach "/usr/lib/libSystem.B.dylib"
@@ -7,6 +7,9 @@ package fakecgo
7 //go:cgo_import_dynamic purego_free free "/usr/lib/libSystem.B.dylib"7 //go:cgo_import_dynamic purego_free free "/usr/lib/libSystem.B.dylib"
8 //go:cgo_import_dynamic purego_setenv setenv "/usr/lib/libSystem.B.dylib"8 //go:cgo_import_dynamic purego_setenv setenv "/usr/lib/libSystem.B.dylib"
9 //go:cgo_import_dynamic purego_unsetenv unsetenv "/usr/lib/libSystem.B.dylib"9 //go:cgo_import_dynamic purego_unsetenv unsetenv "/usr/lib/libSystem.B.dylib"
10+//go:cgo_import_dynamic purego_pthread_self pthread_self "/usr/lib/libSystem.B.dylib"
11+//go:cgo_import_dynamic purego_pthread_get_stacksize_np pthread_get_stacksize_np "/usr/lib/libSystem.B.dylib"
12+//go:cgo_import_dynamic purego_pthread_attr_setstacksize pthread_attr_setstacksize "/usr/lib/libSystem.B.dylib"
10 //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "/usr/lib/libSystem.B.dylib"13 //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "/usr/lib/libSystem.B.dylib"
11 //go:cgo_import_dynamic purego_pthread_create pthread_create "/usr/lib/libSystem.B.dylib"14 //go:cgo_import_dynamic purego_pthread_create pthread_create "/usr/lib/libSystem.B.dylib"
12 //go:cgo_import_dynamic purego_pthread_detach pthread_detach "/usr/lib/libSystem.B.dylib"15 //go:cgo_import_dynamic purego_pthread_detach pthread_detach "/usr/lib/libSystem.B.dylib"
M internal/fakecgo/trampolines_amd64.s +3 -2
@@ -64,8 +64,9 @@ TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0
6464 // func setg_trampoline(setg uintptr, g uintptr)
6565 TEXT ·setg_trampoline(SB), NOSPLIT, $0-16
6666 MOVQ G+8(FP), DI
67- MOVQ setg+0(FP), AX
68- CALL AX
67+ MOVQ setg+0(FP), BX
68+ XORL AX, AX
69+ CALL BX
6970 RET
7071
7172 TEXT threadentry_trampoline(SB), NOSPLIT, $16
@@ -64,8 +64,9 @@ TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0
64 // func setg_trampoline(setg uintptr, g uintptr)64 // func setg_trampoline(setg uintptr, g uintptr)
65 TEXT ·setg_trampoline(SB), NOSPLIT, $0-1665 TEXT ·setg_trampoline(SB), NOSPLIT, $0-16
66 MOVQ G+8(FP), DI66 MOVQ G+8(FP), DI
67- MOVQ setg+0(FP), AX67+ MOVQ setg+0(FP), BX
68- CALL AX68+ XORL AX, AX
69+ CALL BX
69 RET70 RET
70 71
71 TEXT threadentry_trampoline(SB), NOSPLIT, $1672 TEXT threadentry_trampoline(SB), NOSPLIT, $16
M internal/fakecgo/trampolines_stubs.s +12 -0
@@ -41,10 +41,22 @@ TEXT _pthread_sigmask(SB), NOSPLIT, $0-0
4141 JMP purego_pthread_sigmask(SB)
4242 RET
4343
44+TEXT _pthread_self(SB), NOSPLIT, $0-0
45+ JMP purego_pthread_self(SB)
46+ RET
47+
48+TEXT _pthread_get_stacksize_np(SB), NOSPLIT, $0-0
49+ JMP purego_pthread_get_stacksize_np(SB)
50+ RET
51+
4452 TEXT _pthread_attr_getstacksize(SB), NOSPLIT, $0-0
4553 JMP purego_pthread_attr_getstacksize(SB)
4654 RET
4755
56+TEXT _pthread_attr_setstacksize(SB), NOSPLIT, $0-0
57+ JMP purego_pthread_attr_setstacksize(SB)
58+ RET
59+
4860 TEXT _pthread_attr_destroy(SB), NOSPLIT, $0-0
4961 JMP purego_pthread_attr_destroy(SB)
5062 RET
@@ -41,10 +41,22 @@ TEXT _pthread_sigmask(SB), NOSPLIT, $0-0
41 JMP purego_pthread_sigmask(SB)41 JMP purego_pthread_sigmask(SB)
42 RET42 RET
43 43
44+TEXT _pthread_self(SB), NOSPLIT, $0-0
45+ JMP purego_pthread_self(SB)
46+ RET
47+
48+TEXT _pthread_get_stacksize_np(SB), NOSPLIT, $0-0
49+ JMP purego_pthread_get_stacksize_np(SB)
50+ RET
51+
44 TEXT _pthread_attr_getstacksize(SB), NOSPLIT, $0-052 TEXT _pthread_attr_getstacksize(SB), NOSPLIT, $0-0
45 JMP purego_pthread_attr_getstacksize(SB)53 JMP purego_pthread_attr_getstacksize(SB)
46 RET54 RET
47 55
56+TEXT _pthread_attr_setstacksize(SB), NOSPLIT, $0-0
57+ JMP purego_pthread_attr_setstacksize(SB)
58+ RET
59+
48 TEXT _pthread_attr_destroy(SB), NOSPLIT, $0-060 TEXT _pthread_attr_destroy(SB), NOSPLIT, $0-0
49 JMP purego_pthread_attr_destroy(SB)61 JMP purego_pthread_attr_destroy(SB)
50 RET62 RET

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 102

↑↓ moveenter openesc close