-
Notifications
You must be signed in to change notification settings - Fork 9
/
jobqueue.hpp
71 lines (55 loc) · 1.28 KB
/
jobqueue.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#ifndef __JOBQUEUE_HPP_
#define __JOBQUEUE_HPP_
#include "jobify.hpp"
#include <queue>
struct JobQueue
{
JobQueue() : current(NULL) {}
void queue(StatusJob *job)
{
wxMutexLocker lock(mutex);
list.push(job);
}
// Remove reference to a running job.
void unlink(StatusJob *job)
{
wxMutexLocker lock(mutex);
if(job == current)
current = NULL;
}
// This needs to be called regularly (from the main thread) to
// process queued jobs.
void update()
{
wxMutexLocker lock(mutex);
// Abort if there's already a job running
if(current && !current->isFinished())
return;
current = NULL;
// Are there any more jobs we could do?
while(!list.empty())
{
// Yup. Fetch the next task.
StatusJob *job = list.front();
list.pop();
// Has this job been aborted already?
if(job->abortRequested())
// Seems so. Try the next.
continue;
// Nope, we're good to go!
current = job;
job->run();
// Jobs may finish immediately
if(job->isFinished())
continue;
break;
}
}
private:
std::queue<StatusJob*> list;
StatusJob *current;
wxMutex mutex;
};
// More dodgy global variables, yay!
JobQueue jobQueue;
#endif