1 /* 2 * Copyright (c) 1998-2002 The Jgroup Team. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU Lesser General Public License for more details. 12 * 13 * You should have received a copy of the GNU Lesser General Public License 14 * along with this program; if not, write to the Free Software 15 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 16 * 17 */ 18 19 package jgroup.relacs.mss; 20 21 /* 22 * FIXME: This data structure is not dynamic and uses the index 23 * of the host in the cluster; should change to a dynamic approach. 24 */ 25 //FIXME clusterWindow is important only for members of the same 26 //cluster. HEIN: What exactly does this mean? 27 28 /** 29 * The <code>ClusterWindow</code> class maintains, for each member host 30 * in a cluster, the last message that it has delivered. 31 * 32 * @author Salvatore Cammarata 33 * @author Hein Meling 34 * @since Jgroup 1.2 35 */ 36 final class ClusterWindow 37 implements MssConstants 38 { 39 40 //////////////////////////////////////////////////////////////////////////////////////////// 41 // Fields 42 //////////////////////////////////////////////////////////////////////////////////////////// 43 44 /** Last msg delivered for each member in the cluster */ 45 private int[] lmd; 46 47 48 //////////////////////////////////////////////////////////////////////////////////////////// 49 // Constructors 50 //////////////////////////////////////////////////////////////////////////////////////////// 51 52 ClusterWindow(int members) 53 { 54 lmd = new int[members]; 55 for (int i=0; i < members; i++) 56 lmd[i] = UNDEF; 57 } 58 59 60 //////////////////////////////////////////////////////////////////////////////////////////// 61 // Methods 62 //////////////////////////////////////////////////////////////////////////////////////////// 63 64 /** 65 * Returns the last message delivered in the cluster. 66 */ 67 int getLastMsgDelivered() 68 { 69 int min = UNDEF; 70 int i=0; 71 72 while (i < lmd.length && lmd[i] == UNDEF) 73 i++; 74 if (i < lmd.length) 75 min = lmd[i++]; 76 while (i < lmd.length) { 77 if (lmd[i] != UNDEF && lmd[i] < min) 78 min = lmd[i]; 79 i++; 80 } 81 return min; 82 } 83 84 85 /** 86 * Sets the last message delivered for the host identified by the 87 * given index in this cluster. 88 * 89 * @param index 90 * The index of the host in this cluster 91 * @param lastMsgDelivered 92 * The identifier of the last message delivered by the given host 93 */ 94 int set(int index, int lastMsgDelivered) 95 { 96 int ret = lmd[index]; 97 lmd[index] = lastMsgDelivered; 98 return ret; 99 } 100 101 102 /** 103 * Clear the cluster window state. 104 */ 105 void clear() 106 { 107 for (int i = 0; i < lmd.length; i++) 108 lmd[i] = UNDEF; 109 } 110 111 112 //////////////////////////////////////////////////////////////////////////////////////////// 113 // Methods 114 //////////////////////////////////////////////////////////////////////////////////////////// 115 116 /** 117 * Returns a string representation of this object 118 */ 119 public String toString() 120 { 121 StringBuilder buf = new StringBuilder("[ClusterWindow: "); 122 for (int i = 0; i < lmd.length; i++) { 123 buf.append((i != 0) ? ", " : ""); 124 buf.append("lastMsgDlvr["); 125 buf.append(i); 126 buf.append("]="); 127 buf.append(lmd[i]); 128 } 129 buf.append("]"); 130 return buf.toString(); 131 } 132 133 } // END ClusterWindow