diff --git a/backends/twitter/ThreadPool.h b/backends/twitter/ThreadPool.h new file mode 100644 index 0000000000000000000000000000000000000000..6f498afaa1e5019f9a0b1d50c8b095962c0fbe20 --- /dev/null +++ b/backends/twitter/ThreadPool.h @@ -0,0 +1,74 @@ +#ifndef THREAD_POOL +#define THREAD_POOL + +#include +#include +#include +#include +#include +#include "transport/logging.h" +#include "Swiften/Swiften.h" + + +/* + * Thread serves as a base class for any code that has to be excuted as a thread + * by the ThreadPool class. The run method defines the code that has to be run + * as a theard. For example, code in run could be sendinga request to a server + * waiting for the response and storing the response. When the thread finishes + * execution, the ThreadPool invokes finalize where one could have the code necessary + * to collect all the responses and release any resources. + * + * NOTE: The object of the Thread class must be valid (in scope) throughout the + * execution of the thread. + */ + +class Thread +{ + int threadID; + + public: + + Thread() {} + virtual ~Thread() {} + virtual void run() = 0; + virtual void finalize() {} + int getThreadID() {return threadID;} + void setThreadID(int tid) {threadID = tid;} +}; + +/* + * ThreadPool provides the interface to manage a pool of threads. It schedules jobs + * on free threads and when the thread completes it automatically deletes the object + * corresponding to a Thread. If free threads are not available, the requests are + * added to a queue and scheduled later when threads become available. + */ + +class ThreadPool +{ + const int MAX_THREADS; + int activeThreads; + std::queue freeThreads; + + std::queue requestQueue; + boost::thread **worker; + + boost::mutex count_lock; + boost::mutex pool_lock; + boost::mutex criticalregion; + Swift::EventLoop *loop; + + boost::signals2::signal < void () > onWorkerAvailable; + + public: + ThreadPool(Swift::EventLoop *loop, int maxthreads); + ~ThreadPool(); + void runAsThread(Thread *t); + int getActiveThreadCount(); + void updateActiveThreadCount(int k); + void cleandUp(Thread *, int); + void scheduleFromQueue(); + int getFreeThread(); + void releaseThread(int i); +}; + +#endif