ultimatepp/bazaar/WorkQueue/WorkQueue.h

77 lines
1.2 KiB
C++

#ifndef _WorkQueue_WorkQueue_h_
#define _WorkQueue_WorkQueue_h_
#include <Core/Core.h>
using namespace Upp;
namespace MyWQ
{
#ifdef _MULTITHREADED
class WorkQueue : NoCopy {
struct MJob
: public Link<MJob>
, Moveable<MJob>
{
Callback cb;
WorkQueue *work;
MJob() : work(NULL) {}
};
struct Pool {
typedef Pool CLASSNAME;
//Vector<MJob> jobs;
LinkOwner<MJob> _jobs;
int jobcount;
MJob & NextFree();
Link<MJob> * lastjob;
int waiting_threads;
Array<Thread> threads;
CriticalSection lock;
Semaphore waitforjob;
Pool(int threadnr = -1);
~Pool();
bool DoJob();
void ThreadRun(int tno);
};
friend struct Pool;
//static Pool& pool();
Pool _pool;
Pool& pool();
Semaphore waitforfinish;
int todo;
public:
void Do(Callback cb);
WorkQueue& operator&(Callback cb) { Do(cb); return *this; }
void Finish();
WorkQueue();
~WorkQueue();
};
#else
class WorkQueue : NoCopy {
public:
void Do(Callback cb) { cb(); }
WorkQueue& operator&(Callback cb) { cb(); return *this; }
void Finish() {}
};
#endif
} //namespace
#endif