job scheduler works with run once and run periodic schedules. Stop logic is not fully thought through.
Dependents: JobSchedulerDemo Borsch
Diff: scheduler.cpp
- Revision:
- 10:8cff30b5b90d
- Parent:
- 9:ee21cd055a97
- Child:
- 12:684ddfc57199
--- a/scheduler.cpp Thu Jul 13 20:01:07 2017 +0000 +++ b/scheduler.cpp Thu Jul 13 23:07:09 2017 +0000 @@ -64,7 +64,7 @@ Response<JobID> Scheduler::JobAdd(JobTypeID jobTID, ISchedule *schedule, IJobData *data) { Appointment *apt = new Appointment(jobTID, schedule, data, time_t(0)); if (NULL == apt) { - tr_debug("[JobAdd] failed to allocate appointment\n"); + tr_error("[JobAdd] failed to allocate appointment"); return Response<JobID>(1, 0); } return this->reschedule(apt); @@ -78,26 +78,26 @@ apt->SetTime(apt->GetJob()->GetSchedule()->NextRunTime(now)); if (apt->GetTime() == 0) { // there is no next run time; delete appointment - tr_debug("[reschedule] NO next appointment\n"); + tr_debug("[reschedule] NO next appointment"); delete apt; req.response.error = 2; return req.response; } - tr_debug("[reschedule] put\n"); + tr_debug("[reschedule] put"); _updates.put(&req); - tr_debug("[reschedule] get\n"); + tr_debug("[reschedule] get"); // default is wait forever osEvent evt = req.resQueue.get(); if (evt.status == osEventMessage) { if (evt.value.p != NULL) { - tr_debug("[reschedule] completed ok\n"); + tr_debug("[reschedule] completed ok"); } else { - tr_debug("[reschedule] NOT added (C1)\n"); + tr_error("[reschedule] NOT added (C1)"); } } else { // not sure what condition is - tr_debug("[reschedule] NOT added (C2)\n"); + tr_error("[reschedule] NOT added (C2)"); delete apt; apt = NULL; } @@ -116,14 +116,14 @@ void Scheduler::updateHandler() { while (!_quitUpdater) { - tr_debug("[updateHandler] waiting for action\n"); + tr_debug("[updateHandler] waiting for action"); // wait forever ... osEvent evt = _updates.get(); if (evt.status == osEventMessage) { - tr_debug("[updateHandler] process action\n"); + tr_debug("[updateHandler] process action"); this->process((Action*)evt.value.p); } else { - tr_debug("[updateHandler] NOT osEventMessage\n"); + tr_error("[updateHandler] NOT osEventMessage"); } } } @@ -133,7 +133,7 @@ time_t now = time(NULL); // now in seconds switch(action->type) { case JobAddAT: { - tr_debug("[process] JobAddAT\n"); + tr_debug("[process] JobAddAT"); JobAddReq *req = static_cast<JobAddReq*>(action); Job *job = req->apt->GetJob(); if (job->GetID() == 0) { @@ -142,30 +142,30 @@ } node<Appointment> *tmp = _timeline.insertOrdered(req->apt, descendingTimeline); if (NULL == tmp) { - tr_debug("[process] timeline insert failed\n"); + tr_error("[process] timeline insert failed"); action->resQueue.put(NULL); // internal state has not changed return; } req->response.data = job->GetID(); - //tr_debug("[process] simulate error\n"); + //tr_debug("[process] simulate error"); //action->resQueue.put(NULL); action->resQueue.put(&req->response); break; } case JobRunAT: { - tr_debug("[process] JobRunAT\n"); + tr_debug("[process] JobRunAT"); // execute job run logic after switch break; } case JobQuitAT: { - tr_debug("[process] JobQuitAT\n"); + tr_debug("[process] JobQuitAT"); action->resQueue.put(NULL); _quitUpdater = true; return; } default: - tr_debug("[process] unknown action type\n"); + tr_warn("[process] unknown action type"); action->resQueue.put(NULL); } node<Appointment> *wakeNode = _timeline.pop(1); @@ -174,11 +174,11 @@ if (now < wakeApt->GetTime()) { // request wake up time_t sleepTime = wakeApt->GetTime() - now; - tr_debug("[process] job %d wake up in %d seconds\n", wakeJob->GetID(), sleepTime); + tr_debug("[process] job %d wake up in %d seconds", wakeJob->GetID(), sleepTime); WakeOnce.attach(callback(this, &Scheduler::onWakeOnce), sleepTime); } else { // process job - tr_debug("[process] job ID %d ready to run\n", wakeJob->GetID()); + tr_debug("[process] job ID %d ready to run", wakeJob->GetID()); _timeline.remove(1); _runs.put(wakeApt); } @@ -186,31 +186,31 @@ void Scheduler::runHandler() { while (!_quitRunner) { - tr_debug("[runHandler] waiting for action\n"); + tr_debug("[runHandler] waiting for action"); // wait forever ... osEvent evt = _runs.get(); if (evt.status == osEventMessage) { - tr_debug("[runHandler] run action\n"); + tr_debug("[runHandler] run action"); Appointment *apt = (Appointment*)evt.value.p; if (NULL == apt) { - tr_debug("[runHandler] quit requested\n"); + tr_debug("[runHandler] quit requested"); _quitRunner = true; break; } Job *job = apt->GetJob(); - JobType *f = _jobService->GetJob(job->GetTypeID()); - if (f == NULL) { - tr_debug("[runHandler] NO FUNC for job type id %d\n", job->GetTypeID()); + JobType *jt = _jobService->GetJob(job->GetTypeID()); + if (jt == NULL) { + tr_error("[runHandler] NO FUNC for job type id %d", job->GetTypeID()); // NO reschedule delete apt; continue; } - tr_debug("Job Started\n"); - f->RunJob(); - tr_debug("Job Finished\n"); + tr_debug("Job Started"); + jt->RunJob(); + tr_debug("Job Finished"); this->reschedule(apt); } else { - tr_debug("[runHandler] NOT osEventMessage\n"); + tr_error("[runHandler] NOT osEventMessage"); } } }