public static void CallbackWrite(IAsyncResult ar) { RemoteAsyncWriteDelegate del = (RemoteAsyncWriteDelegate)((AsyncResult)ar).AsyncDelegate; lock (WriteLock) { _responseWrite.Add(del.EndInvoke(ar)); writeHandles[writeCounter++].Set(); if (writeCounter == numServers) { writeCounter = 0; } } }
public void Write(Tuple tuple) { bool ViewOutOfDate = true; while (ViewOutOfDate) { _responseWrite = new List <bool>(); View actualView = this.GetView(); int numberServers = actualView.Count(); numServers = numberServers; writeHandles = new AutoResetEvent[numberServers]; Console.WriteLine(actualView); for (int i = 0; i < numberServers; i++) { writeHandles[i] = new AutoResetEvent(false); } //List<ITupleSpaceXL> serversObj = new List<ITupleSpaceXL>(); List <string> toRemove = new List <string>(); foreach (string serverPath in actualView.Servers) { try { ITupleSpaceXL server = (ITupleSpaceXL)Activator.GetObject(typeof(ITupleSpaceXL), serverPath); RemoteAsyncWriteDelegate RemoteDel = new RemoteAsyncWriteDelegate(server.write); a++; AsyncCallback RemoteCallback = new AsyncCallback(CallbackWrite); IAsyncResult RemAr = RemoteDel.BeginInvoke(_workerId, _requestId, tuple, _view, CallbackWrite, null); } catch (System.Net.Sockets.SocketException) { Console.WriteLine("** FRONTEND WRITE: Could not call write on server"); } } WaitHandle.WaitAll(writeHandles, 2000); //When some server joins the view while the operation is taking place //Because some machine on my view crashed while the operation was taking place if (_responseWrite.Count != _view.Servers.Count) { writeCounter = 0; foreach (string s in _view.Servers) { try { ITupleSpaceXL tupleSpace = (ITupleSpaceXL)Activator.GetObject(typeof(ITupleSpaceXL), s); tupleSpace.checkView(); } catch (Exception) { Console.WriteLine("Server " + s + " is dead."); } } if (_responseWrite.Count > 0) { ViewOutOfDate = false; } } else { if (_responseWrite.Contains(false) == true) { Console.WriteLine("** FRONTEND WRITE: View has been changed"); } else { ViewOutOfDate = false; } } _requestId++; } Console.WriteLine("** FRONTEND WRITE: Just wrote " + tuple + " a = " + a); }