1 package org.sourceforge.jemm.database.memory; 2 3 import java.util.Collections; 4 import java.util.HashSet; 5 import java.util.Set; 6 import java.util.concurrent.ConcurrentHashMap; 7 8 import org.sourceforge.jemm.database.ClientId; 9 import org.sourceforge.jemm.database.ClientThreadId; 10 import org.sourceforge.jemm.database.components.ClientThreadIdRef; 11 import org.sourceforge.jemm.database.components.UserLockInfo; 12 import org.sourceforge.jemm.database.components.se.StorageEngineUserLockIF; 13 import org.sourceforge.jemm.types.ID; 14 import org.sourceforge.jemm.util.LockManager; 15 16 public class UserLockIFImpl implements StorageEngineUserLockIF { 17 18 ConcurrentHashMap<ID, UserLockInfo> locks = new ConcurrentHashMap<ID, UserLockInfo>(); 19 ConcurrentHashMap<ClientId,Set<ClientThreadIdRef>> clientLockRefs = 20 new ConcurrentHashMap<ClientId, Set<ClientThreadIdRef>>(); 21 22 LockManager<ClientId> clientLocks = new LockManager<ClientId>(); 23 24 25 @Override 26 public UserLockInfo getLockInfo(ID id) { 27 UserLockInfo lockInfo = locks.get(id); 28 if(lockInfo == null) { 29 lockInfo = new UserLockInfo(id); 30 locks.put(id, lockInfo); 31 } 32 33 return lockInfo; 34 } 35 36 @Override 37 public void saveLockInfo(UserLockInfo info) { 38 if(info.isUnused()) 39 locks.remove(info.getId()); 40 } 41 42 @Override 43 public void clearAll() { 44 locks.clear(); 45 clientLockRefs.clear(); 46 } 47 48 @Override 49 public void addClientLockReference(ClientThreadId clientThreadId, ID objectId) { 50 ClientId clientId = clientThreadId.getClientId(); 51 try { 52 clientLocks.acquire(clientId); 53 54 Set<ClientThreadIdRef> set = clientLockRefs.get(clientId); 55 if(set == null) { 56 set = new HashSet<ClientThreadIdRef>(); 57 clientLockRefs.put(clientId,set); 58 } 59 60 set.add(new ClientThreadIdRef(clientThreadId,objectId)); 61 } finally { 62 clientLocks.release(clientId); 63 } 64 } 65 66 @Override 67 public Set<ClientThreadIdRef> getClientLockSet(ClientId clientId) { 68 try { 69 clientLocks.acquire(clientId); 70 Set<ClientThreadIdRef> set = clientLockRefs.get(clientId); 71 if(set == null) 72 return Collections.emptySet(); 73 else 74 return Collections.unmodifiableSet(set); 75 } finally { 76 clientLocks.release(clientId); 77 } 78 } 79 80 @Override 81 public void removeClientLockReference(ClientThreadId clientThreadId, ID objectId) { 82 ClientId clientId = clientThreadId.getClientId(); 83 try { 84 clientLocks.acquire(clientId); 85 86 Set<ClientThreadIdRef> set = clientLockRefs.get(clientId); 87 if(set != null) { 88 set.remove(new ClientThreadIdRef(clientThreadId,objectId)); 89 if(set.size() == 0) 90 clientLockRefs.remove(clientId); 91 } 92 } finally { 93 clientLocks.release(clientId); 94 } 95 } 96 }