blob: 4beacfe70b98cdba3d4cc60e17b983b1e0ceddfd (
plain) (
blame)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
/* __ *\
** ________ ___ / / ___ Scala API **
** / __/ __// _ | / / / _ | (c) 2005-2007, LAMP/EPFL **
** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
** /____/\___/_/ |_/____/_/ | | **
** |/ **
\* */
// $Id$
package scala.actors
/**
* This class is used by our efficient message queue
* implementation.
*
* @version 0.9.9
* @author Philipp Haller
*/
@serializable
class MessageQueueElement {
var msg: Any = _
var session: OutputChannel[Any] = null
var next: MessageQueueElement = null
}
/**
* The class <code>MessageQueue</code> provides an efficient
* implementation of a message queue specialized for this actor
* library. Classes in this package are supposed to be the only
* clients of this class.
*
* @version 0.9.8
* @author Philipp Haller
*/
@serializable
class MessageQueue {
var first: MessageQueueElement = null
// last == null iff list empty
var last: MessageQueueElement = null
def isEmpty = null eq last
def append(msg: Any, session: OutputChannel[Any]) = {
if (null eq last) { // list empty
val el = new MessageQueueElement
el.msg = msg
el.session = session
first = el
last = el
}
else {
val el = new MessageQueueElement
el.msg = msg
el.session = session
last.next = el
last = el
}
}
def extractFirst(p: Any => Boolean): MessageQueueElement = {
if (null eq last) null
else {
// test first element
if (p(first.msg)) {
val tmp = first
// remove first element
first = first.next
// might have to update last
if (tmp eq last) {
last = null
}
tmp
}
else {
var curr = first
var prev = curr
while(curr.next != null) {
prev = curr
curr = curr.next
if (p(curr.msg)) {
// remove curr
prev.next = curr.next
// might have to update last
if (curr eq last) {
last = prev
}
return curr
}
}
null
}
}
}
}
|