/// <summary> /// Given a non-void call descriptor, calls it and retrieves the return value. /// </summary> /// <param name="callDescriptor"></param> /// <returns></returns> private object GetReplyForCallDescriptor(LocalCallDescriptor callDescriptor) { // ReplyFromParentArrived is a TLS field, so initialize it if it's empty if (replyFromParentArrived == null) { replyFromParentArrived = new ManualResetEvent(false); } replyFromParentArrived.Reset(); int requestingCallNumber = callDescriptor.CallNumber; ReplyData replyData = new ReplyData(); replyData.waitEvent = replyFromParentArrived; // Register our wait event for the call id lock (repliesFromParent) { repliesFromParent[requestingCallNumber] = replyData; } nodeCommandQueue.Enqueue(callDescriptor); replyFromParentArrived.WaitOne(); LocalCallDescriptor reply = null; // Unregister the wait event lock (repliesFromParent) { // Get the reply reply = replyData.reply; ErrorUtilities.VerifyThrow(reply != null, "We must have a reply if the wait event was set"); repliesFromParent.Remove(requestingCallNumber); } return(reply.GetReplyData()); }