(* $Id$ *)
open Netsys_oothr
exception Thread_val of Thread.t
exception Mutex_val of Mutex.t
exception Condition_val of Condition.t
let mtthread t : thread =
( object
method id = Thread.id t
method join() = Thread.join t
method repr = Thread_val t
end
)
let mtmutex t : mutex =
( object(self)
method lock() =
(* Printf.eprintf "LOCK oid=%d\n%!" (Oo.id self); *)
Mutex.lock t
method unlock() =
(* Printf.eprintf "UNLOCK oid=%d\n%!" (Oo.id self); *)
Mutex.unlock t
method try_lock() = Mutex.try_lock t
method repr = Mutex_val t
end
)
let mtcondition c : condition =
( object
method wait mobj =
let m =
match mobj#repr with
| Mutex_val m -> m
| _ -> failwith "Netsys_oothr_mt: inconsistent use" in
Condition.wait c m
method signal() = Condition.signal c
method broadcast() = Condition.broadcast c
method repr = Condition_val c
end
)
let mtprovider() : mtprovider =
( object
method single_threaded = false
method create_thread : 's 't . ('s -> 't) -> 's -> thread =
fun f arg ->
mtthread(Thread.create f arg)
method self = mtthread(Thread.self())
method yield() = Thread.yield()
method create_mutex() = mtmutex(Mutex.create())
method create_condition() = mtcondition(Condition.create())
end
)
let init() =
Netsys_oothr.provider := mtprovider()