/*
* 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
//
//
//