1 21 22 package org.continuent.sequoia.controller.locks; 23 24 import java.util.Iterator ; 25 import java.util.LinkedList ; 26 import java.util.List ; 27 28 import org.continuent.sequoia.controller.requests.AbstractRequest; 29 30 39 public class TransactionLogicalLock 40 { 41 private boolean isLocked = false; 42 43 44 private long locker; 45 46 47 private LinkedList waitingList = new LinkedList (); 48 49 53 protected class WaitingListElement 54 { 55 56 AbstractRequest request; 57 58 59 long transactionId; 60 61 67 WaitingListElement(AbstractRequest request, long transactionId) 68 { 69 this.request = request; 70 this.transactionId = transactionId; 71 } 72 73 78 public long getTransactionId() 79 { 80 return transactionId; 81 } 82 83 88 public AbstractRequest getRequest() 89 { 90 return request; 91 } 92 93 96 public String toString() 97 { 98 return String.valueOf(transactionId); 99 } 100 101 } 102 103 115 public boolean acquire(AbstractRequest request) 116 { 117 long tid = request.getTransactionId(); 118 119 synchronized (this) 120 { 121 if (!isLocked) 122 { locker = tid; 124 isLocked = true; 125 return true; 126 } 127 else 128 { 129 if (locker == tid) 130 return true; else 132 { if (!isWaiting(tid)) 134 { WaitingListElement wle = new WaitingListElement(request, tid); 136 waitingList.addLast(wle); 137 } 138 return false; 139 } 140 } 141 } 142 } 143 144 150 public long getLocker() 151 { 152 return locker; 153 } 154 155 160 public boolean isLocked() 161 { 162 return isLocked; 163 } 164 165 172 public synchronized boolean isWaiting(long transactionId) 173 { 174 for (Iterator iter = waitingList.iterator(); iter.hasNext();) 175 { 176 WaitingListElement e = (WaitingListElement) iter.next(); 177 if (e.getTransactionId() == transactionId) 178 return true; 179 } 180 return false; 181 } 182 183 191 public synchronized boolean release(long transactionId) 192 { 193 if (!waitingList.isEmpty()) 194 { 195 if (locker == transactionId) 196 { locker = ((WaitingListElement) waitingList.removeFirst()) 198 .getTransactionId(); 199 return true; 200 } 201 202 for (Iterator iter = waitingList.iterator(); iter.hasNext();) 204 { 205 WaitingListElement e = (WaitingListElement) iter.next(); 206 if (e.getTransactionId() == transactionId) 207 { 208 iter.remove(); 209 return true; 210 } 211 } 212 return false; 213 } 214 else 215 { 216 if (locker == transactionId) 217 { 218 isLocked = false; 219 return true; 220 } 221 else 222 return false; 223 } 224 } 225 226 231 protected List getWaitingList() 232 { 233 return waitingList; 234 } 235 236 239 public String toString() 240 { 241 if (!isLocked) 242 return "Not Locked"; 243 else 244 return "Locked by : " + locker + " - Waiting list : " + waitingList; 245 } 246 } | Popular Tags |