예제 #1
0
        public void Remove(Tuple tuple)
        {
            Console.WriteLine("Remove o tuplo: " + tuple);
            View actualView = this.GetView();
            List <ITupleSpaceXL> serversObj = new List <ITupleSpaceXL>();

            ITupleSpaceXL tupleSpace = null;

            //save remoting objects of all members of the view
            foreach (string serverPath in actualView.Servers)
            {
                try
                {
                    tupleSpace = (ITupleSpaceXL)Activator.GetObject(typeof(ITupleSpaceXL), serverPath);
                    tupleSpace.ItemCount(); //just to check availability of the server
                }
                catch (Exception) { tupleSpace = null; }
                if (tupleSpace != null)
                {
                    serversObj.Add(tupleSpace);
                }
            }

            foreach (ITupleSpaceXL server in serversObj)
            {
                try
                {
                    RemoteAsyncSecondPhaseDelegate RemoteDel = new RemoteAsyncSecondPhaseDelegate(server.remove);
                    IAsyncResult RemAr = RemoteDel.BeginInvoke(tuple, _workerId, null, null);
                }
                catch (Exception) { }
            }
            Console.WriteLine("** FRONTEND REMOVE: Just removed " + tuple);
        }
예제 #2
0
        public Tuple Read(Tuple tuple)
        {
            readHandles    = new AutoResetEvent[1];
            readHandles[0] = new AutoResetEvent(false);

            View actualView = this.GetView();
            List <ITupleSpaceXL> serversObj = new List <ITupleSpaceXL>();
            List <string>        toRemove   = new List <string>();

            ITupleSpaceXL tupleSpace = null;

            _responseRead = null;

            //save remoting objects of all members of the view
            foreach (string serverPath in actualView.Servers)
            {
                try
                {
                    tupleSpace = (ITupleSpaceXL)Activator.GetObject(typeof(ITupleSpaceXL), serverPath);
                    tupleSpace.ItemCount(); //just to check availability of the server
                }
                catch (System.Net.Sockets.SocketException) {
                    tupleSpace = null;
                    toRemove.Add(serverPath);
                }
                if (tupleSpace != null)
                {
                    serversObj.Add(tupleSpace);
                }
            }

            if (serversObj.Count > 0)
            {
                foreach (string crashed in toRemove)
                {
                    //only one can crash so serverObj is obviously online
                    _view = serversObj[0].Remove(crashed);
                }
            }
            else
            {
                Console.WriteLine("All servers are dead! Exiting...");
                Environment.Exit(1);
            }


            foreach (ITupleSpaceXL server in serversObj)
            {
                try
                {
                    RemoteAsyncReadDelegate RemoteDel      = new RemoteAsyncReadDelegate(server.read);
                    AsyncCallback           RemoteCallback = new AsyncCallback(CallbackRead);
                    IAsyncResult            RemAr          = RemoteDel.BeginInvoke(tuple, CallbackRead, null);
                }
                catch (System.Net.Sockets.SocketException) { Console.WriteLine("** FRONTEND READ: Cannot invoke read on server!"); }
            }

            while (_responseRead == null)
            {
                Console.WriteLine("** FRONTEND READ: Not yet receive any reply let me wait...");

                WaitHandle.WaitAny(readHandles);
            }

            _requestId++;
            Console.WriteLine("** FRONTEND READ: Here is a response: " + _responseRead);
            return(_responseRead);
        }