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, |