예제 #1
0
        public void ItComposesPrnForComplexIfStatement(string operation)
        {
            var logger = new LoggerConfiguration().CreateLogger(); var lexer = new Lexer(logger);
            var sequence = lexer.ParseTokens(new StringReader($@"program test
var ,a
begin
    m: 
    if [a == 1 {operation} ![a == 2]] then goto m
end")).ToList();

            var executor = new BasicExecutor();
            var labels   = lexer.Labels.ToList();
            var prn      = executor.PrnComposer.GetPrn(sequence, labels);

            //m: a 1 == a 2 == not or _m1 CondFalse m Uncond _m1:
            Assert.AreEqual(16, prn.Count);
            Assert.AreEqual(true, prn[0] is LabelToken);
            Assert.AreEqual(":", prn[1].Substring);
            Assert.AreEqual(true, prn[2] is IdentifierToken);
            Assert.AreEqual(true, prn[3] is ConstantToken <float>);
            Assert.AreEqual("==", prn[4].Substring);
            Assert.AreEqual(true, prn[5] is IdentifierToken);
            Assert.AreEqual(true, prn[6] is ConstantToken <float>);
            Assert.AreEqual("==", prn[7].Substring);
            Assert.AreEqual("!", prn[8].Substring);
            Assert.AreEqual(operation, prn[9].Substring);
            Assert.AreEqual(true, prn[10] is LabelToken);
            Assert.AreEqual(true, prn[11] is ConditionalFalseJumpOperation);
            Assert.AreEqual(true, prn[12] is LabelToken);
            Assert.AreEqual(true, prn[13] is UnconditionalJumpOperation);
            Assert.AreEqual(true, prn[14] is LabelToken);
            Assert.AreEqual(":", prn[15].Substring);

            Assert.IsTrue(labels.Any(x => x.Name == "_m2"));
        }
예제 #2
0
        public static void Main(string[] args)
        {
            var executor   = new BasicExecutor(TaskScheduler.Current);
            var disruptor  = new Disruptor <StubEvent>(() => new StubEvent(-1), 1024, TaskScheduler.Current);
            var ringBuffer = disruptor.Start();

            // Construct 2 batch event processors.
            var handler1   = new DynamicHandler();
            var processor1 = new BatchEventProcessor <StubEvent>(ringBuffer, ringBuffer.NewBarrier(), handler1);

            var handler2   = new DynamicHandler();
            var processor2 = new BatchEventProcessor <StubEvent>(ringBuffer, ringBuffer.NewBarrier(processor1.Sequence), handler2);

            // Dynamically add both sequences to the ring buffer
            ringBuffer.AddGatingSequences(processor1.Sequence, processor2.Sequence);

            // Start the new batch processors.
            executor.Execute(processor1.Run);
            executor.Execute(processor2.Run);

            // Remove a processor.

            // Stop the processor
            processor2.Halt();
            // Wait for shutdown the complete
            handler2.WaitShutdown();
            // Remove the gating sequence from the ring buffer
            ringBuffer.RemoveGatingSequence(processor2.Sequence);
        }
예제 #3
0
        public void ItComposesPrnForAssignmentArithmeticExp()
        {
            var logger = new LoggerConfiguration().CreateLogger(); var lexer = new Lexer(logger);
            var sequence = lexer.ParseTokens(new StringReader(@"program test
var ,a
begin
    a = (2 + 8) * ((3 + 4) / 2)
end")).ToList();

            var executor = new BasicExecutor();
            var prn      = executor.PrnComposer.GetPrn(sequence);

            //a 2 8 + 3 4 + 2 / * =
            Assert.AreEqual(11, prn.Count);
            Assert.AreEqual(true, prn[0] is IdentifierToken);
            Assert.AreEqual(true, prn[1] is ConstantToken <float>);
            Assert.AreEqual(true, prn[2] is ConstantToken <float>);
            Assert.AreEqual("+", prn[3].Substring);
            Assert.AreEqual(true, prn[4] is ConstantToken <float>);
            Assert.AreEqual(true, prn[5] is ConstantToken <float>);
            Assert.AreEqual("+", prn[6].Substring);
            Assert.AreEqual(true, prn[7] is ConstantToken <float>);
            Assert.AreEqual("/", prn[8].Substring);
            Assert.AreEqual("*", prn[9].Substring);
            Assert.AreEqual("=", prn[10].Substring);
        }
        public async Task ShouldBuildDisruptor()
        {
            var ringBuffer = RingBuffer <Event> .CreateSingleProducer(() => new Event(100), 16384, new BlockingWaitStrategy());

            var executor           = new BasicExecutor(TaskScheduler.Default);
            var consumerRepository = new ConsumerRepository();

            var handlerA               = new EventHandlerA();
            var handlerABarrier        = ringBuffer.NewBarrier(new ISequence[0]);
            var handlerAEventProcessor = new EventProcessor <Event>(ringBuffer, handlerABarrier, handlerA);

            consumerRepository.Add(handlerAEventProcessor, handlerA, handlerABarrier);

            var handlerB               = new CleanerHandler();
            var handlerBBarrier        = ringBuffer.NewBarrier(new ISequence[] { handlerAEventProcessor.Sequence });
            var handlerBEventProcessor = new EventProcessor <Event>(ringBuffer, handlerBBarrier, handlerB);

            consumerRepository.Add(handlerBEventProcessor, handlerB, handlerBBarrier);

            foreach (var consumerInfo in consumerRepository)
            {
                consumerInfo.Start(executor);
            }

            var next = ringBuffer.Next();
            var ev   = ringBuffer[next];

            ringBuffer.Publish(next);

            await Task.Delay(50);

            Assert.AreEqual(2, ev.Counter);

            Assert.AreEqual(0, ev.Data.Sum(i => i));
        }
예제 #5
0
 public ServerBootstrap()
     : base()
 {
     UseProxies = true;
     WorkersShareFiber(true);
     BufferBytes      = NetworkConstants.DEFAULT_BUFFER_SIZE;
     Workers          = 2;
     InternalExecutor = new BasicExecutor();
 }
예제 #6
0
        public void ItComposesPrnForLoop()
        {
            var logger   = new LoggerConfiguration().CreateLogger();
            var lexer    = new Lexer(logger);
            var sequence = lexer.ParseTokens(new StringReader(@"
begin
    do i=1 to 10
        b = b - 1
    next
end")).ToList();

            var executor = new BasicExecutor(logger);
            var labels   = lexer.Labels.ToList();
            var store    = new VariableStore();
            var prn      = executor.PrnComposer.GetPrn(sequence, labels, store);

            //i 1 = _m1: _r1 c = i _r1 <= _m2 COND b b 1 - = i i 1 + = _m1 UNCOND _m2:
            Assert.AreEqual(27, prn.Count);
            Assert.AreEqual(true, prn[0] is IdentifierToken);
            Assert.AreEqual(true, prn[1] is ConstantToken <float>);
            Assert.AreEqual("=", prn[2].Substring);
            Assert.AreEqual(true, prn[3] is LabelToken);
            Assert.AreEqual(":", prn[4].Substring);
            Assert.AreEqual(true, prn[5] is IdentifierToken);
            Assert.AreEqual(true, prn[6] is ConstantToken <float>);
            Assert.AreEqual("=", prn[7].Substring);
            Assert.AreEqual(true, prn[8] is IdentifierToken);
            Assert.AreEqual(true, prn[9] is IdentifierToken);
            Assert.AreEqual("<=", prn[10].Substring);
            Assert.AreEqual(true, prn[11] is LabelToken);
            Assert.AreEqual(true, prn[12] is ConditionalFalseJumpOperation);

            Assert.AreEqual(true, prn[13] is IdentifierToken);
            Assert.AreEqual(true, prn[14] is IdentifierToken);
            Assert.AreEqual(true, prn[15] is ConstantToken <float>);
            Assert.AreEqual("-", prn[16].Substring);
            Assert.AreEqual("=", prn[17].Substring);

            Assert.AreEqual(true, prn[18] is IdentifierToken);
            Assert.AreEqual(true, prn[19] is IdentifierToken);
            Assert.AreEqual(true, prn[20] is ConstantToken <float>);
            Assert.AreEqual("+", prn[21].Substring);
            Assert.AreEqual("=", prn[22].Substring);

            Assert.AreEqual(true, prn[23] is LabelToken);
            Assert.AreEqual(true, prn[24] is UnconditionalJumpOperation);

            Assert.AreEqual(true, prn[25] is LabelToken);
            Assert.AreEqual(":", prn[26].Substring);
        }
예제 #7
0
        public void ItComposesPrnForAssignment()
        {
            var sequence = GetSequence(new Token[]
            {
                new IdentifierToken("a"), new StringToken("="), new ConstantToken <float>(2.0f)
            }, "a");

            var executor = new BasicExecutor();
            var prn      = executor.PrnComposer.GetPrn(sequence);

            Assert.AreEqual(3, prn.Count);
            Assert.AreEqual(true, prn[0] is IdentifierToken);
            Assert.AreEqual(true, prn[1] is ConstantToken <float>);
            Assert.AreEqual("=", prn[2].Substring);
        }
예제 #8
0
        public void ItComposesPrnForWriteStatement()
        {
            var logger = new LoggerConfiguration().CreateLogger(); var lexer = new Lexer(logger);
            var sequence = lexer.ParseTokens(new StringReader(@"
begin
    writel(a)
end")).ToList();

            var executor = new BasicExecutor();
            var labels   = lexer.Labels.ToList();
            var prn      = executor.PrnComposer.GetPrn(sequence, labels);

            //a RD
            Assert.AreEqual(2, prn.Count);
            Assert.AreEqual(true, prn[0] is IdentifierToken);
            Assert.AreEqual(true, prn[1] is WriteOperation);
        }
예제 #9
0
        public void ItComposesPrnForAssignmentUnaryMinus()
        {
            var a        = new IdentifierToken("a");
            var sequence = GetSequence(new Token[]
            {
                a, new StringToken("="), new ConstantToken <float>(2.0f), new StringToken(Environment.NewLine),
                new IdentifierToken("b"), new StringToken("="), new StringToken("-"), a
            }, "a", "b");

            var executor = new BasicExecutor();
            var prn      = executor.PrnComposer.GetPrn(sequence);

            Assert.AreEqual(7, prn.Count);
            Assert.AreEqual(true, prn[0] is IdentifierToken);
            Assert.AreEqual(true, prn[1] is ConstantToken <float>);
            Assert.AreEqual("=", prn[2].Substring);
            Assert.AreEqual(true, prn[3] is IdentifierToken);
            Assert.AreEqual(true, prn[4] is IdentifierToken);
            Assert.AreEqual("@", prn[5].Substring);
            Assert.AreEqual("=", prn[6].Substring);
        }
예제 #10
0
        public void ItExecutesLoop()
        {
            var logger = new LoggerConfiguration().CreateLogger();

            //Arrange
            var i        = new IdentifierToken("i");
            var j        = new IdentifierToken("j");
            var res      = new IdentifierToken("sum");
            var lexer    = new Lexer(logger);
            var sequence = lexer.ParseTokens(new StringReader(@"
begin
    do i=1 to 5
        do j=2 to 7
            sum = sum + i*j
        next
    next
end")).ToList();

            var store = new VariableStore()
            {
                [i]   = new ConstantToken <float>(0),
                [j]   = new ConstantToken <float>(0),
                [res] = new ConstantToken <float>(0)
            };

            var prnProvider = new BasicExecutor(logger);
            var labels      = lexer.Labels.ToList();
            var prn         = prnProvider.PrnComposer.GetPrn(sequence, labels, store);


            var executor = new PrnExpressionExecutor();

            //Act
            var result = executor.ComputeExpression(prn, store);

            //Assert
            Assert.AreEqual(5 + 1, store[i].Value);
            Assert.AreEqual(7 + 1, store[j].Value);
            Assert.AreEqual(405, store[res].Value);
        }
예제 #11
0
        public void ItComposesPrnForMultiLineAssignment()
        {
            var logger = new LoggerConfiguration().CreateLogger(); var lexer = new Lexer(logger);
            var sequence = lexer.ParseTokens(new StringReader(@"program test
var ,a
begin
    a = 2
    a = 3
end")).ToList();

            var executor = new BasicExecutor();
            var prn      = executor.PrnComposer.GetPrn(sequence);

            //a 2 = a 3 =
            Assert.AreEqual(6, prn.Count);
            Assert.AreEqual(true, prn[0] is IdentifierToken);
            Assert.AreEqual(true, prn[1] is ConstantToken <float>);
            Assert.AreEqual("=", prn[2].Substring);
            Assert.AreEqual(true, prn[3] is IdentifierToken);
            Assert.AreEqual(true, prn[4] is ConstantToken <float>);
            Assert.AreEqual("=", prn[5].Substring);
        }
예제 #12
0
 public ClientBootstrap()
 {
     Workers          = 2;
     InternalExecutor = new BasicExecutor();
 }