Mercurial > projects > dreactor
comparison dreactor/core/Task.d @ 11:5836613d16ac
reorg! reorg!
author | rick@minifunk |
---|---|
date | Tue, 12 Aug 2008 16:59:56 -0400 |
parents | |
children | d6a3cfe7c3de |
comparison
equal
deleted
inserted
replaced
10:e75a2e506b1d | 11:5836613d16ac |
---|---|
1 module dreactor.core.Task; | |
2 | |
3 import tango.core.Thread; | |
4 import dreactor.core.Vat; | |
5 import dreactor.protocol.Protocol; | |
6 import dreactor.protocol.Dispatcher; | |
7 | |
8 alias CircularSeq!(Message) Mailbox; | |
9 | |
10 class Task | |
11 { | |
12 private | |
13 Fiber fiber; | |
14 Mailbox mailbox; | |
15 int id; | |
16 Vat vat; | |
17 dispatcher[Conduit] dispatchers; | |
18 | |
19 public | |
20 this() | |
21 { | |
22 fiber = new Fiber(&run); | |
23 mailbox = new Mailbox; | |
24 } | |
25 | |
26 void setId(int i) | |
27 { | |
28 id = i; | |
29 } | |
30 | |
31 Mailbox getMailbox() | |
32 { | |
33 return mailbox; | |
34 } | |
35 | |
36 void setVat(Vat v) | |
37 { | |
38 vat = v; | |
39 } | |
40 | |
41 abstract void run(); | |
42 | |
43 protected | |
44 | |
45 /*************************************************************************** | |
46 receive | |
47 User-called function to get the next pending message in the mailbox. | |
48 If there are no pending messages, this will yield control back to | |
49 the scheduler/vat. | |
50 ***************************************************************************/ | |
51 | |
52 Message receive() | |
53 { | |
54 Message m = mailbox.head(); | |
55 mailbox.removeHead(); | |
56 return m; | |
57 } | |
58 | |
59 int getId() { return id;} | |
60 | |
61 /************************************************************************** | |
62 | |
63 send | |
64 User-called function to send data to the counterpart at the other | |
65 end of the connection. This sets up a dispatcher to send | |
66 data as the conduit becomes free. | |
67 | |
68 **************************************************************************/ | |
69 int send(char[] outbuf, Conduit c) | |
70 { | |
71 Dispatcher dis; | |
72 if ( ! (dis = (c in dispatchers))) | |
73 dis = new Dispatcher(c); | |
74 | |
75 if (dis.appendOutBuffer(outbuf)) | |
76 { | |
77 if (!vat.addConnection(dis)) | |
78 { | |
79 log.error("unable to register mgr"); | |
80 } | |
81 } | |
82 return 0; | |
83 } | |
84 } |