コード例 #1
0
 public void Done(RCClosure closure, RCLong fibers)
 {
     if (fibers.Count == 1)
     {
         Fiber fiber;
         lock (_botLock)
         {
             fiber = (Fiber)_bots[fibers[0]].GetModule(typeof(Fiber));
         }
         bool val;
         lock (fiber._fiberLock)
         {
             val = fiber._fibers.Count == fiber._fiberResults.Count;
         }
         Yield(closure, new RCBoolean(val));
     }
     else if (fibers.Count == 2)
     {
         bool  val;
         Fiber fiber;
         lock (_botLock)
         {
             fiber = (Fiber)_bots[fibers[0]].GetModule(typeof(Fiber));
         }
         lock (fiber._fiberLock)
         {
             val = fiber._fiberResults.ContainsKey(fibers[1]);
         }
         Yield(closure, new RCBoolean(val));
     }
     else
     {
         throw new Exception();
     }
 }
コード例 #2
0
        public ReadSpec GetReadSpec(RCSymbol symbol, RCLong starts, bool force, bool fill)
        {
            ReadSpec result = new ReadSpec(this, 0, force, fill);

            for (int i = 0; i < symbol.Count; ++i)
            {
                result.Add(symbol[i], (int)starts[i], int.MaxValue);
            }
            return(result);
        }
コード例 #3
0
 public void EvalKill(RCRunner runner, RCClosure closure, RCLong right)
 {
     try
     {
         runner.Kill(closure, right);
     }
     catch (Exception)
     {
         throw;
     }
     runner.Yield(closure, right);
 }
コード例 #4
0
        public long GetLong(long i)
        {
            RCLong val = (RCLong)Get(i);

            if (val == null)
            {
                throw new Exception(string.Format("No value at index {0} within block (count:{1})",
                                                  i,
                                                  Count));
            }
            return(val[0]);
        }
コード例 #5
0
        public long GetLong(string name)
        {
            RCLong val = (RCLong)Get(name);

            if (val == null)
            {
                throw new Exception("Required value " + name + " not found in block");
            }
            else
            {
                return(val[0]);
            }
        }
コード例 #6
0
        public long GetLong(string name, long def)
        {
            RCLong val = (RCLong)Get(name);

            if (val == null)
            {
                return(def);
            }
            else
            {
                return(val[0]);
            }
        }
コード例 #7
0
 public void Kill(RCClosure closure, RCLong fibers)
 {
     if (fibers.Count == 1)
     {
         Kill(fibers[0], -1, new Exception("fiber killed"), 2);
     }
     else if (fibers.Count == 2)
     {
         Kill(fibers[0], fibers[1], new Exception("fiber killed"), 2);
     }
     else
     {
         throw new Exception();
     }
 }
コード例 #8
0
 public ReadSpec(ReadCounter counter,
                 RCSymbol left,
                 RCLong right,
                 int defaultLimit,
                 bool
                 ignoreDispatchedRows,
                 bool force,
                 bool fill,
                 bool showDeleted)
 {
     _counter              = counter;
     ShowDeleted           = showDeleted;
     _ignoreDispatchedRows = ignoreDispatchedRows;
     _force = force;
     _fill  = fill;
     if (right.Count == 1)
     {
         // It's the start point.
         _forward     = defaultLimit >= 0;
         _unlimited   = defaultLimit == 0;
         _symbolLimit = Math.Abs(_unlimited ? int.MaxValue : defaultLimit);
         left         = _counter.ConcreteSymbols(left, showDeleted);
         for (int i = 0; i < left.Count; ++i)
         {
             Add(left[i], (int)right[0], _symbolLimit);
         }
     }
     else if (right.Count == 2)
     {
         // It's the start point and the limit.
         _forward     = right[1] >= 0;
         _unlimited   = right[1] == 0;
         _symbolLimit = Math.Abs(_unlimited ? int.MaxValue : (int)right[1]);
         left         = _counter.ConcreteSymbols(left, showDeleted);
         for (int i = 0; i < left.Count; ++i)
         {
             Add(left[i], (int)right[0], _symbolLimit);
         }
     }
     else
     {
         // Who knows what this should do.
         // Maybe let you give different counts for each symbol.
         throw new ArgumentException("Read takes a maximum of two right arguments.");
     }
 }
