示例#1
0
        public BaselineModule(
            ITxSender txSender,
            IStateReader stateReader,
            ILogFinder logFinder,
            IBlockFinder blockFinder,
            IAbiEncoder abiEncoder,
            IFileSystem fileSystem,
            IDb baselineDb,
            IDb metadataBaselineDb,
            ILogManager logManager,
            IBlockProcessor blockProcessor,
            DisposableStack disposableStack)
        {
            _abiEncoder         = abiEncoder ?? throw new ArgumentNullException(nameof(abiEncoder));
            _fileSystem         = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
            _baselineDb         = baselineDb ?? throw new ArgumentNullException(nameof(baselineDb));
            _metadataBaselineDb = metadataBaselineDb ?? throw new ArgumentNullException(nameof(metadataBaselineDb));
            _logger             = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
            _txSender           = txSender ?? throw new ArgumentNullException(nameof(txSender));
            _stateReader        = stateReader ?? throw new ArgumentNullException(nameof(stateReader));
            _logFinder          = logFinder ?? throw new ArgumentNullException(nameof(logFinder));
            _blockFinder        = blockFinder ?? throw new ArgumentNullException(nameof(blockFinder));
            _blockProcessor     = blockProcessor ?? throw new ArgumentNullException(nameof(blockProcessor));
            _baselineTreeHelper = new BaselineTreeHelper(_logFinder, baselineDb, metadataBaselineDb, _logger);
            _disposableStack    = disposableStack ?? throw new ArgumentNullException(nameof(disposableStack));

            _metadata = LoadMetadata();
            InitTrees();
        }
示例#2
0
        public static GameFont HiResFromGameData()
        {
            using (DisposableStack disposables = new DisposableStack(2))
            {
                GameImage firstImage, secondImage;

                ArchiveDirectoryEntry mainDirectory  = Archives.GetEntry <ArchiveDirectoryEntry>(MainPath);
                ArchiveDirectoryEntry menuDirectory  = Archives.GetEntry <ArchiveDirectoryEntry>(MenuPath);
                ArchiveDirectoryEntry hiresDirectory = menuDirectory.GetChildEntry <ArchiveDirectoryEntry>(HiResDirectoryName);
                ArchiveFileEntry      tdwEntry       = mainDirectory.GetChildEntry <ArchiveFileEntry>(HiResCharactersWidthsFileName);
                ArchiveFileEntry      image01        = hiresDirectory.GetChildEntry <ArchiveFileEntry>(HiResFontImage1FileName);
                ArchiveFileEntry      image02        = hiresDirectory.GetChildEntry <ArchiveFileEntry>(HiResFontImage2FileName);

                byte[] widths;
                using (TdwFileReader tdwReader = new TdwFileReader(tdwEntry.OpenReadableContentStream()))
                    widths = tdwReader.Table;

                using (TexFileReader texReader = new TexFileReader(image01.OpenReadableContentStream()))
                {
                    firstImage = GameImageReader.FromTex(texReader);
                    disposables.Add(firstImage.Layer);
                }

                using (TexFileReader texReader = new TexFileReader(image02.OpenReadableContentStream()))
                    secondImage = disposables.Add(GameImageReader.FromTex(texReader));

                int       x        = firstImage.X;
                int       y        = firstImage.Y;
                GLTexture palettes = firstImage.Palettes;
                GLTexture layer    = GLTextureFactory.HorizontalJoin(firstImage.Layer, secondImage.Layer);
                GameImage image    = new GameImage(x, y, layer, palettes);

                return(new GameFont(image, widths));
            }
        }
