Revert "Revert "Made use of ::= in core libraries and defined a RebindError condition...
[cslatevm.git] / src / lib / sharedqueue.slate
blob629d1dc24e3dc4bf5a8753dc889ac68eb0b109a6
1 collections define: #SharedQueue &parents: {ExtensibleSequence}
2   &slots: {#mutex -> Nil.
3            #waitq -> Nil.
4            #inner -> Queue new}.
6 s@(SharedQueue traits) copy
7 [shouldNotImplement].
9 s@(SharedQueue traits) new
11   s clone `setting: #{#mutex. #waitq. #inner}
12     to: {Semaphore newMutex.
13          Semaphore new.
14          s inner new}
17 s@(SharedQueue traits) isEmpty
19   s inner isEmpty
22 s@(SharedQueue traits) addLast: x
24   s mutex critical: [s inner addLast: x].
25   s waitq signal.
26   x
29 s@(SharedQueue traits) removeFirst
31   s waitq wait.
32   s mutex critical: [s inner removeFirst]
35 "TODO: change the Queue protocol to a mixin/trait and re-use it here:"
36 "Queue-compatible protocol: " (
37 q@(Queue traits) remove [q removeFirst].
38 q@(Queue traits) remove: n [q removeFirst: n].
40 q@(Queue traits) push: obj [q add: obj].
41 q@(Queue traits) pop [q remove].
42 q@(Queue traits) pushAll: c [q addAll: c].
43 q@(Queue traits) pop: n [q remove: n].
46 "Producer/consumer."
48 load: 'src/lib/process.slate'.
49 load: 'src/lib/semaphore.slate'.
50 load: 'src/lib/sharedqueue.slate'.
51 lobby define: #q -> SharedQueue new.
53   [(1 to: 10) do: [|:i| q addLast: i. Scheduler yield. ]] spawn.
54   [[q removeFirst print. Console ; '\n'] loop] spawn.
55 ] do.