/* Lecture_1/sleeptest.c
 * James S. Plank

Continuation-Based Thread Library - A non-preemptive, continuation-based thread library.
Copyright (C) 2009 James S. Plank

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

Original: October, 1995
Revised: January, 2009

James S. Plank
Department of Electrical Engineering and Computer Science
University of Tennessee
Knoxville, TN 37996
plank@cs.utk.edu
*/

#include <stdio.h>
#include <stdlib.h>
#include "cbthread.h"

long t0;

typedef struct tst {
  int counter;
  int tnum;
} Tst;

void thread(void *arg)
{
  Tst *t;
  int j;

  t = (Tst *) arg;

  if (t->counter == 5) cbthread_exit();
  j = random()%5;
  printf("%4d: Thread %d.  counter = %d.  Sleeping for %d seconds\n", 
         time(0)-t0, t->tnum, t->counter, j);
  t->counter++;
  cbthread_sleep(j, thread, t);
}

main()
{
  int i;
  Tst *t;

  srandom(40);
  t0 = time(0);

  for (i = 0; i < 5; i++) {
    t = (Tst *) malloc (sizeof(Tst));
    t->tnum = i;
    t->counter = 0;
    cbthread_fork(thread, t);
  }

  cbthread_exit();
}

