0 | module System.Posix.Pthreads.Prim
2 | import public Data.C.Ptr
3 | import public System.Posix.Errno
4 | import public System.Posix.Pthreads.Struct
5 | import public System.Posix.Pthreads.Types
6 | import System.Posix.Signal
7 | import System.Posix.Time
15 | %foreign "C:pthread_self, posix-idris"
16 | prim__pthread_self : PrimIO AnyPtr
18 | %foreign "C:li_pthread_join, posix-idris"
19 | prim__pthread_join : AnyPtr -> PrimIO Bits32
21 | %foreign "C:li_pthread_mutex_init, posix-idris"
22 | prim__pthread_mutex_init : AnyPtr -> Bits8 -> PrimIO Bits32
24 | %foreign "C:li_pthread_mutex_destroy, posix-idris"
25 | prim__pthread_mutex_destroy : AnyPtr -> PrimIO ()
27 | %foreign "C:pthread_mutex_lock, posix-idris"
28 | prim__pthread_mutex_lock : AnyPtr -> PrimIO Bits32
30 | %foreign "C:pthread_mutex_trylock, posix-idris"
31 | prim__pthread_mutex_trylock : AnyPtr -> PrimIO Bits32
33 | %foreign "C:pthread_mutex_timedlock, posix-idris"
34 | prim__pthread_mutex_timedlock : AnyPtr -> AnyPtr -> PrimIO Bits32
36 | %foreign "C:pthread_mutex_unlock, posix-idris"
37 | prim__pthread_mutex_unlock : AnyPtr -> PrimIO Bits32
39 | %foreign "C:li_pthread_cond_init, posix-idris"
40 | prim__pthread_cond_init : AnyPtr -> PrimIO Bits32
42 | %foreign "C:li_pthread_cond_destroy, posix-idris"
43 | prim__pthread_cond_destroy : AnyPtr -> PrimIO ()
45 | %foreign "C:pthread_cond_signal, posix-idris"
46 | prim__pthread_cond_signal : AnyPtr -> PrimIO Bits32
48 | %foreign "C:pthread_cond_broadcast, posix-idris"
49 | prim__pthread_cond_broadcast : AnyPtr -> PrimIO Bits32
51 | %foreign "C:pthread_cond_wait, posix-idris"
52 | prim__pthread_cond_wait : AnyPtr -> AnyPtr -> PrimIO Bits32
54 | %foreign "C:pthread_cond_timedwait, posix-idris"
55 | prim__pthread_cond_timedwait : AnyPtr -> AnyPtr -> AnyPtr -> PrimIO Bits32
57 | %foreign "C:pthread_cancel, posix-idris"
58 | prim__pthread_cancel : AnyPtr -> PrimIO Bits32
60 | %foreign "C:li_pthread_setcanceltype, posix-idris"
61 | prim__pthread_setcanceltype : Bits8 -> PrimIO Bits8
63 | %foreign "C:li_pthread_setcancelstate, posix-idris"
64 | prim__pthread_setcancelstate : Bits8 -> PrimIO Bits8
66 | %foreign "C:li_pthread_sigmask1, posix-idris"
67 | prim__pthread_sigmask1 : Bits8 -> AnyPtr -> PrimIO ()
69 | %foreign "C:li_pthread_sigmask, posix-idris"
70 | prim__pthread_sigmask : Bits8 -> AnyPtr -> PrimIO AnyPtr
72 | %foreign "C:li_pthread_siggetmask, posix-idris"
73 | prim__pthread_siggetmask : PrimIO AnyPtr
75 | %foreign "C:pthread_kill, posix-idris"
76 | prim__pthread_kill : AnyPtr -> Bits32 -> PrimIO Bits32
84 | pthreadSelf : PrimIO PthreadT
85 | pthreadSelf = primMap P $
prim__pthread_self
89 | pthreadJoin : PthreadT -> EPrim ()
90 | pthreadJoin p = posToUnit $
prim__pthread_join p.ptr
97 | Struct SMutexT where
102 | SizeOf MutexT where sizeof_ = mutex_t_size
108 | mkmutex : MutexType -> EPrim MutexT
110 | let m # t := primStruct SMutexT t
111 | x # t := toF1 (prim__pthread_mutex_init (unwrap m) (mutexCode mt)) t
114 | x => freeFail m (EN x) t
118 | destroyMutex : MutexT -> PrimIO ()
119 | destroyMutex m = prim__pthread_mutex_destroy (unwrap m)
124 | lockMutex : MutexT -> EPrim ()
125 | lockMutex p = posToUnit $
prim__pthread_mutex_lock (unwrap p)
130 | timedlockMutex : MutexT -> Clock Duration -> EPrim Bool
131 | timedlockMutex p cl =
132 | withTimespec cl $
\ts =>
133 | posNotErr ETIMEDOUT (prim__pthread_mutex_timedlock (unwrap p) (unwrap ts))
138 | trylockMutex : MutexT -> EPrim Bool
140 | posNotErr EBUSY (prim__pthread_mutex_trylock $
unwrap p)
147 | unlockMutex : MutexT -> EPrim ()
148 | unlockMutex p = posToUnit $
prim__pthread_mutex_unlock (unwrap p)
155 | Struct SCondT where
160 | SizeOf CondT where sizeof_ = cond_t_size
166 | mkcond : EPrim CondT
168 | let m # t := primStruct SCondT t
169 | x # t := toF1 (prim__pthread_cond_init m.ptr) t
172 | x => freeFail m (EN x) t
176 | destroyCond : CondT -> PrimIO ()
177 | destroyCond m = prim__pthread_cond_destroy m.ptr
185 | condSignal : CondT -> EPrim ()
186 | condSignal p = posToUnit $
prim__pthread_cond_signal p.ptr
192 | condBroadcast : CondT -> EPrim ()
193 | condBroadcast p = posToUnit $
prim__pthread_cond_broadcast p.ptr
202 | condWait : CondT -> MutexT -> EPrim ()
203 | condWait p m = posToUnit $
prim__pthread_cond_wait p.ptr m.ptr
207 | condTimedwait : CondT -> MutexT -> Clock UTC -> EPrim Bool
208 | condTimedwait p m cl =
209 | withTimespec cl $
\ts =>
210 | posNotErr ETIMEDOUT (prim__pthread_cond_timedwait p.ptr m.ptr (unwrap ts))
216 | toTpe : Bits8 -> CancelType
218 | if b == cancelType CANCEL_DEFERRED then CANCEL_DEFERRED else CANCEL_ASYNCHRONOUS
220 | toSt : Bits8 -> CancelState
222 | if b == cancelState CANCEL_ENABLE then CANCEL_ENABLE else CANCEL_DISABLE
226 | pthreadCancel : PthreadT -> EPrim ()
227 | pthreadCancel t = posToUnit $
prim__pthread_cancel t.ptr
231 | export %foreign "C:pthread_testcancel, posix-idris"
232 | pthreadTestCancel : PrimIO ()
236 | setCancelType : CancelType -> PrimIO CancelType
237 | setCancelType t = primMap toTpe $
prim__pthread_setcanceltype (cancelType t)
241 | setCancelState : CancelState -> PrimIO CancelState
242 | setCancelState t = primMap toSt $
prim__pthread_setcancelstate (cancelState t)
257 | pthreadSigmask_ : How -> SigsetT -> PrimIO SigsetT
258 | pthreadSigmask_ h p w =
259 | let MkIORes p2 w := prim__pthread_sigmask (howCode h) (unwrap p) w
260 | in MkIORes (wrap p2) w
268 | pthreadSiggetmask : PrimIO SigsetT
269 | pthreadSiggetmask w =
270 | let MkIORes p w := prim__pthread_siggetmask w
271 | in MkIORes (wrap p) w
275 | pthreadKill : PthreadT -> Signal -> EPrim ()
276 | pthreadKill t s = posToUnit $
prim__pthread_kill t.ptr s.sig
285 | pthreadSigmask : How -> List Signal -> EPrim ()
286 | pthreadSigmask h ss =
287 | withSignals ss $
\p,t =>
288 | let _ # t := toF1 (prim__pthread_sigmask1 (howCode h) (unwrap p)) t