home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / SUPP / TASKS.CPP < prev   
C/C++ Source or Header  |  1992-12-07  |  2KB  |  75 lines

  1. /* Very simple, non-preemptive, multitasking system
  2.    with round-robin scheduling */
  3.  
  4. /* Written by Bernie Roehl, June 1992 */
  5.  
  6. /* Copyright 1992 by Dave Stampe and Bernie Roehl.
  7.    May be freely used to write software for release into the public domain;
  8.    all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  9.    for permission to incorporate any part of this software into their
  10.    products!
  11.  */
  12.  
  13. #include <stdio.h>
  14. #include <alloc.h>  /* malloc() */
  15. #include "rend386.hpp"  /* for current_time() */
  16. #include "tasks.hpp"
  17.  
  18. #include "isr.hpp"
  19.  
  20. static TASK *current_task = NULL;
  21.  
  22. TASK *get_current_task()
  23. {
  24.     return current_task;
  25. }
  26.  
  27. TASK *add_task(TASK **tasklist, void (*fn)(int, void *, long, long), long period, void *param)
  28. {
  29.     TASK *t;
  30.     if ((t = (TASK *)malloc(sizeof(TASK))) == NULL) return NULL;
  31.     t->fn = fn; 
  32.     t->data = NULL; 
  33.     t->period = period;
  34.     t->lastran = 0L; 
  35.     t->wakeup = segaISR::currentTime();
  36.     t->next = *tasklist;
  37.     current_task = *tasklist = t;
  38.     if (fn) (*fn)(0, param, segaISR::currentTime(), period); /* initialize */
  39.     return t;
  40. }
  41.  
  42. void del_task(TASK **tasklist, TASK *tsk)
  43. {
  44.     TASK *t;
  45.     if (tsk == NULL) return;
  46.     if (tsk == *tasklist)
  47.         *tasklist = tsk->next;
  48.     else
  49.         for (t = *tasklist; t; t = t->next)
  50.         if (t->next == tsk) {
  51.             t->next = tsk->next;
  52.             break;
  53.         }
  54.     free(tsk);
  55. }
  56.  
  57. void *find_task_data(TASK *task)
  58. {
  59.     return &task->data;
  60. }
  61.  
  62. void run_tasks(TASK *tasklist)
  63. {
  64.     long now;
  65.     now = segaISR::currentTime();
  66.     for (current_task = tasklist; current_task; current_task = current_task->next) {
  67.         if (current_task->fn && (now >= current_task->wakeup)) {
  68.             current_task->wakeup = now + current_task->period;
  69.             current_task->fn(1, NULL, now, current_task->period);
  70.             current_task->lastran = now;
  71.         }
  72.     }
  73. }
  74.  
  75.