示例#3
0
        protected Node(NodeInfo identity, NodeConfiguration config)
        {
            Logger         = config.LoggerDelegate;
            SeedNode       = config.SeedNode;
            SuccessorCount = config.SuccessorCount;
            Serializer     = config.Serializer;
            Marshaller     = new NodeMarshaller(Serializer, config.HashingService);
            MessageBus     = new MemoryBus(); // We can change the publishing strategy factory so we can log everything...
            InitHandlers();
            Identity           = identity;
            Successor          = identity;
            Predecessor        = null;
            SocketFactory      = config.NodeSocketFactory;
            HashingService     = config.HashingService;
            CorrelationFactory = config.CorrelationFactory;
            Clock   = config.Clock;
            Janitor = new DisposableStack();

            Poller          = Janitor.Push(new NetMQPoller());
            InitTimer       = CreateInitTimer();
            ListeningSocket = Janitor.Push(SocketFactory.CreateBindingSocket(Identity.HostAndPort));
            InitListeningSocket();
            ForwardingSockets  = Janitor.Push(new SocketCache(SocketFactory, Clock));
            Actor              = Janitor.Push(CreateActor());
            InitTimer.Elapsed += (sender, args) =>
            {
                Publish(new NodeReady(Identity.RoutingHash));
            };
            FingerTable    = new FingerTable(Identity, Identity.RoutingHash.BitCount);
            SuccessorTable = new SuccessorTable(Identity, config.SuccessorCount);
        }
示例#4
0
        public async Task RejectsUpgradeWhenLimitReached()
        {
            const int limit          = 10;
            var       upgradeTcs     = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously);
            var       serviceContext = new TestServiceContext(LoggerFactory);

            serviceContext.ConnectionManager = new ConnectionManager(serviceContext.Log, ResourceCounter.Quota(limit));

            using (var server = new TestServer(async context =>
            {
                var feature = context.Features.Get <IHttpUpgradeFeature>();
                if (feature.IsUpgradableRequest)
                {
                    try
                    {
                        var stream = await feature.UpgradeAsync();
                        while (!context.RequestAborted.IsCancellationRequested)
                        {
                            await Task.Delay(100);
                        }
                    }
                    catch (InvalidOperationException ex)
                    {
                        upgradeTcs.TrySetException(ex);
                    }
                }
            }, serviceContext))
            {
                using (var disposables = new DisposableStack <InMemoryConnection>())
                {
                    for (var i = 0; i < limit; i++)
                    {
                        var connection = server.CreateConnection();
                        disposables.Push(connection);

                        await connection.SendEmptyGetWithUpgradeAndKeepAlive();

                        await connection.Receive("HTTP/1.1 101");
                    }

                    using (var connection = server.CreateConnection())
                    {
                        await connection.SendEmptyGetWithUpgradeAndKeepAlive();

                        await connection.Receive("HTTP/1.1 200");
                    }
                }
                await server.StopAsync();
            }

            var exception = await Assert.ThrowsAsync <InvalidOperationException>(async() => await upgradeTcs.Task.TimeoutAfter(TimeSpan.FromSeconds(60)));

            Assert.Equal(CoreStrings.UpgradedConnectionLimitReached, exception.Message);
        }
示例#5
0
        public static GameImage FromTex(TexFileReader reader)
        {
            const short x = 0;
            const short y = 0;

            using (DisposableStack insurance = new DisposableStack(2))
            {
                GLTexture layer    = insurance.Add(reader.ReadImage());
                GLTexture palettes = insurance.Add(GLTextureFactory.FromBitmapPalettes(reader.Palettes));
                GameImage result   = new GameImage(x, y, layer, palettes);
                insurance.Clear();
                return(result);
            }
        }
        public async Task UpgradedConnectionsCountsAgainstDifferentLimit()
        {
            using (var server = CreateServerWithMaxConnections(async context =>
            {
                var feature = context.Features.Get <IHttpUpgradeFeature>();
                if (feature.IsUpgradableRequest)
                {
                    var stream = await feature.UpgradeAsync();
                    // keep it running until aborted
                    while (!context.RequestAborted.IsCancellationRequested)
                    {
                        await Task.Delay(100);
                    }
                }
            }, max: 1))
            {
                using (var disposables = new DisposableStack <InMemoryConnection>())
                {
                    var upgraded = server.CreateConnection();
                    disposables.Push(upgraded);

                    await upgraded.SendEmptyGetWithUpgrade();

                    await upgraded.Receive("HTTP/1.1 101");

                    // once upgraded, normal connection limit is decreased to allow room for more "normal" connections

                    var connection = server.CreateConnection();
                    disposables.Push(connection);

                    await connection.SendEmptyGetAsKeepAlive();

                    await connection.Receive("HTTP/1.1 200 OK");

                    using (var rejected = server.CreateConnection())
                    {
                        try
                        {
                            // this may throw IOException, depending on how fast Kestrel closes the socket
                            await rejected.SendEmptyGetAsKeepAlive();
                        }
                        catch { }

                        // connection should close without sending any data
                        await rejected.WaitForConnectionClose();
                    }
                }
                await server.StopAsync();
            }
        }