コード例 #9
0
            public virtual void ContinueFiber(Object obj)
            {
                Timer  timer  = (Timer)obj;
                RCLong fibers = (RCLong)_state.Other;

                try
                {
                    Fiber fiber;
                    lock (_state.Runner._botLock)
                    {
                        if (_state.Runner._reset != _resetCount)
                        {
                            return;
                        }
                        fiber = (Fiber)_state.Runner._bots[fibers[0]].GetModule(typeof(Fiber));
                    }
                    lock (fiber._fiberLock)
                    {
                        RCValue result = null;
                        if (!fiber._fiberResults.TryGetValue(fibers[1], out result))
                        {
                            Exception ex = new Exception("Timed out waiting for fiber " + fibers[1]);
                            _state.Runner.Kill(fibers[0], fibers[1], ex, 2);
                        }
                    }
                }
                catch (ThreadAbortException)
                {
                    // This often happens as the runtime is shutting down,
                    // because this code runs on a thread pool thread.
                }
                catch (Exception ex)
                {
                    _state.Runner.Report(_state.Closure, ex);
                }
                finally
                {
                    timer.Dispose();
                }
            }
コード例 #10
0
            public virtual void ContinueBot(Object obj)
            {
                Timer  timer  = (Timer)obj;
                RCLong fibers = (RCLong)_state.Other;

                try
                {
                    lock (_state.Runner._botLock)
                    {
                        if (_state.Runner._reset != _resetCount)
                        {
                            return;
                        }
                        Queue <RCClosure> waiters;
                        // Since the bot results are not stored anywhere, we time out if there are
                        // waiters but what if there are multiple waiters? This seems like an issue.
                        if (_state.Runner._botWaiters.TryGetValue(fibers[0], out waiters))
                        {
                            Exception ex = new Exception("Timed out waiting for bot " + fibers[0]);
                            _state.Runner.Kill(fibers[0], -1, ex, 2);
                        }
                    }
                }
                catch (ThreadAbortException)
                {
                    // This often happens as the runtime is shutting down,
                    // because this code runs on a thread pool thread.
                }
                catch (Exception ex)
                {
                    _state.Runner.Report(_state.Closure, ex);
                }
                finally
                {
                    timer.Dispose();
                }
            }
コード例 #11
0
 public void Wait(RCClosure closure, RCLong timeout, RCLong fibers)
 {
     // At some point I want this to work for multiple fibers,
     // but the current version will only wait on a single fiber.
     if (fibers.Count == 1)
     {
         Fiber fiber;
         lock (_botLock)
         {
             fiber = (Fiber)_bots[fibers[0]].GetModule(typeof(Fiber));
         }
         RCValue result = null;
         lock (fiber._fiberLock)
         {
             if (fiber._fiberResults.Count == fiber._fibers.Count)
             {
                 fiber._fiberResults.TryGetValue(0, out result);
             }
         }
         if (result == null)
         {
             lock (_botLock)
             {
                 Queue <RCClosure> waiters;
                 if (_botWaiters.TryGetValue(fibers[0], out waiters))
                 {
                     waiters.Enqueue(closure);
                 }
                 else
                 {
                     waiters = new Queue <RCClosure> ();
                     waiters.Enqueue(closure);
                     _botWaiters.Add(fibers[0], waiters);
                 }
                 RCAsyncState state  = new RCAsyncState(this, closure, fibers);
                 Wakeup       wakeup = new Wakeup(state, _reset);
                 Timer        timer  = new Timer(wakeup.ContinueBot);
                 timer.Change(timeout[0], Timeout.Infinite);
             }
         }
         else
         {
             SafeYieldFromWait(closure, result);
         }
     }
     else if (fibers.Count == 2)
     {
         RCValue result = null;
         Fiber   fiber;
         lock (_botLock)
         {
             fiber = (Fiber)_bots[fibers[0]].GetModule(typeof(Fiber));
         }
         lock (fiber._fiberLock)
         {
             if (!fiber._fiberResults.TryGetValue(fibers[1], out result))
             {
                 Queue <RCClosure> waiters;
                 if (fiber._fiberWaiters.TryGetValue(fibers[1], out waiters))
                 {
                     waiters.Enqueue(closure);
                 }
                 else
                 {
                     waiters = new Queue <RCClosure> ();
                     waiters.Enqueue(closure);
                     fiber._fiberWaiters.Add(fibers[1], waiters);
                 }
                 RCAsyncState state  = new RCAsyncState(this, closure, fibers);
                 Wakeup       wakeup = new Wakeup(state, _reset);
                 Timer        timer  = new Timer(wakeup.ContinueFiber);
                 timer.Change(timeout[0], Timeout.Infinite);
             }
         }
         if (result != null)
         {
             SafeYieldFromWait(closure, result);
         }
     }
     else
     {
         throw new Exception();
     }
 }
