home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
POINT Software Programming
/
PPROG1.ISO
/
c
/
snippets
/
krnldemo.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
3KB
|
148 lines
/*
** public domain demo of cooperative multitasking using function pointers
** written 29 Nov, 1992
** by David Gersic
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAX_TASKS 32 /* maximum number of runable tasks */
/* global variables */
void (*tasks[MAX_TASKS])(void); /* pointer to list of tasks to run */
/* prototypes */
int schedule(void (*fp)(void)); /* add function to the task list */
int mark(void (*fp)(void)); /* mark task in list */
int kill(void (*fp)(void)); /* remove function from task list */
void dispatcher(void); /* dispatch a task */
int set_up(void); /* initialization code */
int terminate(void); /* shutdown code */
int main(void)
{
void walk_the_dog(void);
void floss_the_cat(void);
void make_the_donuts(void);
if(set_up())
{
fputs("Initialization failed. Exiting.\n",stderr);
exit(1);
}
if(schedule(walk_the_dog))
fputs("Could not add new function to task list.\n",stderr);
if(schedule(floss_the_cat))
fputs("Could not add new function to task list.\n",stderr);
if(schedule(make_the_donuts))
fputs("Could not add new function to task list.\n",stderr);
while(!kbhit()) /* run 'till key hit */
dispatcher();
if(terminate())
{
fputs("Error while shutting down.\n",stderr);
exit(1);
}
return(0);
}
/*
** initialize task buffer and any other 'internal' setup code
*/
int set_up(void)
{
memset(tasks, 0x00, sizeof(tasks));
return(0);
}
/*
** kill any tasks still in the table and shut down
*/
int terminate(void)
{
int i;
for(i = 0; i < MAX_TASKS; i++)
{
if (tasks[i])
kill(tasks[i]);
}
return(0);
}
/*
** dispatch the next runable task
*/
void dispatcher(void)
{
static int i = 0;
if(tasks[i])
tasks[i]();
i = (i + 1) % MAX_TASKS;
}
/*
** add task to the list of runnable tasks
*/
int schedule(void (*fp)(void))
{
int i;
for (i = 0; i < MAX_TASKS && tasks[i]; i++)
; /* find a open slot in the table */
if (i < MAX_TASKS) /* if not end of table */
tasks[i] = fp; /* add task to list */
else return(1);
return(0);
}
/*
** remove a task from the list of runnable tasks
*/
int kill(void (*fp)(void))
{
int i;
for (i = 0; i < MAX_TASKS; i++)
{
if (tasks[i] == fp)
{
tasks[i] = NULL;
return(0);
}
}
return(1);
}
void walk_the_dog(void)
{
puts("dog");
return;
}
void floss_the_cat(void)
{
puts("cat");
return;
}
void make_the_donuts(void)
{
puts("donuts");
return;
}