示例#7
0
        public static GameImage FromTim(TimFileReader reader)
        {
            using (DisposableStack insurance = new DisposableStack(3))
            {
                TimImage timImage = insurance.Add(reader.ReadImage());
                short    x        = timImage.ImageHeader.X;
                short    y        = timImage.ImageHeader.Y;

                GLTexture layer    = timImage.Layer;
                GLTexture palettes = insurance.Add(GLTextureFactory.FromBitmapPalettes(reader.Palettes == null ? null : reader.Palettes.Palettes));

                GameImage result = new GameImage(x, y, layer, palettes);
                insurance.Clear();
                return(result);
            }
        }
        private void ReadTextureFromTexFiles(string[] files)
        {
            GLTexture[] textures = new GLTexture[2];
            using (DisposableStack disposables = new DisposableStack(2))
            {
                for (int i = 0; i < 2; i++)
                {
                    using (FileStream input = File.OpenRead(files[i]))
                        using (TexFileReader texReader = new TexFileReader(input))
                            textures[i] = disposables.Add(texReader.ReadImage());
                }

                _texture    = GLTextureFactory.HorizontalJoin(textures[0], textures[1]);
                _ownTexture = true;
            }
        }
        private static DxTexture[] ReadTextures(ImgbArchiveAccessor accessor, TextureSection[] gtexDatas)
        {
            DxTexture[] textures = new DxTexture[gtexDatas.Length];

            using (Stream imgbStream = accessor.ExtractContent())
                using (DisposableStack insurance = new DisposableStack())
                {
                    for (int i = 0; i < gtexDatas.Length; i++)
                    {
                        GtexData data = gtexDatas[i].Gtex;
                        textures[i] = insurance.Add(ReadTexture(imgbStream, data));
                    }
                    insurance.Clear();
                }

            return(textures);
        }
