2020-06-20 23:32:13 +00:00
|
|
|
# Copyright (c) 2019-2020 Status Research & Development GmbH
|
|
|
|
# Licensed under either of
|
|
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
|
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
|
|
|
# at your option.
|
|
|
|
# This file may not be copied, modified, or distributed except according to
|
|
|
|
# those terms.
|
|
|
|
|
2021-04-06 11:33:24 +00:00
|
|
|
import
|
|
|
|
std/[hashes, os],
|
|
|
|
nimcrypto/hash, stew/byteutils, metrics,
|
|
|
|
./eth_types
|
|
|
|
|
2020-06-20 23:32:13 +00:00
|
|
|
when defined(posix):
|
2021-04-06 11:33:24 +00:00
|
|
|
import std/posix
|
2019-07-10 00:08:35 +00:00
|
|
|
|
|
|
|
export metrics
|
2019-02-05 10:10:36 +00:00
|
|
|
|
|
|
|
proc hash*(d: MDigest): Hash {.inline.} = hash(d.data)
|
|
|
|
|
|
|
|
proc parseAddress*(hexString: string): EthAddress =
|
|
|
|
hexToPaddedByteArray[20](hexString)
|
|
|
|
|
|
|
|
proc `$`*(a: EthAddress): string =
|
|
|
|
a.toHex()
|
|
|
|
|
2020-06-20 23:32:13 +00:00
|
|
|
# Block all/most signals in the current thread, so we don't interfere with regular signal
|
|
|
|
# handling elsewhere.
|
|
|
|
proc ignoreSignalsInThread*() =
|
|
|
|
when defined(posix):
|
|
|
|
var signalMask, oldSignalMask: Sigset
|
|
|
|
|
|
|
|
# sigprocmask() doesn't work on macOS, for multithreaded programs
|
|
|
|
if sigfillset(signalMask) != 0:
|
|
|
|
echo osErrorMsg(osLastError())
|
|
|
|
quit(QuitFailure)
|
|
|
|
when defined(boehmgc):
|
|
|
|
# Turns out Boehm GC needs some signals to deal with threads:
|
|
|
|
# https://www.hboehm.info/gc/debugging.html
|
|
|
|
const
|
|
|
|
SIGPWR = 30
|
|
|
|
SIGXCPU = 24
|
|
|
|
SIGSEGV = 11
|
|
|
|
SIGBUS = 7
|
|
|
|
if sigdelset(signalMask, SIGPWR) != 0 or
|
|
|
|
sigdelset(signalMask, SIGXCPU) != 0 or
|
|
|
|
sigdelset(signalMask, SIGSEGV) != 0 or
|
|
|
|
sigdelset(signalMask, SIGBUS) != 0:
|
|
|
|
echo osErrorMsg(osLastError())
|
|
|
|
quit(QuitFailure)
|
|
|
|
if pthread_sigmask(SIG_BLOCK, signalMask, oldSignalMask) != 0:
|
|
|
|
echo osErrorMsg(osLastError())
|
|
|
|
quit(QuitFailure)
|