コード例 #12
0
 public void Wait(RCClosure closure, RCLong fibers)
 {
     // At some point I want this to work for multiple fibers,
     // but the current version will only wait on a single fiber.
     if (fibers.Count == 1)
     {
         Fiber fiber;
         lock (_botLock)
         {
             fiber = (Fiber)_bots[fibers[0]].GetModule(typeof(Fiber));
         }
         RCValue result = null;
         lock (fiber._fiberLock)
         {
             if (fiber._fiberResults.Count == fiber._fibers.Count)
             {
                 fiber._fiberResults.TryGetValue(0, out result);
             }
         }
         if (result == null)
         {
             lock (_botLock)
             {
                 Queue <RCClosure> waiters;
                 if (_botWaiters.TryGetValue(fibers[0], out waiters))
                 {
                     waiters.Enqueue(closure);
                 }
                 else
                 {
                     waiters = new Queue <RCClosure> ();
                     waiters.Enqueue(closure);
                     _botWaiters.Add(fibers[0], waiters);
                 }
             }
         }
         else
         {
             SafeYieldFromWait(closure, result);
         }
     }
     else if (fibers.Count == 2)
     {
         RCValue result = null;
         Fiber   fiber;
         lock (_botLock)
         {
             fiber = (Fiber)_bots[fibers[0]].GetModule(typeof(Fiber));
         }
         lock (fiber._fiberLock)
         {
             if (!fiber._fiberResults.TryGetValue(fibers[1], out result))
             {
                 Queue <RCClosure> waiters;
                 if (fiber._fiberWaiters.TryGetValue(fibers[1], out waiters))
                 {
                     waiters.Enqueue(closure);
                 }
                 else
                 {
                     waiters = new Queue <RCClosure> ();
                     waiters.Enqueue(closure);
                     fiber._fiberWaiters.Add(fibers[1], waiters);
                 }
             }
         }
         if (result != null)
         {
             SafeYieldFromWait(closure, result);
         }
     }
     else
     {
         throw new Exception();
     }
 }
コード例 #13
0
 public void EvalEval(RCRunner runner, RCClosure closure, RCBlock left, RCLong right)
 {
     runner.Yield(closure, right);
 }
コード例 #14
0
 public void EvalWait(RCRunner runner, RCClosure closure, RCLong right)
 {
     runner.Wait(closure, right);
 }
コード例 #15
0
 public void EvalWatch(RCRunner runner, RCClosure closure, RCLong right)
 {
     runner.Watch(closure, right[0]);
 }
