| /* |
| * Copyright 2017 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can |
| * be found in the LICENSE file. |
| * |
| */ |
| |
| #pragma once |
| |
| // |
| // FIXME -- make the scheduler even more lightweight than it is. Move |
| // to an idiom where the scheduled task brings its own state instead |
| // of relying on an internal table. This will make it possible to |
| // reliably report the task's lifecycle and terminating state. |
| // |
| |
| #include "types.h" |
| |
| // |
| // |
| // |
| |
| #define SKC_SCHEDULER_SCHEDULE(s,c,d) skc_scheduler_schedule(s,c,d,#c) |
| |
| #ifndef NDEBUG |
| |
| #include <stdio.h> |
| |
| #define SKC_SCHEDULER_WAIT_WHILE(s,p) \ |
| while (p) { \ |
| fprintf(stderr,"WAITING ON: " #p "\n"); \ |
| skc_scheduler_wait(s); \ |
| } |
| #else |
| #define SKC_SCHEDULER_WAIT_WHILE(s,p) \ |
| while (p) { \ |
| skc_scheduler_wait(s); \ |
| } |
| #endif |
| |
| // |
| // |
| // |
| |
| #ifndef NDEBUG |
| #define SKC_CL_CB(s) fprintf(stderr,"CB+ %s = %d\n",__func__,s) |
| #else |
| #include <stdio.h> |
| #define SKC_CL_CB(s) |
| #endif |
| |
| // |
| // |
| // |
| |
| #define SKC_SCHEDULER_COMMAND_INVALID SKC_UINT_MAX |
| |
| typedef skc_uint skc_scheduler_command_t; |
| |
| typedef void (* skc_scheduler_command_pfn)(void * data); |
| |
| // |
| // |
| // |
| |
| struct skc_scheduler * |
| skc_scheduler_create(struct skc_runtime * const runtime, skc_uint const size); |
| |
| void |
| skc_scheduler_dispose(struct skc_runtime * const runtime, |
| struct skc_scheduler * const scheduler); |
| |
| |
| // |
| // |
| // |
| |
| skc_scheduler_command_t |
| skc_scheduler_schedule(struct skc_scheduler * const scheduler, |
| skc_scheduler_command_pfn const pfn, |
| void * data, |
| char const * const name); |
| |
| // |
| // |
| // |
| |
| skc_bool |
| skc_scheduler_yield(struct skc_scheduler * const scheduler); |
| |
| void |
| skc_scheduler_wait(struct skc_scheduler * const scheduler); |
| |
| void |
| skc_scheduler_wait_one(struct skc_scheduler * const scheduler); |
| |
| // |
| // FIXME -- get rid of these |
| // |
| |
| #if 0 |
| |
| skc_bool |
| skc_scheduler_wait_for(struct skc_scheduler * const scheduler, |
| skc_scheduler_command_t const command); |
| |
| void |
| skc_thread_sleep(skc_ulong const msecs); |
| |
| #endif |
| |
| // |
| // |
| // |