示例#10
0
        protected Node(NodeInfo identity, NodeConfiguration config)
        {
            Config      = config;
            Identity    = identity;
            Predecessor = Identity;

            Clock = Config.Clock;
            CorrelationFactory = Config.CorrelationFactory;
            Janitor            = new DisposableStack();
            MessageBus         = new MemoryBus();
            Poller             = Janitor.Push(new NetMQPoller());
            Logger             = Config.LoggerDelegate;
            Marshaller         = Config.MarshallerFactory.Create();

            ExpiryCalculator = Config.ExpiryCalculator;

            Log($"Binding to {Config.NodeSocketFactory.BindingConnectionString(Identity.HostAndPort)}");
            ListeningSocket   = Janitor.Push(Config.NodeSocketFactory.CreateBindingSocket(Identity.HostAndPort));
            ForwardingSockets = Janitor.Push(new SocketCache(Config.NodeSocketFactory, Clock)); // Chicken and egg scenario where we require an actor!

            CommunicationManager = config.CommunicationManagerFactory.Create(Identity, Marshaller, ForwardingSockets, MessageBus, Log);

            Actor = Janitor.Push(CreateActor());
            ForwardingSockets.AddActor(Identity.HostAndPort, Actor);

            Janitor.Push(new DisposableAction(() => { Poller.Remove(ListeningSocket); }));
            Janitor.Push(new DisposableAction(
                             () => { ListeningSocket.ReceiveReady += ListeningSocketReceiveReady; },
                             () => { ListeningSocket.ReceiveReady -= ListeningSocketReceiveReady; }));

            ActionScheduler = Janitor.Push(new NodeActionScheduler(Clock, Config.ActionTimerFactory.Create(), Marshaller, Actor));
            MessageBus.Subscribe(new NodeHandler(this, ActionScheduler));
            var awaitHandler = Janitor.Push(new AwaitAckHandler(ActionScheduler, ExpiryCalculator, Marshaller, Actor, Log, Config.AwaitSettings));

            MessageBus.Subscribe(awaitHandler);
            MessageBus.Subscribe(new JoinNetworkHandler(this, CommunicationManager));
            MessageBus.Subscribe(new StabilizeHandler(this, CommunicationManager));
            MessageBus.Subscribe(new RectifyHandler(this, CommunicationManager));
            MessageBus.Subscribe(new NotifyHandler(this, CommunicationManager));

            FingerTable    = new FingerTable(Identity, Identity.RoutingHash.BitCount);
            SuccessorTable = new SuccessorTable(Identity, Config.SuccessorCount);

            // Let everything know we're ready to go.
            CommunicationManager.SendInternal(new NodeInitialised());
        }
        public async Task RejectsConnectionsWhenLimitReached()
        {
            const int max        = 10;
            var       requestTcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously);

            using (var server = CreateServerWithMaxConnections(async context =>
            {
                await context.Response.WriteAsync("Hello");
                await requestTcs.Task;
            }, max))
            {
                using (var disposables = new DisposableStack <InMemoryConnection>())
                {
                    for (var i = 0; i < max; i++)
                    {
                        var connection = server.CreateConnection();
                        disposables.Push(connection);

                        await connection.SendEmptyGetAsKeepAlive();

                        await connection.Receive("HTTP/1.1 200 OK");
                    }

                    // limit has been reached
                    for (var i = 0; i < 10; i++)
                    {
                        using (var connection = server.CreateConnection())
                        {
                            try
                            {
                                // this may throw IOException, depending on how fast Kestrel closes the socket
                                await connection.SendEmptyGetAsKeepAlive();
                            }
                            catch { }

                            // connection should close without sending any data
                            await connection.WaitForConnectionClose();
                        }
                    }

                    requestTcs.TrySetResult(null);
                }
                await server.StopAsync();
            }
        }
示例#12
0
文件: Flute.cs 项目: kidaa/Pulse
        public static void CreatePipe(long capacity, out Stream input, out Stream output)
        {
            using (DisposableStack insurance = new DisposableStack(3))
            {
                Flute flute = insurance.Add(new Flute(capacity));
                Stream writer = insurance.Add(flute.AcquireWriter(0, capacity));
                Stream reader = insurance.Add(flute.AcquireReader(0, capacity));

                DisposableStream disposableOutput = new DisposableStream(reader);
                disposableOutput.AfterDispose.Add(flute);
                disposableOutput.AfterDispose.Add(writer);

                input = writer;
                output = disposableOutput;

                insurance.Clear();
            }
        }
        public async Task RejectsConnectionsWhenLimitReached()
        {
            const int max = 10;

            var(serviceContext, _) = SetupMaxConnections(max);
            var requestTcs = new TaskCompletionSource <object>();

            using (var server = new TestServer(async context =>
            {
                await context.Response.WriteAsync("Hello");
                await requestTcs.Task;
            }, serviceContext))
                using (var disposables = new DisposableStack <TestConnection>())
                {
                    for (var i = 0; i < max; i++)
                    {
                        var connection = server.CreateConnection();
                        disposables.Push(connection);

                        await connection.SendEmptyGetAsKeepAlive();

                        await connection.Receive("HTTP/1.1 200 OK");
                    }

                    // limit has been reached
                    for (var i = 0; i < 10; i++)
                    {
                        using (var connection = server.CreateConnection())
                        {
                            try
                            {
                                // this may throw IOException, depending on how fast Kestrel closes the socket
                                await connection.SendEmptyGetAsKeepAlive();
                            } catch { }

                            // connection should close without sending any data
                            await connection.WaitForConnectionClose().TimeoutAfter(TimeSpan.FromSeconds(15));
                        }
                    }

                    requestTcs.TrySetResult(null);
                }
        }
