Mercurial > projects > ldc
comparison tango/tango/net/cluster/CacheInvalidator.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.CacheInvalidator; | |
14 | |
15 package import tango.net.cluster.NetworkClient; | |
16 | |
17 private import tango.net.cluster.NetworkMessage; | |
18 | |
19 /******************************************************************************* | |
20 | |
21 Utility class to invalidate specific cache entries across a | |
22 network. Any active CacheInvalidatee objects listening upon | |
23 the channel specified for this class will "wake up" whenever | |
24 the invalidate() method is invoked. | |
25 | |
26 *******************************************************************************/ | |
27 | |
28 class CacheInvalidator : NetworkClient | |
29 { | |
30 private InvalidatorPayload filter; | |
31 | |
32 /*********************************************************************** | |
33 | |
34 Construct an invalidator on the specified channel. Only | |
35 those CacheInvalidatee instances configured for the same | |
36 channel will be listening to this invalidator. | |
37 | |
38 ***********************************************************************/ | |
39 | |
40 this (ICluster cluster, char[] channel) | |
41 { | |
42 assert (channel.length); | |
43 super (cluster, channel); | |
44 | |
45 // this is what we'll send as an invalidation notification ... | |
46 this.filter = new InvalidatorPayload; | |
47 } | |
48 | |
49 /*********************************************************************** | |
50 | |
51 Invalidate all network cache instances on this channel | |
52 using the specified key. When 'timeLimit' is specified, | |
53 only those cache entries with a time lesser or equal to | |
54 that specified will be removed. This is often useful if | |
55 you wish to avoid invalidating a cache (local or remote) | |
56 that has just been updated; simply pass the time value | |
57 of the 'old' IMessage as the argument. | |
58 | |
59 Note that this is asynchronous! An invalidation is just | |
60 a request to remove the item within a short time period. | |
61 If you need the entry removed synchronously, you should | |
62 use the NetworkCache extract() method instead. | |
63 | |
64 ***********************************************************************/ | |
65 | |
66 void invalidate (char[] key, Time timeLimit = Time.max) | |
67 { | |
68 assert (key.length); | |
69 filter.key (key); | |
70 filter.time (timeLimit); | |
71 | |
72 // broadcast a message across the cluster | |
73 channel.broadcast (filter); | |
74 } | |
75 } | |
76 | |
77 | |
78 /******************************************************************************* | |
79 | |
80 *******************************************************************************/ | |
81 | |
82 private class InvalidatorPayload : NetworkMessage | |
83 { | |
84 private char[] key_; | |
85 | |
86 /*********************************************************************** | |
87 | |
88 ***********************************************************************/ | |
89 | |
90 char[] key () | |
91 { | |
92 return key_; | |
93 } | |
94 | |
95 /*********************************************************************** | |
96 | |
97 ***********************************************************************/ | |
98 | |
99 void key (char[] key) | |
100 { | |
101 assert (key.length); | |
102 key_ = key; | |
103 } | |
104 | |
105 /*********************************************************************** | |
106 | |
107 Read our attributes, after telling our superclass to do | |
108 likewise. The order of this is important with respect to | |
109 inheritance, such that a subclass and superclass may be | |
110 populated in isolation where appropriate. | |
111 | |
112 Note that we slice our text attribute, rather than copying | |
113 it. Since this class is temporal we can forego allocation | |
114 of memory, and just map it directly from the input buffer. | |
115 | |
116 ***********************************************************************/ | |
117 | |
118 override void read (IReader input) | |
119 { | |
120 super.read (input); | |
121 input (key_); | |
122 } | |
123 | |
124 /*********************************************************************** | |
125 | |
126 ***********************************************************************/ | |
127 | |
128 override void write (IWriter output) | |
129 { | |
130 super.write (output); | |
131 output (key_); | |
132 } | |
133 } | |
134 |