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 }