コード例 #16
0
        /*
         * protected Type InferType(string[] name, string original)
         * {
         * //Let's try to figure it out!
         * RCValue target = null;
         *
         * //Try the block under construction.
         * if (_block != null)
         * {
         * target = _block.Get(name);
         * }
         *
         * //Try to find it higher up the stack.
         * if (target == null)
         * {
         * RCBlock[] parents = _blocks.ToArray();
         * //When you ToArray the stack items come out in the same order
         * //you would have taken them off the stack.
         * for (int i = 0; i < parents.Length; ++i)
         * {
         * //There will be null blocks on the stack.
         * if (parents[i] != null)
         * {
         * target = parents[i].Get(name);
         * if (target != null) break;
         * }
         * }
         * }
         *
         * if (target == null)
         * {
         * throw new Exception("Unable to infer type for reference " + original + ".");
         * }
         * else return target.Yields;
         * }
         */

        protected RCVectorBase MakeVector(RCArray <RCToken> vector)
        {
            RCVectorBase result = null;

            if (vector[0].Text[0] == '~')
            {
                switch (vector[0].Text[1])
                {
                case 'x': return(RCByte.Empty);

                case 'b': return(RCBoolean.Empty);

                case 'l': return(RCLong.Empty);

                case 'd': return(RCDouble.Empty);

                case 'm': return(RCDecimal.Empty);

                case 's': return(RCString.Empty);

                case 'y': return(RCSymbol.Empty);

                case 't': return(RCTime.Empty);

                case 'n': return(RCIncr.Empty);

                default: throw new Exception("Unrecognized type code: " + vector[0].Text[1]);
                }
            }
            if (vector[0].Type == RCTokenType.Symbol)
            {
                RCArray <RCSymbolScalar> list = new RCArray <RCSymbolScalar> (vector.Count);
                for (int i = 0; i < vector.Count; ++i)
                {
                    list.Write(vector[i].ParseSymbol(_lexer));
                }
                result = new RCSymbol(list);
            }
            else if (vector[0].Type == RCTokenType.String)
            {
                RCArray <string> list = new RCArray <string> (vector.Count);
                for (int i = 0; i < vector.Count; ++i)
                {
                    list.Write(vector[i].ParseString(_lexer));
                }
                result = new RCString(list);
            }
            else if (vector[0].Type == RCTokenType.Boolean)
            {
                RCArray <bool> list = new RCArray <bool> (vector.Count);
                for (int i = 0; i < vector.Count; ++i)
                {
                    list.Write(vector[i].ParseBoolean(_lexer));
                }
                result = new RCBoolean(list);
            }
            else if (vector[0].Type == RCTokenType.Incr)
            {
                RCArray <RCIncrScalar> list = new RCArray <RCIncrScalar> (vector.Count);
                for (int i = 0; i < vector.Count; ++i)
                {
                    list.Write(vector[i].ParseIncr(_lexer));
                }
                result = new RCIncr(list);
            }
            else if (vector[0].Type == RCTokenType.Literal)
            {
                char type = vector[0].Text[1];
                switch (type)
                {
                case 'x':
                    RCArray <byte> list = new RCArray <byte> (vector.Count);
                    for (int i = 0; i < vector.Count; ++i)
                    {
                        list.Write(vector[i].ParseByte(_lexer));
                    }
                    result = new RCByte(list);
                    break;

                default: throw new Exception("Unknown type specifier:" + type);
                }
            }
            else if (vector[0].Type == RCTokenType.Time)
            {
                RCArray <RCTimeScalar> list = new RCArray <RCTimeScalar> (vector.Count);
                for (int i = 0; i < vector.Count; ++i)
                {
                    list.Write(vector[i].ParseTime(_lexer));
                }
                result = new RCTime(list);
            }
            else if (vector[0].Type == RCTokenType.Number)
            {
                // have a look at the last character in the last token
                // if there is a type specifier there we will use it to
                // create the appropriate type of vector.
                RCToken last = vector[vector.Count - 1];
                char    type = last.Text[last.Text.Length - 1];
                if (type == 'l')
                {
                    RCArray <long> list = new RCArray <long> (vector.Count);
                    for (int i = 0; i < vector.Count; ++i)
                    {
                        list.Write(vector[i].ParseLong(_lexer));
                    }
                    result = new RCLong(list);
                }
                if (type == 'd')
                {
                    RCArray <double> list = new RCArray <double> (vector.Count);
                    for (int i = 0; i < vector.Count; ++i)
                    {
                        list.Write(vector[i].ParseDouble(_lexer));
                    }
                    result = new RCDouble(list);
                }
                else if (type == 'm')
                {
                    RCArray <decimal> list = new RCArray <decimal> (vector.Count);
                    for (int i = 0; i < vector.Count; ++i)
                    {
                        list.Write(vector[i].ParseDecimal(_lexer));
                    }
                    result = new RCDecimal(list);
                }
                else // default to double
                {
                    if (vector[0].Text.IndexOf('.') > -1 || vector[0].Text == "NaN")
                    {
                        RCArray <double> list = new RCArray <double> (vector.Count);
                        for (int i = 0; i < vector.Count; ++i)
                        {
                            list.Write(vector[i].ParseDouble(_lexer));
                        }
                        result = new RCDouble(list);
                    }
                    else
                    {
                        RCArray <long> list = new RCArray <long> (vector.Count);
                        for (int i = 0; i < vector.Count; ++i)
                        {
                            list.Write(vector[i].ParseLong(_lexer));
                        }
                        result = new RCLong(list);
                    }
                }
            }
            return(result);
        }
