Beispiel #1
0
        private IAsyncResult RemoteAsyncCallView(TupleSpace space)
        {
            AsyncViewDelegate RemoteDel = new AsyncViewDelegate(space.RequestView);
            IAsyncResult      RemAr     = RemoteDel.BeginInvoke(null, null);

            return(RemAr);
        }
Beispiel #2
0
        private Dictionary <string, TupleSpace> GetViews()
        {
            List <string> leaderView = null;

            leaderView = GetLeaderView();
            Dictionary <string, TupleSpace> result = new Dictionary <string, TupleSpace>();

            if (leaderView != null)
            {
                foreach (string server in leaderView)
                {
                    result[server] = (TupleSpace)TupleSpaces[server];
                }
                //Console.WriteLine(String.Join(",", leaderView));
                return(result);
            }
            while (leaderView == null)
            {
                Dictionary <string, KeyValuePair <IAsyncResult, WaitHandle> > results = new Dictionary <string, KeyValuePair <IAsyncResult, WaitHandle> >();
                List <WaitHandle> waits = new List <WaitHandle>();
                foreach (KeyValuePair <string, Pingable> entry in TupleSpaces)
                {
                    //IAsyncResult ar = RemoteAsyncCallTakeSelect(space, schema, id, seq);
                    IAsyncResult ar = RemoteAsyncCallView((TupleSpace)entry.Value);
                    results.Add(entry.Key, new KeyValuePair <IAsyncResult, WaitHandle>(ar, ar.AsyncWaitHandle));
                    waits.Add(ar.AsyncWaitHandle);
                }

                WaitHandle.WaitAll(waits.ToArray(), 500);
                List <List <string> > views = new List <List <string> >();
                foreach (var entry in results)
                {
                    if (entry.Value.Value.WaitOne(0))
                    {
                        AsyncViewDelegate del = (AsyncViewDelegate)((AsyncResult)entry.Value.Key).AsyncDelegate;
                        try { leaderView = del.EndInvoke(entry.Value.Key); } catch (Exception e) {}
                        if (leaderView != null)
                        {
                            currentLeader = entry.Key;
                            break;
                        }
                    }
                }
            }
            foreach (string server in new HashSet <string>(leaderView))
            {
                result[server] = (TupleSpace)TupleSpaces[server];
            }
            //Console.WriteLine(String.Join(",", leaderView));
            return(result);
        }
Beispiel #3
0
        private List <string> GetLeaderView()
        {
            List <string> result = null;

            if (currentLeader == null)
            {
                return(null);
            }
            IAsyncResult ar   = RemoteAsyncCallView((TupleSpace)TupleSpaces[currentLeader]);
            WaitHandle   wait = ar.AsyncWaitHandle;

            if (wait.WaitOne(500))
            {
                AsyncViewDelegate del = (AsyncViewDelegate)((AsyncResult)ar).AsyncDelegate;
                try { result = del.EndInvoke(ar); } catch (Exception e) { /* Console.WriteLine(e);*/ }
            }
            return(result);
        }