1
1
2
2
import std/ sets
3
-
3
+ import std / macros
4
4
import ./ [
5
5
errutil,
6
6
c_api,
@@ -11,31 +11,42 @@ import ./[
11
11
siginfo_decl
12
12
]
13
13
import ../ sys_impl/ auditImpl as sys
14
- export Sigset
14
+ when HAVE_SIGSET_T:
15
+ export Sigset
16
+ converter toSigset* (oa: openArray [int ]): Sigset = result .fromIterable oa
17
+
15
18
export siginfo_decl except fill_siginfo
16
19
import ../../ Python/ pytime/ [deadline, pytimeFromSeconds, pytimeAsTimeval]
17
20
18
- proc alarm* (seconds: int ): int = int alarm seconds.cint
19
- proc pause* (): int = int posix.pause()
20
-
21
- proc pthread_kill* (thread_id: uint , signalnum: int ) =
22
- sys.audit(" signal.pthread_kill" , thread_id, signalnum)
23
- let err = pthread_kill(Pthread thread_id, cint signalnum)
24
- if err != 0 :
25
- raiseErrno()
21
+ proc mayUndefImpl(def: NimNode): NimNode =
22
+ let cond = ident " HAVE_" & def.name.strVal
23
+ result = nnkWhenStmt.newTree(nnkElifBranch.newTree(cond, def))
24
+ macro mayUndef(def) = mayUndefImpl(def)
25
+ macro mayUndefs(defs) =
26
+ result = newStmtList()
27
+ for def in defs:
28
+ result .add mayUndefimpl(def)
29
+
30
+ mayUndefs:
31
+ proc alarm* (seconds: int ): int = int alarm seconds.cint
32
+ proc pause* (): int = int posix.pause()
33
+
34
+ proc pthread_kill* (thread_id: uint , signalnum: int ) =
35
+ sys.audit(" signal.pthread_kill" , thread_id, signalnum)
36
+ let err = pthread_kill(Pthread thread_id, cint signalnum)
37
+ if err != 0 :
38
+ raiseErrno()
26
39
27
- PyErr_CheckSignalsAndRaises()
40
+ PyErr_CheckSignalsAndRaises()
28
41
29
42
type
30
43
Set[T] = HashSet[T]
31
44
32
- converter toSigset* (oa: openArray [int ]): Sigset = result .fromIterable oa
33
-
34
45
35
46
template markVar(sym) =
36
47
var sym = sym
37
48
38
- proc pthread_sigmask* (how: int , mask: Sigset): Set[int ] =
49
+ proc pthread_sigmask* (how: int , mask: Sigset): Set[int ]{.mayUndef.} =
39
50
var previous: Sigset
40
51
markVar mask
41
52
let err = pthread_sigmask(how.cint , mask, previous)
@@ -44,44 +55,48 @@ proc pthread_sigmask*(how: int, mask: Sigset): Set[int] =
44
55
PyErr_CheckSignalsAndRaises()
45
56
sigset_to_set(previous)
46
57
47
- type ItimerVal* {.importc: " struct itimerval" , header: " <sys/time.h>" .} = object
48
- it_interval, it_value: Timeval
49
- type ItimerWhich = cint # enum
50
- proc setitimer(which: ItimerWhich, `new`, old: ItimerVal): cint {.importc, header: " <sys/header.h>" .}
51
- proc getitimer(which: ItimerWhich, old: ItimerVal): cint {.importc, header: " <sys/header.h>" .}
52
-
53
- func toFloat(tv: Timeval): float =
54
- tv.tv_sec.float + tv.tv_usec.float / 1_000_000.0
55
-
56
- proc itimer_retval(old: ItimerVal): tuple [delay, interval: float ] =
57
- (old.it_value.toFloat, old.it_interval.toFloat)
58
-
59
- proc toTimeval(obj: float ): Timeval =
60
- # # timeval_from_double
61
- var t: PyTime
62
- t.fromSecondsObject(obj, prCeiling)
63
- t.asTimeval(prCeiling)
64
-
65
58
type ItimerError* = object of PyOSError
66
59
67
- proc setitimer* (which: int , seconds: float ; interval= 0.0 ): tuple [delay, interval: float ] =
68
- var n: ItimerVal
69
- n.it_value = seconds.toTimeval
70
- n.it_interval = interval.toTimeval
71
- var old: ItimerVal
72
- if setitimer(which.cint , n, old) != 0 :
73
- raiseErrnoT[ItimerError]()
74
- itimer_retval old
75
-
76
- proc getitimer*(which: int ): tuple[delay, interval: float ] =
77
- var old: ItimerVal
78
- if getitimer(which.cint , old) != 0:
79
- raiseErrnoT[ItimerError]()
80
-
81
- itimer_retval old
60
+ when HAVE_SETITIMER or HAVE_GETITIMER:
61
+ type ItimerVal* {.importc: " struct itimerval" , header: " <sys/time.h>" .} = object
62
+ it_interval, it_value: Timeval
63
+ type ItimerWhich = cint # enum
64
+ func toFloat(tv: Timeval): float =
65
+ tv.tv_sec.float + tv.tv_usec.float / 1_000_000.0
66
+
67
+ proc itimer_retval(old: ItimerVal): tuple [delay, interval: float ] =
68
+ (old.it_value.toFloat, old.it_interval.toFloat)
69
+
70
+
71
+ when HAVE_SETITIMER:
72
+ proc setitimer(which: ItimerWhich, `new`, old: ItimerVal): cint {.importc, header: " <sys/header.h>" .}
73
+ proc toTimeval(obj: float ): Timeval =
74
+ # # timeval_from_double
75
+ var t: PyTime
76
+ t.fromSecondsObject(obj, prCeiling)
77
+ t.asTimeval(prCeiling)
78
+
79
+
80
+ proc setitimer* (which: int , seconds: float ; interval= 0.0 ): tuple [delay, interval: float ] =
81
+ var n: ItimerVal
82
+ n.it_value = seconds.toTimeval
83
+ n.it_interval = interval.toTimeval
84
+ var old: ItimerVal
85
+ if setitimer(which.cint , n, old) != 0 :
86
+ raiseErrnoT[ItimerError]()
87
+ itimer_retval old
88
+
89
+ when HAVE_GETITIMER:
90
+ proc getitimer(which: ItimerWhich, old: ItimerVal): cint {.importc, header: "<sys/header.h>".}
91
+ proc getitimer*(which: int ): tuple[delay, interval: float ] =
92
+ var old: ItimerVal
93
+ if getitimer(which.cint , old) != 0:
94
+ raiseErrnoT[ItimerError]()
95
+
96
+ itimer_retval old
82
97
83
98
84
- proc siginterrupt*(signalnum, flag: int ) =
99
+ proc siginterrupt*(signalnum, flag: int ){.mayUndef.} =
85
100
let csignalnum = cint signalnum
86
101
csignalnum.chkSigRng
87
102
when HAVE_SIGACTION:
@@ -98,20 +113,20 @@ proc siginterrupt*(signalnum, flag: int) =
98
113
raiseErrno()
99
114
100
115
101
- proc sigpending*(): Set[int ] =
116
+ proc sigpending*(): Set[int ]{.mayUndef.} =
102
117
var mask: Sigset
103
118
if 0 != sigpending(mask):
104
119
raiseErrno()
105
120
sigset_to_set mask
106
121
107
- proc sigwait*(sigset: Sigset): int =
122
+ proc sigwait*(sigset: Sigset): int {.mayUndef.} =
108
123
var signum: cint
109
124
markVar sigset
110
125
let err = sigwait(sigset, signum)
111
126
if err != 0:
112
127
raiseErrno err
113
128
114
- proc sigwaitinfo*(sigset: Sigset): struct_siginfo =
129
+ proc sigwaitinfo*(sigset: Sigset): struct_siginfo{.mayUndef.} =
115
130
var err: cint
116
131
var si: SigInfo
117
132
var async_err = 0
@@ -132,7 +147,7 @@ proc sigwaitinfo*(sigset: Sigset): struct_siginfo =
132
147
proc PyTime_AsTimespec(x: TimeStamp): Timespec =
133
148
x.nPyTime_ObjectToTimeval(result .tv_sec, result .tv_usec, prCeiling)
134
149
135
- proc sigtimedwait*(sigset: Sigset, timeout: TimeStamp): struct_siginfo =
150
+ proc sigtimedwait*(sigset: Sigset, timeout: TimeStamp): struct_siginfo{.mayUndef.} =
136
151
var si: SigInfo
137
152
markVar sigset
138
153
var to: PyTime
0 commit comments