job scheduler works with run once and run periodic schedules. Stop logic is not fully thought through.
Dependents: JobSchedulerDemo Borsch
jobService.cpp@0:806403f3d0d1, 2017-07-11 (annotated)
- Committer:
- sgnezdov
- Date:
- Tue Jul 11 00:16:08 2017 +0000
- Revision:
- 0:806403f3d0d1
- Child:
- 9:ee21cd055a97
basic JobScheduler implementation with core producer - consumer thread safe design; functional, but really bare bones
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sgnezdov | 0:806403f3d0d1 | 1 | #include "jobService.h" |
sgnezdov | 0:806403f3d0d1 | 2 | |
sgnezdov | 0:806403f3d0d1 | 3 | namespace JobScheduler { |
sgnezdov | 0:806403f3d0d1 | 4 | |
sgnezdov | 0:806403f3d0d1 | 5 | jobFunc* JobType::Job() |
sgnezdov | 0:806403f3d0d1 | 6 | { |
sgnezdov | 0:806403f3d0d1 | 7 | return this->_job; |
sgnezdov | 0:806403f3d0d1 | 8 | } |
sgnezdov | 0:806403f3d0d1 | 9 | |
sgnezdov | 0:806403f3d0d1 | 10 | bool JobType::AscendingExcl(JobType *j2) |
sgnezdov | 0:806403f3d0d1 | 11 | { |
sgnezdov | 0:806403f3d0d1 | 12 | return this->_jobTypeID < j2->_jobTypeID; |
sgnezdov | 0:806403f3d0d1 | 13 | } |
sgnezdov | 0:806403f3d0d1 | 14 | |
sgnezdov | 0:806403f3d0d1 | 15 | bool JobType::IsEqual(JobType *j2) |
sgnezdov | 0:806403f3d0d1 | 16 | { |
sgnezdov | 0:806403f3d0d1 | 17 | return this->_jobTypeID == j2->_jobTypeID; |
sgnezdov | 0:806403f3d0d1 | 18 | } |
sgnezdov | 0:806403f3d0d1 | 19 | |
sgnezdov | 0:806403f3d0d1 | 20 | bool jtAscending(JobType *j1, JobType *j2) |
sgnezdov | 0:806403f3d0d1 | 21 | { |
sgnezdov | 0:806403f3d0d1 | 22 | return j1->AscendingExcl(j2); |
sgnezdov | 0:806403f3d0d1 | 23 | } |
sgnezdov | 0:806403f3d0d1 | 24 | |
sgnezdov | 0:806403f3d0d1 | 25 | bool jtIsEqual(JobType *j1, JobType *j2) |
sgnezdov | 0:806403f3d0d1 | 26 | { |
sgnezdov | 0:806403f3d0d1 | 27 | return j1->IsEqual(j2); |
sgnezdov | 0:806403f3d0d1 | 28 | } |
sgnezdov | 0:806403f3d0d1 | 29 | |
sgnezdov | 0:806403f3d0d1 | 30 | Error JobService::Register(int jobTypeID, jobFunc *job) |
sgnezdov | 0:806403f3d0d1 | 31 | { |
sgnezdov | 0:806403f3d0d1 | 32 | JobType *jt = new JobType(jobTypeID, job); |
sgnezdov | 0:806403f3d0d1 | 33 | node<JobType> *tmp = _jobs.insertOrdered(jt, jtAscending); |
sgnezdov | 0:806403f3d0d1 | 34 | if (NULL == tmp) { |
sgnezdov | 0:806403f3d0d1 | 35 | error("[JobService::Register] failed to insertOrdered"); |
sgnezdov | 0:806403f3d0d1 | 36 | return Error(1); |
sgnezdov | 0:806403f3d0d1 | 37 | } |
sgnezdov | 0:806403f3d0d1 | 38 | return NoError; |
sgnezdov | 0:806403f3d0d1 | 39 | } |
sgnezdov | 0:806403f3d0d1 | 40 | |
sgnezdov | 0:806403f3d0d1 | 41 | jobFunc* JobService::GetJob(int jobTypeID) |
sgnezdov | 0:806403f3d0d1 | 42 | { |
sgnezdov | 0:806403f3d0d1 | 43 | JobType search = JobType(jobTypeID, NULL); |
sgnezdov | 0:806403f3d0d1 | 44 | node<JobType> *found = _jobs.pop(&search, jtIsEqual); |
sgnezdov | 0:806403f3d0d1 | 45 | if (found == NULL) { |
sgnezdov | 0:806403f3d0d1 | 46 | return NULL; |
sgnezdov | 0:806403f3d0d1 | 47 | } |
sgnezdov | 0:806403f3d0d1 | 48 | return found->data->Job(); |
sgnezdov | 0:806403f3d0d1 | 49 | } |
sgnezdov | 0:806403f3d0d1 | 50 | |
sgnezdov | 0:806403f3d0d1 | 51 | } // end of namespace |