| loop_job.c | loop_job.c | |||
|---|---|---|---|---|
| skipping to change at line 33 | skipping to change at line 33 | |||
| #include <qb/qbdefs.h> | #include <qb/qbdefs.h> | |||
| #include <qb/qblist.h> | #include <qb/qblist.h> | |||
| #include <qb/qbloop.h> | #include <qb/qbloop.h> | |||
| #include "loop_int.h" | #include "loop_int.h" | |||
| struct qb_loop_job { | struct qb_loop_job { | |||
| struct qb_loop_item item; | struct qb_loop_item item; | |||
| qb_loop_job_dispatch_fn dispatch_fn; | qb_loop_job_dispatch_fn dispatch_fn; | |||
| }; | }; | |||
| static void job_dispatch(struct qb_loop_item * item, | static void | |||
| enum qb_loop_priority p) | job_dispatch(struct qb_loop_item *item, enum qb_loop_priority p) | |||
| { | { | |||
| struct qb_loop_job *job = qb_list_entry(item, struct qb_loop_job, it em); | struct qb_loop_job *job = qb_list_entry(item, struct qb_loop_job, it em); | |||
| job->dispatch_fn(job->item.user_data); | job->dispatch_fn(job->item.user_data); | |||
| free(job); | free(job); | |||
| // this is a one-shot so don't re-add | /* | |||
| * this is a one-shot so don't re-add | ||||
| */ | ||||
| } | } | |||
| static int32_t get_more_jobs(struct qb_loop_source* s, int32_t ms_timeout) | static int32_t | |||
| get_more_jobs(struct qb_loop_source *s, int32_t ms_timeout) | ||||
| { | { | |||
| int32_t p; | int32_t p; | |||
| int32_t new_jobs = 0; | int32_t new_jobs = 0; | |||
| // this is simple, move jobs from wait_head to job_head | /* | |||
| * this is simple, move jobs from wait_head to job_head | ||||
| */ | ||||
| for (p = QB_LOOP_LOW; p <= QB_LOOP_HIGH; p++) { | for (p = QB_LOOP_LOW; p <= QB_LOOP_HIGH; p++) { | |||
| if (!qb_list_empty(&s->l->level[p].wait_head)) { | if (!qb_list_empty(&s->l->level[p].wait_head)) { | |||
| new_jobs += qb_list_length(&s->l->level[p].wait_head ); | new_jobs += qb_list_length(&s->l->level[p].wait_head ); | |||
| qb_list_splice(&s->l->level[p].wait_head, &s->l->lev | qb_list_splice(&s->l->level[p].wait_head, | |||
| el[p].job_head); | &s->l->level[p].job_head); | |||
| qb_list_init(&s->l->level[p].wait_head); | qb_list_init(&s->l->level[p].wait_head); | |||
| } | } | |||
| } | } | |||
| return new_jobs; | return new_jobs; | |||
| } | } | |||
| struct qb_loop_source * | struct qb_loop_source * | |||
| qb_loop_jobs_create(struct qb_loop *l) | qb_loop_jobs_create(struct qb_loop *l) | |||
| { | { | |||
| struct qb_loop_source *s = malloc(sizeof(struct qb_loop_source)); | struct qb_loop_source *s = malloc(sizeof(struct qb_loop_source)); | |||
| if (s == NULL) { | ||||
| return NULL; | ||||
| } | ||||
| s->l = l; | s->l = l; | |||
| s->dispatch_and_take_back = job_dispatch; | s->dispatch_and_take_back = job_dispatch; | |||
| s->poll = get_more_jobs; | s->poll = get_more_jobs; | |||
| return s; | return s; | |||
| } | } | |||
| void qb_loop_jobs_destroy(struct qb_loop *l) | void | |||
| qb_loop_jobs_destroy(struct qb_loop *l) | ||||
| { | { | |||
| free(l->job_source); | free(l->job_source); | |||
| } | } | |||
| int32_t qb_loop_job_add(struct qb_loop *l, | int32_t | |||
| enum qb_loop_priority p, | qb_loop_job_add(struct qb_loop *l, | |||
| void *data, | enum qb_loop_priority p, | |||
| qb_loop_job_dispatch_fn dispatch_fn) | void *data, qb_loop_job_dispatch_fn dispatch_fn) | |||
| { | { | |||
| struct qb_loop_job *job; | struct qb_loop_job *job; | |||
| if (l == NULL || dispatch_fn == NULL) { | if (l == NULL || dispatch_fn == NULL) { | |||
| return -EINVAL; | return -EINVAL; | |||
| } | } | |||
| if (p < QB_LOOP_LOW || p > QB_LOOP_HIGH) { | if (p < QB_LOOP_LOW || p > QB_LOOP_HIGH) { | |||
| return -EINVAL; | return -EINVAL; | |||
| } | } | |||
| job = malloc(sizeof(struct qb_loop_job)); | job = malloc(sizeof(struct qb_loop_job)); | |||
| if (job == NULL) { | ||||
| return -ENOMEM; | ||||
| } | ||||
| job->dispatch_fn = dispatch_fn; | job->dispatch_fn = dispatch_fn; | |||
| job->item.user_data = data; | job->item.user_data = data; | |||
| job->item.source = l->job_source; | job->item.source = l->job_source; | |||
| qb_list_init(&job->item.list); | qb_list_init(&job->item.list); | |||
| qb_list_add_tail(&job->item.list, &l->level[p].wait_head); | qb_list_add_tail(&job->item.list, &l->level[p].wait_head); | |||
| return 0; | return 0; | |||
| } | } | |||
| End of changes. 9 change blocks. | ||||
| 12 lines changed or deleted | 24 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||