jobs.patch
uppsrc/Skylark/App.cpp (working copy) | ||
---|---|---|
186 | 186 |
main_pid = getpid(); |
187 | 187 |
quit = false; |
188 | 188 |
|
189 |
if(jobs.GetCount()){ |
|
190 |
jobThreadActive = true; |
|
191 |
Thread::Start(callback(this, &SkylarkApp::JobThread)); |
|
192 |
} |
|
193 |
|
|
189 | 194 |
IpAddrInfo ipinfo; |
190 | 195 |
ipinfo.Execute(ip, port, IpAddrInfo::FAMILY_IPV4); |
191 | 196 |
// addrinfo *addr = ipinfo.GetResult(); |
... | ... | |
310 | 315 |
prefork = Ini::prefork; |
311 | 316 |
timeout = Ini::timeout; |
312 | 317 |
caching = Ini::caching; |
318 |
jobThreadActive = false; |
|
313 | 319 |
} |
314 | 320 | |
315 | 321 |
SkylarkApp::~SkylarkApp() |
uppsrc/Skylark/Jobs.cpp (working copy) | ||
---|---|---|
1 |
#include "Skylark.h" |
|
2 | ||
3 |
namespace Upp { |
|
4 | ||
5 |
SkylarkApp& SkylarkApp::AddJob(Callback cb, int period) |
|
6 |
{ |
|
7 |
ASSERT(!jobThreadActive); |
|
8 |
if(!jobThreadActive) |
|
9 |
jobs.Add(JobInfo(cb, period)); |
|
10 |
return *this; |
|
11 |
} |
|
12 | ||
13 |
void SkylarkApp::JobThread() |
|
14 |
{ |
|
15 |
SKYLARKLOG("Job thread started"); |
|
16 |
for(;;) { |
|
17 |
if(quit) |
|
18 |
break; |
|
19 |
Time now = GetSysTime(); |
|
20 |
for(int i = 0; i < jobs.GetCount(); i++){ |
|
21 |
if (jobs[i].next <= now){ |
|
22 |
SKYLARKLOG("Executing job #"<<i); |
|
23 |
jobs[i].cb.Execute(); |
|
24 |
jobs[i].next = now + jobs[i].period; |
|
25 |
break; |
|
26 |
} |
|
27 |
} |
|
28 |
now = GetSysTime(); |
|
29 |
Time next = now + 60; |
|
30 |
for(int i = 0; i < jobs.GetCount(); i++) |
|
31 |
next = min(jobs[i].next, next); |
|
32 |
if (next>now) |
|
33 |
Sleep((next-now)*1000); |
|
34 |
} |
|
35 |
SKYLARKLOG("Job thread finished"); |
|
36 |
} |
|
37 | ||
38 |
} |
uppsrc/Skylark/Skylark.h (working copy) | ||
---|---|---|
71 | 71 | |
72 | 72 |
void FinalizeViews(); |
73 | 73 | |
74 |
struct JobInfo : Moveable<JobInfo> { |
|
75 |
int period; |
|
76 |
Callback cb; |
|
77 |
Time next; |
|
78 |
JobInfo(Callback cb, int period) : period(period), cb(cb), next(0) {} |
|
79 |
}; |
|
80 | ||
81 |
Vector<JobInfo> jobs; |
|
82 |
bool jobThreadActive; |
|
83 |
void JobThread(); |
|
84 | ||
74 | 85 |
static SkylarkApp *app; |
75 | 86 | |
76 | 87 |
#ifdef PLATFORM_WIN32 |
... | ... | |
91 | 102 |
virtual void BadRequest(Http& http, const BadRequestExc& e); |
92 | 103 |
virtual void TemplateError(Http& http, const TemplateExc& e); |
93 | 104 | |
105 |
SkylarkApp& AddJob(Callback cb, int period); |
|
106 | ||
94 | 107 |
virtual void WorkThread(); |
95 | 108 |
|
96 | 109 |
void RunThread(); |
uppsrc/Skylark/Skylark.upp (working copy) | ||
---|---|---|
17 | 17 |
Http.cpp, |
18 | 18 |
Session.cpp, |
19 | 19 |
Dispatch.cpp, |
20 |
Jobs.cpp, |
|
20 | 21 |
StdLib.icpp, |
21 | 22 |
Util readonly separator, |
22 | 23 |
Static.icpp, |