Mercurial > projects > ldc
comparison tango/tango/net/cluster/tina/ClusterThread.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
131:5825d48b27d1 | 132:1700239cab2e |
---|---|
1 /******************************************************************************* | |
2 | |
3 copyright: Copyright (c) 2004 Kris Bell. All rights reserved | |
4 | |
5 license: BSD style: $(LICENSE) | |
6 | |
7 version: July 2004: Initial release | |
8 | |
9 author: Kris | |
10 | |
11 *******************************************************************************/ | |
12 | |
13 module tango.net.cluster.tina.ClusterThread; | |
14 | |
15 private import tango.core.Thread, | |
16 tango.core.Runtime, | |
17 tango.core.Exception; | |
18 | |
19 private import tango.io.Buffer, | |
20 tango.io.GrowBuffer, | |
21 tango.net.ServerSocket; | |
22 | |
23 package import tango.io.model.IBuffer, | |
24 tango.io.model.IConduit; | |
25 | |
26 private import tango.text.convert.Sprint; | |
27 | |
28 package import tango.net.cluster.tina.Cluster, | |
29 tango.net.cluster.tina.ProtocolReader, | |
30 tango.net.cluster.tina.ProtocolWriter; | |
31 | |
32 package import tango.net.cluster.tina.util.AbstractServer; | |
33 | |
34 /****************************************************************************** | |
35 | |
36 Thread for handling client requests. Note that this remains alive | |
37 until the client kills the socket | |
38 | |
39 ******************************************************************************/ | |
40 | |
41 class ClusterThread | |
42 { | |
43 protected IBuffer buffer; | |
44 protected ProtocolReader reader; | |
45 protected ProtocolWriter writer; | |
46 protected Logger logger; | |
47 protected char[] client; | |
48 protected Thread thread; | |
49 protected Sprint!(char) sprint; | |
50 protected Cluster cluster; | |
51 protected IConduit conduit; | |
52 | |
53 /********************************************************************** | |
54 | |
55 request handler | |
56 | |
57 **********************************************************************/ | |
58 | |
59 abstract void dispatch (); | |
60 | |
61 /********************************************************************** | |
62 | |
63 Note that the conduit stays open until the client kills it. | |
64 Also note that we use a GrowableBuffer here, which expands | |
65 as necessary to contain larger payloads. | |
66 | |
67 **********************************************************************/ | |
68 | |
69 this (AbstractServer server, IConduit conduit, Cluster cluster) | |
70 { | |
71 buffer = new GrowBuffer (1024 * 8); | |
72 buffer.setConduit (conduit); | |
73 | |
74 // get client infomation | |
75 client = server.remoteAddress(conduit).toString; | |
76 | |
77 // setup cluster protocol-transcoders | |
78 writer = new ProtocolWriter (buffer); | |
79 reader = new ProtocolReader (buffer); | |
80 | |
81 // grab a thread to execute within | |
82 thread = new Thread (&run); | |
83 | |
84 // make a formatter for this thread | |
85 sprint = new Sprint!(char); | |
86 | |
87 // save state | |
88 logger = server.getLogger; | |
89 this.conduit = conduit; | |
90 this.cluster = cluster; | |
91 } | |
92 | |
93 /********************************************************************** | |
94 | |
95 IRunnable method | |
96 | |
97 **********************************************************************/ | |
98 | |
99 void execute () | |
100 { | |
101 thread.start; | |
102 } | |
103 | |
104 /********************************************************************** | |
105 | |
106 process client requests | |
107 | |
108 **********************************************************************/ | |
109 | |
110 private void run () | |
111 { | |
112 logger.info (sprint ("{} starting service handler", client)); | |
113 | |
114 try { | |
115 while (true) | |
116 { | |
117 // start with a clear conscience | |
118 buffer.clear; | |
119 | |
120 // wait for something to arrive before we try/catch | |
121 buffer.slice (1, false); | |
122 | |
123 try { | |
124 dispatch; | |
125 } catch (Object x) | |
126 { | |
127 logger.error (sprint ("{} cluster request error '{}'", client, x)); | |
128 writer.exception (sprint ("cluster request error '{}'", x.toString)); | |
129 } | |
130 | |
131 // send response back to client | |
132 buffer.flush; | |
133 } | |
134 | |
135 } catch (IOException x) | |
136 if (! Runtime.isHalting) | |
137 logger.trace (sprint ("{} cluster socket exception '{}'", client, x)); | |
138 | |
139 catch (Object x) | |
140 logger.fatal (sprint ("{} cluster runtime exception '{}'", client, x)); | |
141 | |
142 // log our halt status | |
143 logger.info (sprint ("{} halting service handler", client)); | |
144 | |
145 // make sure we close the conduit | |
146 conduit.detach; | |
147 } | |
148 } | |
149 |