diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/include/mash/ThreadPool.h @ 69:33d812a61356

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 17:55:14 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/include/mash/ThreadPool.h	Tue Mar 18 17:55:14 2025 -0400
@@ -0,0 +1,66 @@
+// Copyright © 2015, Battelle National Biodefense Institute (BNBI);
+// all rights reserved. Authored by: Brian Ondov, Todd Treangen,
+// Sergey Koren, and Adam Phillippy
+//
+// See the LICENSE.txt file included with this software for license information.
+
+#ifndef ThreadPool_h
+#define ThreadPool_h
+
+#include <pthread.h>
+#include <queue>
+
+template <class TypeInput, class TypeOutput>
+class ThreadPool
+{
+public:
+    
+    ThreadPool(TypeOutput * (* functionNew)(TypeInput *), unsigned int threadCountNew);
+    ~ThreadPool();
+    
+    bool outputAvailable() const;
+    TypeOutput * popOutputWhenAvailable(); // output must be deleted by calling function
+    bool running() const;
+    void runWhenThreadAvailable(TypeInput * input); // thread deletes input when finished
+    void runWhenThreadAvailable(TypeInput * input, TypeOutput * (* functionNew)(TypeInput *)); // thread deletes input when finished
+    
+private:
+    
+    struct OutputQueueNode
+    {
+        // used to preserve input order when outputting
+        
+        OutputQueueNode * prev;
+        OutputQueueNode * next;
+        
+        TypeOutput * output;
+        bool ready;
+    };
+    
+    unsigned int threadCount;
+    
+    pthread_t * threads;
+    
+    static void * thread(void *);
+    
+    TypeOutput * (* function)(TypeInput *);
+    TypeInput * inputCurrent;
+    OutputQueueNode * outputQueueNodeCurrent;
+    
+    pthread_mutex_t * mutexInput;
+    pthread_mutex_t * mutexOutput;
+    
+    pthread_cond_t * condInput;
+    pthread_cond_t * condOutput;
+    
+    OutputQueueNode * outputQueueHead;
+    OutputQueueNode * outputQueueTail;
+    
+    bool finished;
+    friend void * thread(void *);
+};
+
+
+#include "ThreadPool.hxx"
+
+#endif