示例#14
0
        public static void HiResToGameData(GameFont gameFont)
        {
            using (DisposableStack disposables = new DisposableStack(2))
            {
                GLTexture leftTexture;
                GLTexture rightTexture;
                GLTextureFactory.HorizontalSplit(gameFont.CharactersImage.Layer, out leftTexture, out rightTexture);
                disposables.Add(leftTexture);
                disposables.Add(rightTexture);

                ArchiveDirectoryEntry mainDirectory  = Archives.GetEntry <ArchiveDirectoryEntry>(GameFontReader.MainPath);
                ArchiveDirectoryEntry menuDirectory  = Archives.GetEntry <ArchiveDirectoryEntry>(GameFontReader.MenuPath);
                ArchiveDirectoryEntry hiresDirectory = menuDirectory.GetChildEntry <ArchiveDirectoryEntry>(GameFontReader.HiResDirectoryName);
                ArchiveFileEntry      tdwEntry       = mainDirectory.GetChildEntry <ArchiveFileEntry>(GameFontReader.HiResCharactersWidthsFileName);
                ArchiveFileEntry      image01        = hiresDirectory.GetChildEntry <ArchiveFileEntry>(GameFontReader.HiResFontImage1FileName);
                ArchiveFileEntry      image02        = hiresDirectory.GetChildEntry <ArchiveFileEntry>(GameFontReader.HiResFontImage2FileName);

                using (Stream output = tdwEntry.OpenWritableCapacityStream())
                    using (TdwFileWriter tdwWriter = new TdwFileWriter(output))
                    {
                        tdwWriter.WriteFontCharactersWidths(gameFont.CharactersWidths);
                        tdwEntry.UpdateMetrics((int)output.Position, tdwEntry.ContentOffset, Compression.None);
                    }

                using (Stream output = image01.OpenWritableCapacityStream())
                    using (TexFileWriter texWriter = new TexFileWriter(output))
                    {
                        texWriter.WriteImage(leftTexture, gameFont.CharactersImage.Palettes);
                        image01.UpdateMetrics((int)output.Position, image01.ContentOffset, Compression.None);
                    }

                using (Stream output = image02.OpenWritableCapacityStream())
                    using (TexFileWriter texWriter = new TexFileWriter(output))
                    {
                        texWriter.WriteImage(rightTexture, gameFont.CharactersImage.Palettes);
                        image02.UpdateMetrics((int)output.Position, image02.ContentOffset, Compression.None);
                    }

                Archives.GetInfo(ArchiveName.Main).Update();
                Archives.GetInfo(ArchiveName.Menu).Update();
            }
        }
示例#15
0
 public BaselineModuleFactory(
     ITxSender txSender,
     IStateReader stateReader,
     ILogFinder logFinder,
     IBlockFinder blockFinder,
     IAbiEncoder abiEncoder,
     IFileSystem fileSystem,
     ILogManager logManager,
     IBlockProcessor blockProcessor,
     DisposableStack disposableStack,
     IDbProvider dbProvider)
 {
     _txSender        = txSender ?? throw new ArgumentNullException(nameof(txSender));
     _logFinder       = logFinder ?? throw new ArgumentNullException(nameof(logFinder));
     _blockFinder     = blockFinder ?? throw new ArgumentNullException(nameof(blockFinder));
     _stateReader     = stateReader ?? throw new ArgumentNullException(nameof(stateReader));
     _abiEncoder      = abiEncoder ?? throw new ArgumentNullException(nameof(abiEncoder));
     _fileSystem      = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
     _logManager      = logManager ?? throw new ArgumentNullException(nameof(logManager));
     _blockProcessor  = blockProcessor ?? throw new ArgumentNullException(nameof(blockProcessor));
     _disposableStack = disposableStack ?? throw new ArgumentNullException(nameof(disposableStack));
     _dbProvider      = dbProvider ?? throw new ArgumentNullException(nameof(dbProvider));
 }
