Mercurial > hg > Members > shoshi > TreeCMSv2
view src/treecms/tree/util/LockableNodeTable.java @ 25:c1e7ec6b3d44
commit
author | Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 12 Jul 2011 14:39:35 +0900 |
parents | src/treecms/tree/util/NodeTableImpl.java@77a894c0b919 |
children |
line wrap: on
line source
package treecms.tree.util; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import treecms.api.Node; import treecms.api.NodeID; import treecms.api.NodeTable; public class LockableNodeTable implements NodeTable { private final ConcurrentMap<NodeID,Node> m_nodes; private final ConcurrentMap<String,LockableReference<Node>> m_tips; public LockableNodeTable() { m_nodes = new ConcurrentHashMap<NodeID,Node>(); m_tips = new ConcurrentHashMap<String,LockableReference<Node>>(); } @Override public void register(Node _newNode) { NodeID id = _newNode.getID(); m_nodes.put(id,_newNode); LockableReference<Node> ref = m_tips.putIfAbsent(id.getFamilyID(),new LockableReference<Node>(_newNode)); if(ref != null){ ref.lock(); ref.put(_newNode); ref.unlock(); } } @Override public Node get(NodeID _id) { return m_nodes.get(_id); } @Override public Node tip(String _fid) { LockableReference<Node> ref = m_tips.get(_fid); if(ref == null){ return null; } return ref.get(); } public boolean unlock(String _fid) { LockableReference<Node> ref = m_tips.get(_fid); if(ref == null){ return false; } ref.unlock(); return true; } public boolean lock(String _fid) { LockableReference<Node> ref = m_tips.get(_fid); if(ref == null){ return false; } ref.lock(); return true; } }