1 /* 2 * Copyright 2017 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can 5 * be found in the LICENSE file. 6 * 7 */ 8 9 #pragma once 10 11 // 12 // FIXME -- make the scheduler even more lightweight than it is. Move 13 // to an idiom where the scheduled task brings its own state instead 14 // of relying on an internal table. This will make it possible to 15 // reliably report the task's lifecycle and terminating state. 16 // 17 18 #include "types.h" 19 20 // 21 // 22 // 23 24 #define SKC_SCHEDULER_SCHEDULE(s,c,d) skc_scheduler_schedule(s,c,d,#c) 25 26 #ifndef NDEBUG 27 28 #include <stdio.h> 29 30 #define SKC_SCHEDULER_WAIT_WHILE(s,p) \ 31 while (p) { \ 32 fprintf(stderr,"WAITING ON: " #p "\n"); \ 33 skc_scheduler_wait(s); \ 34 } 35 #else 36 #define SKC_SCHEDULER_WAIT_WHILE(s,p) \ 37 while (p) { \ 38 skc_scheduler_wait(s); \ 39 } 40 #endif 41 42 // 43 // 44 // 45 46 #ifndef NDEBUG 47 #define SKC_CL_CB(s) fprintf(stderr,"CB+ %s = %d\n",__func__,s) 48 #else 49 #include <stdio.h> 50 #define SKC_CL_CB(s) 51 #endif 52 53 // 54 // 55 // 56 57 #define SKC_SCHEDULER_COMMAND_INVALID SKC_UINT_MAX 58 59 typedef skc_uint skc_scheduler_command_t; 60 61 typedef void (* skc_scheduler_command_pfn)(void * data); 62 63 // 64 // 65 // 66 67 struct skc_scheduler * 68 skc_scheduler_create(struct skc_runtime * const runtime, skc_uint const size); 69 70 void 71 skc_scheduler_dispose(struct skc_runtime * const runtime, 72 struct skc_scheduler * const scheduler); 73 74 75 // 76 // 77 // 78 79 skc_scheduler_command_t 80 skc_scheduler_schedule(struct skc_scheduler * const scheduler, 81 skc_scheduler_command_pfn const pfn, 82 void * data, 83 char const * const name); 84 85 // 86 // 87 // 88 89 skc_bool 90 skc_scheduler_yield(struct skc_scheduler * const scheduler); 91 92 void 93 skc_scheduler_wait(struct skc_scheduler * const scheduler); 94 95 void 96 skc_scheduler_wait_one(struct skc_scheduler * const scheduler); 97 98 // 99 // FIXME -- get rid of these 100 // 101 102 #if 0 103 104 skc_bool 105 skc_scheduler_wait_for(struct skc_scheduler * const scheduler, 106 skc_scheduler_command_t const command); 107 108 void 109 skc_thread_sleep(skc_ulong const msecs); 110 111 #endif 112 113 // 114 // 115 // 116