示例#16
0
        void Run(string[] args)
        {
            using (var janitor = new DisposableStack())
            {
                var logger = janitor.Push(new FileLogger());

                var hostEntry = _dnsProvider.GetHostEntry("localhost");
                var config    = new MyAppNodeConfiguration
                {
                    HashingService              = _hashingService,
                    Serializer                  = _msgSerializer,
                    NodeSocketFactory           = _nodeSocketFactory,
                    Clock                       = _clock,
                    CorrelationFactory          = _correlationFactory,
                    SuccessorCount              = 2,
                    SeedNode                    = $"{hostEntry.HostName}:{SeedPort}",
                    LoggerDelegate              = logger.WriteLine,
                    ExpiryCalculator            = _expiryCalculator,
                    Random                      = _random,
                    ActionTimerFactory          = _actionTimerFactory,
                    MarshallerFactory           = _marshallerFactory,
                    CommunicationManagerFactory = _communicationManagerFactory,
                };

                var factory = new MyAppNodeFactory(config);

                var hostAndPort0 = $"{hostEntry.HostName}:{SeedPort}";
                var id0          = Node.CreateIdentifier(hostAndPort0);

                var nodes = new List <Node>();

                nodes.Add(janitor.Push(factory.CreateNode(id0, hostAndPort0)));

                for (int i = 9001; i < 9003; ++i)
                {
                    var hostAndPort = $"{hostEntry.HostName}:{i}";
                    var id          = Node.CreateIdentifier(hostAndPort);
                    nodes.Add(janitor.Push(factory.CreateNode(id, hostAndPort)));
                    Thread.Sleep(1500);
                }

                Thread.Sleep(1000);
                Console.WriteLine("***** Connectivity Summary *****");


                Console.ReadKey();

                foreach (var node in nodes)
                {
                    Console.WriteLine($"{node.Identity}\tS: {node.Successor}\tP: {node.Predecessor}");
                }

                Console.ReadKey();

                //var terminate = new TerminateNode(node0.Identity.RoutingHash);
                //node0.Publish(terminate);

                //terminate = new TerminateNode(node1.Identity.RoutingHash);
                //node1.Publish(terminate);

                //terminate = new TerminateNode(node2.Identity.RoutingHash);
                //node2.Publish(terminate);
            }

            Console.ReadKey();
        }
示例#17
0
        private void Patch(BinaryReader br, GameLocationInfo gameLocation)
        {
            if (CancelEvent.IsSet())
                return;

            FFXIIITextEncoding encoding = ReadEncoding(br);
            TextEncodingInfo encodingInfo = new TextEncodingInfo(encoding);
            InteractionService.TextEncoding.SetValue(encodingInfo);
            if (CancelEvent.IsSet())
                return;

            Dictionary<string, string> dic = ReadStrings(br);
            dic["$title_newgame"] = _userName;
            if (CancelEvent.IsSet())
                return;

            using (DisposableStack disposables = new DisposableStack())
            {
                MemoryInjectionSource source = disposables.Add(new MemoryInjectionSource());
                source.RegisterStrings(dic);
                if (CancelEvent.IsSet())
                    return;

                int count = br.ReadInt32();
                OnProgress(4);

                for (int i = 0; i < count; i++)
                {
                    long position = br.BaseStream.Position;
                    ImgbPatchData imgb = disposables.Add(ImgbPatchData.ReadFrom(br));
                    foreach (KeyValuePair<string, SafeUnmanagedArray> data in imgb)
                        source.RegisterStream(Path.Combine(imgb.XgrArchiveUnpackName, data.Key), data.Value.OpenStream(FileAccess.Read));
                    OnProgress(br.BaseStream.Position - position);
                    if (CancelEvent.IsSet())
                        return;
                }

                UiArchiveTreeBuilder builder = new UiArchiveTreeBuilder(gameLocation);
                UiArchives archives = builder.Build();
                Position = 0;
                Maximum = archives.Count;
                foreach (UiContainerNode archive in archives)
                {
                    Check(archive);
                    OnProgress(1);
                }

                if (CancelEvent.IsSet())
                    return;

                IUiLeafsAccessor[] accessors = archives.AccessToCheckedLeafs(new Wildcard("*"), null, false).ToArray();
                Position = 0;
                Maximum = accessors.Length;

                UiInjectionManager manager = new UiInjectionManager();
                foreach (IUiLeafsAccessor accessor in accessors)
                {
                    accessor.Inject(source, manager);
                    OnProgress(1);
                }
                manager.WriteListings();
            }
        }