Skip to content

Commit

Permalink
refactoring: orc can use getThreadId() (#19123)
Browse files Browse the repository at this point in the history
* refactoring: orc can use getThreadId()

* progress
  • Loading branch information
Araq authored Nov 11, 2021
1 parent 7313b70 commit cde83d9
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 96 deletions.
7 changes: 5 additions & 2 deletions lib/system/orc.nim
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,12 @@ proc trace(s: Cell; desc: PNimTypeV2; j: var GcEnv) {.inline.} =
var p = s +! sizeof(RefHeader)
cast[TraceProc](desc.traceImpl)(p, addr(j))

include threadids

when logOrc:
proc writeCell(msg: cstring; s: Cell; desc: PNimTypeV2) =
cfprintf(cstderr, "%s %s %ld root index: %ld; RC: %ld; color: %ld\n",
msg, desc.name, s.refId, s.rootIdx, s.rc shr rcShift, s.color)
cfprintf(cstderr, "%s %s %ld root index: %ld; RC: %ld; color: %ld; thread: %ld\n",
msg, desc.name, s.refId, s.rootIdx, s.rc shr rcShift, s.color, getThreadId())

proc free(s: Cell; desc: PNimTypeV2) {.inline.} =
when traceCollector:
Expand Down Expand Up @@ -419,6 +421,7 @@ proc registerCycle(s: Cell; desc: PNimTypeV2) =
proc GC_runOrc* =
## Forces a cycle collection pass.
collectCycles()
orcAssert roots.len == 0, "roots not empty!"

proc GC_enableOrc*() =
## Enables the cycle collector subsystem of `--gc:orc`. This is a `--gc:orc`
Expand Down
103 changes: 103 additions & 0 deletions lib/system/threadids.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#
#
# Nim's Runtime Library
# (c) Copyright 2020 Andreas Rumpf
#
# See the file "copying.txt", included in this
# distribution, for details about the copyright.
#

# we need to cache current threadId to not perform syscall all the time
var threadId {.threadvar.}: int

when defined(windows):
proc getCurrentThreadId(): int32 {.
stdcall, dynlib: "kernel32", importc: "GetCurrentThreadId".}

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(getCurrentThreadId())
result = threadId

elif defined(linux):
proc syscall(arg: clong): clong {.varargs, importc: "syscall", header: "<unistd.h>".}
when defined(amd64):
const NR_gettid = clong(186)
else:
var NR_gettid {.importc: "__NR_gettid", header: "<sys/syscall.h>".}: clong

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(syscall(NR_gettid))
result = threadId

elif defined(dragonfly):
proc lwp_gettid(): int32 {.importc, header: "unistd.h".}

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(lwp_gettid())
result = threadId

elif defined(openbsd):
proc getthrid(): int32 {.importc: "getthrid", header: "<unistd.h>".}

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(getthrid())
result = threadId

elif defined(netbsd):
proc lwp_self(): int32 {.importc: "_lwp_self", header: "<lwp.h>".}

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(lwp_self())
result = threadId

elif defined(freebsd):
proc syscall(arg: cint, arg0: ptr cint): cint {.varargs, importc: "syscall", header: "<unistd.h>".}
var SYS_thr_self {.importc:"SYS_thr_self", header:"<sys/syscall.h>".}: cint

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
var tid = 0.cint
if threadId == 0:
discard syscall(SYS_thr_self, addr tid)
threadId = tid
result = threadId

elif defined(macosx):
proc syscall(arg: cint): cint {.varargs, importc: "syscall", header: "<unistd.h>".}
var SYS_thread_selfid {.importc:"SYS_thread_selfid", header:"<sys/syscall.h>".}: cint

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(syscall(SYS_thread_selfid))
result = threadId

elif defined(solaris):
type thread_t {.importc: "thread_t", header: "<thread.h>".} = distinct int
proc thr_self(): thread_t {.importc, header: "<thread.h>".}

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(thr_self())
result = threadId

elif defined(haiku):
type thr_id {.importc: "thread_id", header: "<OS.h>".} = distinct int32
proc find_thread(name: cstring): thr_id {.importc, header: "<OS.h>".}

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(find_thread(nil))
result = threadId
3 changes: 0 additions & 3 deletions lib/system/threadlocalstorage.nim
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@ when defined(windows):
proc terminateThread(hThread: SysThread, dwExitCode: int32): int32 {.
stdcall, dynlib: "kernel32", importc: "TerminateThread".}

proc getCurrentThreadId(): int32 {.
stdcall, dynlib: "kernel32", importc: "GetCurrentThreadId".}

type
ThreadVarSlot = distinct int32

Expand Down
93 changes: 2 additions & 91 deletions lib/system/threads.nim
Original file line number Diff line number Diff line change
Expand Up @@ -343,94 +343,5 @@ else:
proc createThread*(t: var Thread[void], tp: proc () {.thread, nimcall.}) =
createThread[void](t, tp)

# we need to cache current threadId to not perform syscall all the time
var threadId {.threadvar.}: int

when defined(windows):
proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(getCurrentThreadId())
result = threadId

elif defined(linux):
proc syscall(arg: clong): clong {.varargs, importc: "syscall", header: "<unistd.h>".}
when defined(amd64):
const NR_gettid = clong(186)
else:
var NR_gettid {.importc: "__NR_gettid", header: "<sys/syscall.h>".}: clong

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(syscall(NR_gettid))
result = threadId

elif defined(dragonfly):
proc lwp_gettid(): int32 {.importc, header: "unistd.h".}

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(lwp_gettid())
result = threadId

elif defined(openbsd):
proc getthrid(): int32 {.importc: "getthrid", header: "<unistd.h>".}

proc getThreadId*(): int =
## get the ID of the currently running thread.
if threadId == 0:
threadId = int(getthrid())
result = threadId

elif defined(netbsd):
proc lwp_self(): int32 {.importc: "_lwp_self", header: "<lwp.h>".}

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(lwp_self())
result = threadId

elif defined(freebsd):
proc syscall(arg: cint, arg0: ptr cint): cint {.varargs, importc: "syscall", header: "<unistd.h>".}
var SYS_thr_self {.importc:"SYS_thr_self", header:"<sys/syscall.h>".}: cint

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
var tid = 0.cint
if threadId == 0:
discard syscall(SYS_thr_self, addr tid)
threadId = tid
result = threadId

elif defined(macosx):
proc syscall(arg: cint): cint {.varargs, importc: "syscall", header: "<unistd.h>".}
var SYS_thread_selfid {.importc:"SYS_thread_selfid", header:"<sys/syscall.h>".}: cint

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(syscall(SYS_thread_selfid))
result = threadId

elif defined(solaris):
type thread_t {.importc: "thread_t", header: "<thread.h>".} = distinct int
proc thr_self(): thread_t {.importc, header: "<thread.h>".}

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(thr_self())
result = threadId

elif defined(haiku):
type thr_id {.importc: "thread_id", header: "<OS.h>".} = distinct int32
proc find_thread(name: cstring): thr_id {.importc, header: "<OS.h>".}

proc getThreadId*(): int =
## Gets the ID of the currently running thread.
if threadId == 0:
threadId = int(find_thread(nil))
result = threadId
when not defined(gcOrc):
include threadids

0 comments on commit cde83d9

Please sign in to comment.