using System.Collections.Concurrent; using Models.Handler; using Models.Model.Backend; namespace Backend.Handler; public class ThreadHandler { private readonly DbHandler _dbHandler; private readonly IpScanner _ipScanner; private readonly ContentFilter _contentFilter; private readonly IpFilterHandler _ipFilterHandler; private bool _ipScannerStopped; private bool _contentFilterStopped; private bool _ipFilterStopped; private bool _stage1 = false; private bool _stage2 = true; private bool _stage3 = false; ConcurrentQueue filteredQueue = new(); ConcurrentQueue discardedQueue = new(); ConcurrentQueue unfilteredQueue = new(); ConcurrentQueue scannerResumeQueue = new(); ConcurrentQueue preFilteredQueue = new(); public ThreadHandler(string path) { _dbHandler = new(filteredQueue, discardedQueue, unfilteredQueue, scannerResumeQueue, preFilteredQueue, path); _ipScanner = new(discardedQueue, scannerResumeQueue, _dbHandler, preFilteredQueue); _contentFilter = new(filteredQueue, unfilteredQueue, _dbHandler, path, this); _ipFilterHandler = new(discardedQueue, unfilteredQueue, preFilteredQueue, this); } public void Start() { Thread scanner = new(StartScanner); Thread ipFilter = new(StartIpFilter); Thread indexer = new(StartContentFilter); Thread database = new(StartDbHandler); Thread discarded = new(StartDiscardedDbHandler); Thread filtered = new(StartFilteredDbHandler); Thread resume = new(StartResumeDbHandler); Thread contentFilterThread = new(StartContentFilterThread); Thread prefilterDb = new(StartPreFilterDbHandler); Thread fillIpFilterQueue = new(StartFillIpFilterQueue); //Thread check = new(CheckQueue); //check.Start(); if (_stage1) { discarded.Start(); // de-queues from discardedQueue prefilterDb.Start(); // de-queues from preFilteredQueue scanner.Start(); // en-queues to discardedQueue and preFilteredQueue resume.Start(); // de-queues from resumeQueue scanner.Join(); Stop(); discarded.Join(); prefilterDb.Join(); resume.Join(); } if (_stage2) { database.Start(); // de-queues from unfilteredQueue discarded.Start(); // de-queues from discardedQueue ipFilter.Start(); // en-queues to discardedQueue and unfilteredQueue fillIpFilterQueue.Start(); // reads from preFiltered database, en-queues to preFilteredQueue ipFilter.Join(); Stop(); database.Join(); discarded.Join(); fillIpFilterQueue.Join(); } if (_stage3) { filtered.Start(); // de-queues from filteredQueue database.Start(); // de-queues from unfilteredQueue indexer.Start(); // en-queues to unfilteredQueue and contentQueue contentFilterThread.Start(); // de-queues from contentQueue, en-queues to filteredQueue contentFilterThread.Join(); filtered.Join(); database.Join(); indexer.Join(); } } private void CheckQueue() { while (true) { Console.Clear(); Console.WriteLine($"filteredQueue.Count: {filteredQueue.Count}"); Console.WriteLine($"discardedQueue.Count: {discardedQueue.Count}"); Console.WriteLine($"unfilteredQueue.Count: {unfilteredQueue.Count}"); Console.WriteLine($"scannerResumeQueue.Count: {scannerResumeQueue.Count}"); Console.WriteLine($"preFilteredQueue.Count: {preFilteredQueue.Count}"); Thread.Sleep(5); } } private void StartScanner() { Thread.Sleep(15000); // Let the database handler instantiate and warm up first. List wait = _ipScanner.Start(256); for (int i = 0; i < wait.Count; i++) { WaitHandle.WaitAll(wait[i]); } Console.WriteLine("Scanner finished"); } private void StartContentFilter() { Thread.Sleep(5000); WaitHandle[] wait = _contentFilter.Start(); WaitHandle.WaitAll(wait); Console.WriteLine("Content filter finished"); _contentFilterStopped = true; } private void StartContentFilterThread() { WaitHandle[] wait = _contentFilter.StartFilterThread(8); WaitHandle.WaitAll(wait); } private void StartFillIpFilterQueue() { _dbHandler.GetPreFilterQueueItem(); } private void StartIpFilter() { Thread.Sleep(1000); List wait = _ipFilterHandler.Start(1024); for (int i = 0; i < wait.Count; i++) { WaitHandle.WaitAll(wait[i]); } Console.WriteLine("Ip filter finished"); _ipFilterStopped = true; } private void StartDbHandler() { _dbHandler.UnfilteredDbHandler(); } private void StartFilteredDbHandler() { _dbHandler.FilteredDbHandler(); } private void StartPreFilterDbHandler() { _dbHandler.PrefilteredDbHandler(); } private void StartResumeDbHandler() { _dbHandler.ResumeDbHandler(); } private void StartDiscardedDbHandler() { WaitHandle[] wait = _dbHandler.Start(4); WaitHandle.WaitAll(wait); Console.WriteLine("Discarded DbHandler finished"); } public void Stop() { Console.WriteLine("Stopping..."); _ipScanner.Stop(); _contentFilter.Stop(); _ipFilterHandler.Stop(); Console.WriteLine("Stopping Extra..."); Thread.Sleep(30_000); Console.WriteLine("Stopping Super Extra..."); _dbHandler.Stop(); Console.WriteLine("Stopped."); } }