home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / c / snippets / krnldemo.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  3KB  |  148 lines

  1. /*
  2. ** public domain demo of cooperative multitasking using function pointers
  3. ** written 29 Nov, 1992
  4. ** by David Gersic
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <conio.h>
  11.  
  12. #define MAX_TASKS 32                /* maximum number of runable tasks  */
  13.  
  14. /* global variables */
  15.  
  16. void (*tasks[MAX_TASKS])(void);     /* pointer to list of tasks to run  */
  17.  
  18. /* prototypes */
  19.  
  20. int  schedule(void (*fp)(void));    /* add function to the task list    */
  21. int  mark(void (*fp)(void));        /* mark task in list                */
  22. int  kill(void (*fp)(void));        /* remove function from task list   */
  23. void dispatcher(void);              /* dispatch a task                  */
  24. int  set_up(void);                  /* initialization code              */
  25. int  terminate(void);               /* shutdown code                    */
  26.  
  27. int main(void)
  28. {
  29.       void walk_the_dog(void);
  30.       void floss_the_cat(void);
  31.       void make_the_donuts(void);
  32.  
  33.       if(set_up())
  34.       {
  35.             fputs("Initialization failed. Exiting.\n",stderr);
  36.             exit(1);
  37.       }
  38.  
  39.       if(schedule(walk_the_dog))
  40.             fputs("Could not add new function to task list.\n",stderr);
  41.       if(schedule(floss_the_cat))
  42.             fputs("Could not add new function to task list.\n",stderr);
  43.       if(schedule(make_the_donuts))
  44.             fputs("Could not add new function to task list.\n",stderr);
  45.  
  46.       while(!kbhit())  /* run 'till key hit */
  47.             dispatcher();
  48.  
  49.       if(terminate())
  50.       {
  51.             fputs("Error while shutting down.\n",stderr);
  52.             exit(1);
  53.       }
  54.       return(0);
  55. }
  56.  
  57. /*
  58. ** initialize task buffer and any other 'internal' setup code
  59. */
  60.  
  61. int set_up(void)
  62. {
  63.       memset(tasks, 0x00, sizeof(tasks));
  64.       return(0);
  65. }
  66.  
  67. /*
  68. ** kill any tasks still in the table and shut down
  69. */
  70.  
  71. int terminate(void)
  72. {
  73.       int i;
  74.  
  75.       for(i = 0; i < MAX_TASKS; i++)
  76.       {
  77.             if (tasks[i])
  78.                   kill(tasks[i]);
  79.       }
  80.       return(0);
  81. }
  82.  
  83. /*
  84. ** dispatch the next runable task
  85. */
  86.  
  87. void dispatcher(void)
  88. {
  89.       static int i = 0;
  90.  
  91.       if(tasks[i])
  92.             tasks[i]();
  93.       i = (i + 1) % MAX_TASKS;
  94. }
  95.  
  96. /*
  97. ** add task to the list of runnable tasks
  98. */
  99.  
  100. int schedule(void (*fp)(void))
  101. {
  102.       int i;
  103.  
  104.       for (i = 0; i < MAX_TASKS && tasks[i]; i++)
  105.             ;                       /* find a open slot in the table    */
  106.       if (i < MAX_TASKS)            /* if not end of table              */
  107.             tasks[i] = fp;          /* add task to list                 */
  108.       else  return(1);
  109.       return(0);
  110. }
  111.  
  112. /*
  113. ** remove a task from the list of runnable tasks
  114. */
  115.  
  116. int kill(void (*fp)(void))
  117. {
  118.       int i;
  119.  
  120.       for (i = 0; i < MAX_TASKS; i++)
  121.       {
  122.             if (tasks[i] == fp)
  123.             {
  124.                   tasks[i] = NULL;
  125.                   return(0);
  126.             }
  127.       }
  128.       return(1);
  129. }
  130.  
  131. void walk_the_dog(void)
  132. {
  133.       puts("dog");
  134.       return;
  135. }
  136.  
  137. void floss_the_cat(void)
  138. {
  139.       puts("cat");
  140.       return;
  141. }
  142.  
  143. void make_the_donuts(void)
  144. {
  145.       puts("donuts");
  146.       return;
  147. }
  148.