コード例 #17
0
 public void EvalDone(RCRunner runner, RCClosure closure, RCLong right)
 {
     runner.Done(closure, right);
 }
コード例 #18
0
        public override RCValue BinaryParse(RCActivator activator, RCArray <byte> array, ref int start)
        {
            start += sizeof(int);
            RCArray <string>         tlnames = Binary.ReadVectorString(array, ref start);
            RCArray <long>           G       = null;
            RCArray <long>           E       = null;
            RCArray <RCTimeScalar>   T       = null;
            RCArray <RCSymbolScalar> S       = null;

            for (int i = 0; i < tlnames.Count; ++i)
            {
                char name = tlnames[i][0];
                switch (name)
                {
                case 'G': G = Binary.ReadVector <long> (array, ref start, sizeof(long)); break;

                case 'E': E = Binary.ReadVector <long> (array, ref start, sizeof(long)); break;

                case 'T': T = Binary.ReadVectorTime(array, ref start); break;

                case 'S': S = Binary.ReadVectorSymbol(array, ref start); break;

                default: throw new Exception("Unknown timeline column: " + tlnames[i]);
                }
            }
            Timeline             timeline = new Timeline(G, E, T, S);
            RCArray <string>     names    = Binary.ReadVectorString(array, ref start);
            RCArray <ColumnBase> columns  = new RCArray <ColumnBase> (names.Count);

            for (int i = 0; i < names.Count; ++i)
            {
                char type = (char)array[start];
                start += sizeof(byte);
                RCArray <int> index = RCLong.ReadVector4(array, ref start);
                switch (type)
                {
                case 'x':
                    RCArray <byte> datax = Binary.ReadVector <byte> (array, ref start, sizeof(byte));
                    columns.Write(new RCCube.ColumnOfByte(timeline, index, datax));
                    break;

                case 'd':
                    RCArray <double> datad = Binary.ReadVector <double> (array, ref start, sizeof(double));
                    columns.Write(new RCCube.ColumnOfDouble(timeline, index, datad));
                    break;

                case 'l':
                    RCArray <long> datal = Binary.ReadVector <long> (array, ref start, sizeof(long));
                    columns.Write(new RCCube.ColumnOfLong(timeline, index, datal));
                    break;

                case 'm':
                    RCArray <decimal> datam = Binary.ReadVectorDecimal(array, ref start);
                    columns.Write(new RCCube.ColumnOfDecimal(timeline, index, datam));
                    break;

                case 'n':
                    RCArray <RCIncrScalar> datan = Binary.ReadVectorIncr(array, ref start);
                    columns.Write(new RCCube.ColumnOfIncr(timeline, index, datan));
                    break;

                case 'b':
                    RCArray <bool> datab = Binary.ReadVector <bool> (array, ref start, sizeof(bool));
                    columns.Write(new RCCube.ColumnOfBool(timeline, index, datab));
                    break;

                case 's':
                    RCArray <string> datas = Binary.ReadVectorString(array, ref start);
                    columns.Write(new RCCube.ColumnOfString(timeline, index, datas));
                    break;

                case 'y':
                    RCArray <RCSymbolScalar> datay = Binary.ReadVectorSymbol(array, ref start);
                    columns.Write(new RCCube.ColumnOfSymbol(timeline, index, datay));
                    break;

                default: throw new Exception("Cannot ReadVector with type " + type);
                }
            }
            return(new RCCube(timeline, names, columns));
        }
コード例 #19
0
 public void EvalFail(RCRunner runner, RCClosure closure, RCLong left, RCString right)
 {
     runner.Finish(closure, new RCException(closure, RCErrors.Custom, right[0]), left[0]);
 }