#include <stdio.h>
#include <unistd.h>

#include "mythread.h"

void f(int param);
void g(int param);

mythread_t mythread_f;
mythread_t mythread_g;

int main()
{
    mythread_init(SCHED_RR);

    mythread_f = mythread_create((mythread_func)f,(void*)11,0);
    mythread_g = mythread_create((mythread_func)g,(void*)15,0);

    mythread_yield();

    printf("De volta a thread principal, nao devia acontecer.\n");

    return 0;
}

#define ZZZZZ 100000

void f(int param)
{
  int i=0;

  printf("Em f pela primeira vez: param=%d\n",param);

  /* Identifica a execucao, espera um segundo, muda de contexto salvando o corrente */
  while (1){
    printf("  f (%d)\n",i);
    usleep(ZZZZZ);
    if ((i%2)==0) {
        printf("  f -> suspend\n");
        mythread_suspend();
        printf("  f -> ativa de novo\n");
    } else {
        // printf("  f -> yield\n");
        mythread_yield();
    }
    ++i;
  }
}

void g(int param)
{
  int i=0;

  printf("Em g pela primeira vez: param=%d\n",param);

  /* Identifica a execucao, espera um segundo, muda de contexto salvando o corrente */
  while (1){
    printf("  g (%d)\n",i);
    usleep(ZZZZZ);
    if ((i%4)==0) {
        // printf("  g -> reactivate(f):");
        if (mythread_reactivate(mythread_f)) {
        //     printf(" bem-sucedido\n");
        } else {
        //     printf(" desnecessario\n");
        }
    }
    // printf("  g -> yield\n");
    mythread_yield();
    ++i;
  }
}