-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathconcurrent.ml
More file actions
51 lines (45 loc) · 1.06 KB
/
Copy pathconcurrent.ml
File metadata and controls
51 lines (45 loc) · 1.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
open Lwt_condition
let waitingWriters = ref 0
let waitingReaders = ref 0
let nReaders = ref 0
let nWriters = ref 0
let canRead = create ()
let canWrite = create ()
let m = Lwt_mutex.create ()
let beginWrite () =
Lwt_mutex.lock m;
waitingWriters := !waitingWriters + 1;
while !nWriters > 0 || !nReaders > 0 do
wait canWrite m;
waitingWriters := !waitingWriters - 1;
done;
nWriters := 1;
Lwt_mutex.unlock m;
()
let endWrite () =
Lwt_mutex.lock m;
nWriters := 0;
let _ =
if !waitingWriters > 0 then (broadcast canWrite;)
else if (!waitingReaders > 0) then (broadcast canRead;)
else ignore ()
in
Lwt_mutex.unlock m;
()
let beginRead () =
Lwt_mutex.lock m;
waitingReaders := !waitingReaders + 1;
while (!nWriters>0 || !waitingWriters>0) do
wait canRead m;
done;
waitingReaders := !waitingReaders - 1;
nReaders := !nReaders + 1;
Lwt_mutex.unlock m;
()
let endRead () =
Lwt_mutex.lock m;
nReaders := !nReaders - 1;
if (!nReaders = 0 && !waitingWriters > 0) then
broadcast canWrite;
Lwt_mutex.unlock m;
()