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(); }
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)); } }
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); }
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); }
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(); } }
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); }
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(); } }
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); } }
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(); } }
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)); }
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(); }
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(); } }