Merge pull request #1545 from rbehrends/setjmp-perf
Improve setjmp()/longjmp() performance.
This commit is contained in:
commit
c17c8e9afa
4 changed files with 30 additions and 6 deletions
|
|
@ -832,6 +832,13 @@ proc genTry(p: BProc, t: PNode, d: var TLoc) =
|
||||||
discard cgsym(p.module, "E_Base")
|
discard cgsym(p.module, "E_Base")
|
||||||
linefmt(p, cpsLocals, "#TSafePoint $1;$n", safePoint)
|
linefmt(p, cpsLocals, "#TSafePoint $1;$n", safePoint)
|
||||||
linefmt(p, cpsStmts, "#pushSafePoint(&$1);$n", safePoint)
|
linefmt(p, cpsStmts, "#pushSafePoint(&$1);$n", safePoint)
|
||||||
|
if isDefined("nimStdSetjmp"):
|
||||||
|
linefmt(p, cpsStmts, "$1.status = setjmp($1.context);$n", safePoint)
|
||||||
|
elif isDefined("nimSigSetjmp"):
|
||||||
|
linefmt(p, cpsStmts, "$1.status = sigsetjmp($1.context, 0);$n", safePoint)
|
||||||
|
elif isDefined("nimRawSetjmp"):
|
||||||
|
linefmt(p, cpsStmts, "$1.status = _setjmp($1.context);$n", safePoint)
|
||||||
|
else:
|
||||||
linefmt(p, cpsStmts, "$1.status = setjmp($1.context);$n", safePoint)
|
linefmt(p, cpsStmts, "$1.status = setjmp($1.context);$n", safePoint)
|
||||||
startBlock(p, "if ($1.status == 0) {$n", [safePoint])
|
startBlock(p, "if ($1.status == 0) {$n", [safePoint])
|
||||||
var length = sonsLen(t)
|
var length = sonsLen(t)
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ import
|
||||||
ast, astalgo, strutils, hashes, trees, platform, magicsys, extccomp,
|
ast, astalgo, strutils, hashes, trees, platform, magicsys, extccomp,
|
||||||
options, intsets,
|
options, intsets,
|
||||||
nversion, nimsets, msgs, crc, bitsets, idents, lists, types, ccgutils, os,
|
nversion, nimsets, msgs, crc, bitsets, idents, lists, types, ccgutils, os,
|
||||||
times, ropes, math, passes, rodread, wordrecg, treetab, cgmeth,
|
times, ropes, math, passes, rodread, wordrecg, treetab, cgmeth, condsyms,
|
||||||
rodutils, renderer, idgen, cgendata, ccgmerge, semfold, aliases, lowerings,
|
rodutils, renderer, idgen, cgendata, ccgmerge, semfold, aliases, lowerings,
|
||||||
semparallel
|
semparallel
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -136,3 +136,7 @@ proc initDefines*() =
|
||||||
declareSymbol("emulatedthreadvars")
|
declareSymbol("emulatedthreadvars")
|
||||||
if platform.OS[targetOS].props.contains(ospLacksThreadVars):
|
if platform.OS[targetOS].props.contains(ospLacksThreadVars):
|
||||||
defineSymbol("emulatedthreadvars")
|
defineSymbol("emulatedthreadvars")
|
||||||
|
case targetOS
|
||||||
|
of osSolaris, osNetbsd, osFreebsd, osOpenbsd, osMacosx:
|
||||||
|
defineSymbol("nimRawSetjmp")
|
||||||
|
else: discard
|
||||||
|
|
|
||||||
|
|
@ -78,9 +78,22 @@ when defined(macosx):
|
||||||
else:
|
else:
|
||||||
template SIGBUS: expr = SIGSEGV
|
template SIGBUS: expr = SIGSEGV
|
||||||
|
|
||||||
proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {.
|
when defined(nimSigSetjmp) and not defined(nimStdSetjmp):
|
||||||
|
proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {.
|
||||||
|
header: "<setjmp.h>", importc: "siglongjmp".}
|
||||||
|
template c_setjmp(jmpb: C_JmpBuf): cint =
|
||||||
|
proc c_sigsetjmp(jmpb: C_JmpBuf, savemask: cint): cint {.
|
||||||
|
header: "<setjmp.h>", importc: "sigsetjmp".}
|
||||||
|
c_sigsetjmp(jmpb, 0)
|
||||||
|
elif defined(nimRawSetjmp) and not defined(nimStdSetjmp):
|
||||||
|
proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {.
|
||||||
|
header: "<setjmp.h>", importc: "_longjmp".}
|
||||||
|
proc c_setjmp(jmpb: C_JmpBuf): cint {.
|
||||||
|
header: "<setjmp.h>", importc: "_setjmp".}
|
||||||
|
else:
|
||||||
|
proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {.
|
||||||
header: "<setjmp.h>", importc: "longjmp".}
|
header: "<setjmp.h>", importc: "longjmp".}
|
||||||
proc c_setjmp(jmpb: C_JmpBuf): cint {.
|
proc c_setjmp(jmpb: C_JmpBuf): cint {.
|
||||||
header: "<setjmp.h>", importc: "setjmp".}
|
header: "<setjmp.h>", importc: "setjmp".}
|
||||||
|
|
||||||
proc c_signal(sig: cint, handler: proc (a: cint) {.noconv.}) {.
|
proc c_signal(sig: cint, handler: proc (a: cint) {.noconv.}) {.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue