annotate dreactor/util/ThreadSafeQueue.d @ 0:7a315154bf5e

Initial commit
author rick@minifunk
date Sun, 08 Jun 2008 01:45:38 -0400
parents
children e3dbc9208822
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
1 module dreactor.util.ThreadSafeQueue;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
2
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
3 import tango.util.collection.CircularSeq;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
4
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
5 /******************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
6
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
7 ThreadSafeQueue
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
8 Queue that is probably thread safe. It acts as a job queue, in that
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
9 you can push or pop off of the queue. Or you can processAll, which will
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
10 apply a delegate to each item, then clear the list.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
11
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
12 ******************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
13 class ThreadSafeQueue(TYPE)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
14 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
15 public
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
16 this(int maxsz = 1000)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
17 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
18 list = new CircularSeq!(TYPE);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
19 maxsize = maxsz;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
20 size = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
21 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
22
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
23 synchronized bool pop(ref TYPE t)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
24 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
25 if (list.size())
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
26 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
27 TYPE t = list.head();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
28 list.removeHead();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
29 --size;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
30 return true;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
31 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
32 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
33 return false;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
34 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
35
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
36 synchronized bool push(TYPE t)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
37 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
38 if (list.size < maxsize)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
39 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
40 list.append(t);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
41 ++size;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
42 return true;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
43 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
44 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
45 return false;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
46 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
47
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
48 synchronized int size()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
49 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
50 return size();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
51 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
52
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
53 synchronized int processAll(int delegate(ref T value) dg)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
54 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
55 int count = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
56 foreach(T t; list)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
57 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
58 if (dg(t) < 0)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
59 break;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
60 ++count;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
61 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
62 if (count == size)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
63 clear_();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
64 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
65 list.removeRange(0, count);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
66 return count;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
67 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
68
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
69 synchronized void clear()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
70 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
71 clear_();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
72 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
73
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
74 private
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
75
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
76 void clear_()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
77 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
78 list.removeAll();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
79 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
80
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
81 CircularSeq!(TYPE) list;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
82 int maxsize;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
83 int size;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
84 }