internal ReplyData Take(RequestData requestData) { foreach (var entry in tupleSpace) { DIDATuple tuple = (DIDATuple)((List <object>)entry)[0]; string workerLock = (string)((List <object>)entry)[1]; if (workerLock == null) { continue; } // If locked by client if (workerLock.Equals(requestData.ClientId)) { // If it is the tuple to remove, removes it from the tupleSpace, else removes the lock if (tuple.Matches(requestData.TupleData)) { object toRemove = entry; tupleSpace.TryTake(out toRemove); return(new AckReply(requestData.RequestId)); } else { object toRemoveLock = entry; if (tupleSpace.TryPeek(out toRemoveLock)) { ((List <object>)toRemoveLock)[1] = null; } } } } return(new AckReply(requestData.RequestId)); }
internal ReplyData Lock(RequestData requestData) { List <DIDATuple> tupleSetToSend = new List <DIDATuple>(); bool refused = false; foreach (var entry in tupleSpace) { DIDATuple tuple = (DIDATuple)((List <object>)entry)[0]; string workerLock = (string)((List <object>)entry)[1]; // If unlocked and it matches the template it locks the tuple if (tuple.Matches(requestData.TupleData)) { if (workerLock != null) { refused = true; continue; } object toLock = entry; if (tupleSpace.TryPeek(out toLock)) { ((List <object>)toLock)[1] = requestData.ClientId; tupleSetToSend.Add(tuple); } } } if (refused) { return(new LockRefusedReply(requestData.RequestId)); } return(new TupleSetReply(requestData.RequestId, tupleSetToSend)); }
internal ReplyData Read(RequestData requestData) { foreach (var entry in tupleSpace) { DIDATuple tuple = (DIDATuple)((List <object>)entry)[0]; if (tuple.Matches(requestData.TupleData)) { return(new TupleReply(requestData.RequestId, tuple)); } } return(new NoTupleFoundReply(requestData.RequestId)); }
private List <DIDATuple> GetMatchingTuples(DIDATuple didaTuple) { List <DIDATuple> matchingTuples = new List <DIDATuple>(); foreach (var entry in tupleSpace) { DIDATuple tuple = (DIDATuple)((List <object>)entry)[0]; if (tuple.Matches(didaTuple)) { matchingTuples.Add(tuple); } } return(matchingTuples); }
internal ReplyData Unlock(RequestData requestData) { foreach (var entry in tupleSpace) { DIDATuple tuple = (DIDATuple)((List <object>)entry)[0]; string workerLock = (string)((List <object>)entry)[1]; // If locked by client and it is the tuple to unlock, removes the lock if (workerLock.Equals(requestData.ClientId) && tuple.Matches(requestData.TupleData)) { object toRemoveLock = entry; if (tupleSpace.TryPeek(out toRemoveLock)) { ((List <object>)toRemoveLock)[1] = null; } } } return(new AckReply(requestData.RequestId)); }