Mercurial > projects > ldc
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/CacheInvalidator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,134 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.CacheInvalidator; + +package import tango.net.cluster.NetworkClient; + +private import tango.net.cluster.NetworkMessage; + +/******************************************************************************* + + Utility class to invalidate specific cache entries across a + network. Any active CacheInvalidatee objects listening upon + the channel specified for this class will "wake up" whenever + the invalidate() method is invoked. + +*******************************************************************************/ + +class CacheInvalidator : NetworkClient +{ + private InvalidatorPayload filter; + + /*********************************************************************** + + Construct an invalidator on the specified channel. Only + those CacheInvalidatee instances configured for the same + channel will be listening to this invalidator. + + ***********************************************************************/ + + this (ICluster cluster, char[] channel) + { + assert (channel.length); + super (cluster, channel); + + // this is what we'll send as an invalidation notification ... + this.filter = new InvalidatorPayload; + } + + /*********************************************************************** + + Invalidate all network cache instances on this channel + using the specified key. When 'timeLimit' is specified, + only those cache entries with a time lesser or equal to + that specified will be removed. This is often useful if + you wish to avoid invalidating a cache (local or remote) + that has just been updated; simply pass the time value + of the 'old' IMessage as the argument. + + Note that this is asynchronous! An invalidation is just + a request to remove the item within a short time period. + If you need the entry removed synchronously, you should + use the NetworkCache extract() method instead. + + ***********************************************************************/ + + void invalidate (char[] key, Time timeLimit = Time.max) + { + assert (key.length); + filter.key (key); + filter.time (timeLimit); + + // broadcast a message across the cluster + channel.broadcast (filter); + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +private class InvalidatorPayload : NetworkMessage +{ + private char[] key_; + + /*********************************************************************** + + ***********************************************************************/ + + char[] key () + { + return key_; + } + + /*********************************************************************** + + ***********************************************************************/ + + void key (char[] key) + { + assert (key.length); + key_ = key; + } + + /*********************************************************************** + + Read our attributes, after telling our superclass to do + likewise. The order of this is important with respect to + inheritance, such that a subclass and superclass may be + populated in isolation where appropriate. + + Note that we slice our text attribute, rather than copying + it. Since this class is temporal we can forego allocation + of memory, and just map it directly from the input buffer. + + ***********************************************************************/ + + override void read (IReader input) + { + super.read (input); + input (key_); + } + + /*********************************************************************** + + ***********************************************************************/ + + override void write (IWriter output) + { + super.write (output); + output (key_); + } +} +