Jump to content
Fórum Script Brasil
  • 0

Sistema Operacional


Loco

Question

Estou com problemas na compilação desse codigo pois o mesmo precisa ser compilado em linux, não estou achando onde está o erro

Alguém pode me dar uma luz

TASK.H

#ifndef _TASKLIB_
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <ucontext.h>
#define STACKSIZE 16000

static int numTasks;
No ** pFirst = NULL;

typedef struct _No
{
    void *Conteudo;
    struct _No* pProximo;
} No;

typedef struct task_t
{
   ucontext_t ctxt;
   int taskID;
} task_t;

task_t Principal, *Corrente;

//Funções de lista encadeada
void AdicionaNoInicio ( No** pFirst , No* Novo_No );
void AdicionaNoFim ( No** pFirst , No* Novo_No );
void* ExcluirNo ( No* velhoNo );
No* RemoveNoInicio ( No** pFirst );
No* RemoveNoFim    ( No** pFirst );
No* CriaNo ( void* novoConteudo );

//Inicializa a tasklib
void task_init(); 

//Cria a tarefa
int task_create( task_t * task, void (*start_routine)(void*), void * arg );

//Termina a tarefa corrente
void task_exit( int exit_code );

//Suspende a tarefa corrente e ativa outra tarefa
int task_yield();

//Informa o identificador da tarefa corrente
int task_id();

#endif
TASK.C
#include "task.h"

//Função que inicializa nossa biblioteca
void task_init()
{ 
   
   numTasks = 0;
   
   getcontext( &( Principal.ctxt ) );

   Principal.taskID = numTasks;

   numTasks++;

   Corrente = &Principal;

   #ifdef DEBUG
      printf("task_init(): inicialização feita com sucesso.\n");
   #endif   

}

//Cria a tarefa
int task_create( task_t * task, void (*start_routine)(void*), void * arg )
{
   
   char* pilha;
   
   getcontext( &( task->ctxt ) );
   
   if( pilha = malloc( STACKSIZE ) )
     {

    ( task->ctxt ).uc_stack.ss_sp = pilha;//registrador que cuida onde o programa está nesse momento, onde está parado para continuar depois 
    
    ( task->ctxt ).uc_stack.ss_size = STACKSIZE;
    
    ( task->ctxt ).uc_stack.ss_flags = 0;
    
    ( task->ctxt ).uc_link = 0;
   
        makecontext( &( task->ctxt ), (void*) start_routine, 1, arg );// o contexto adquire corpo

        task->taskID = numTasks;
    
        numTasks++;

        #ifdef DEBUG
            printf("task_create: criou tarefa %i.\n", task->taskID);
        #endif
    

    AdicionaNoFim( &pFirst , CriaNo((void*) task) );

        return task->taskID;
  
   }
   
   else
     {
    
    #ifdef DEBUG
       printf("task_create: falha na criacao da tarefa %i.\n",task->taskID);
    #endif
    
    return -1;
    
     }
   
}

//Termina a tarefa corrente
void task_exit( int exit_code )
{

   #ifdef DEBUG
      printf("task_exit: tarefa %i sendo encerrada.\n",Corrente->taskID);
   #endif

   task_yield( &Principal );

}

//Suspende a tarefa corrente e ativa outra tarefa
int task_yield()
{
   No* aux;
   task_t* task;

   if ( Corrente->id != 0 )
   {
    aux = CriaNo ( (void*)Corrente );    
    AdicionaNoFim ( &pFirst , aux );
   }
   Corrente = &Principal; // Voltou para o sistema operacional

   aux = RemoveNoInicio(&pFirst);
   task = (task_t) aux->Conteudo; //VERIFICAR NECESSIDADE DO CAST
   //ExcluirNo(aux);
   Corrente = task;

   //Lembrando que swapcontext retorna 0 caso a troca seja efetuada com sucesso
   if( !( swapcontext( &( auxiliar->ctxt ), &( task->ctxt ) ) ) )
   {
       return 1;
   }

   else
   {
     return 0;
   }

}
//Informa o identificador da tarefa corrente
int task_id()
{   
   return ( *Corrente ).taskID;
}

No* CriaNo ( void* novoConteudo )
{
    No* novoNo = (No*)malloc(sizeof(No));
    novoNo->Conteudo = novoConteudo;
    novoNo->pProximo = 0;
    return novoNo;
}

void* ExcluirNo ( No* velhoNo )
{
    void* velhoConteudo;
    velhoConteudo = (void*) velhoNo->Conteudo;
    free( velhoNo );
    return velhoConteudo;
}

// FUNÇÔES DE LISTA ENCADEADA

//Adiciona um nó(Novo_No) numa lista encadeada(apontada por *pFirst) na primeira posição
void AdicionaNoInicio ( No** pFirst , No* Novo_No )
{
    if ( (*pFirst) == NULL )            // CASO I) Quando a lista encadeada esta vazia
    {
        (*pFirst) = Novo_No;
    }
    else
    if ( (*pFirst)->pProximo == NULL )    // CASO II) Quando a lista encadeada só tem um elemento
    {
        Novo_No->pProximo = (*pFirst);
        (*pFirst) = Novo_No;
    }
    else                                // CASO III) Quando a lista encadeada tem mais de um elemento
    {
        Novo_No->pProximo = (*pFirst);
        (*pFirst) = Novo_No;
    }
}

//Adiciona um nó(Novo_No) numa lista encadeada(apontada por *pFirst) na primeira última
void AdicionaNoFim ( No** pFirst , No* Novo_No )
{
    if ( (*pFirst) == NULL )            // CASO I) Quando a lista encadeada esta vazia
    {
        (*pFirst) = Novo_No;
    }
    else
    if ( (*pFirst)->pProximo == NULL )    // CASO II) Quando a lista encadeada só tem um elemento
    {
        (*pFirst)->pProximo = Novo_No;
    }
    else                                // CASO III) Quando a lista encadeada tem mais de um elemento
    {
        No* Auxiliar = (*pFirst);//Auxiliar irá percorrer toda a lista, achar o último elemento e fazer com que ele aponte para o Novo_No
        while( Auxiliar->pProximo != NULL )    //enquanto houver um próximo elemento
            Auxiliar = Auxiliar->pProximo;  //Auxiliar será o proximo elemento
        Auxiliar->pProximo = Novo_No;        //Auxiliar, agora sendo o último elemento, apontará para o Novo_No e deixará de ser o último elemento para ser o penultimo
    }
}

//Remove um nó (e o retorna) de uma lista encadeada(apontada por *pFirst) da primeira posição
No* RemoveNoInicio ( No** pFirst )
{
    No* Velho_No = (*pFirst);    //variável que aponta para o nó que será removido
    if ( (*pFirst) == NULL ){
        //considerando que (*pFirst) == NULL,
    }
    else
    if ( (*pFirst)->pProximo == NULL )
    {
        (*pFirst) = NULL;    
    }
    else    // CASO III) Quando a lista encadeada tem mais de um elemento
    {
        (*pFirst) = (*pFirst)->pProximo;
    }
    return Velho_No;
}
MAIN.C
#include <stdio.h>
#include <stdlib.h>
#include "task.h"

task_t Pang, Peng, Ping, Pong, Pung;

void BodyPang (void * arg)
{
   int i;
   char* name = (char *) arg;
   
   for (i=0; i<4; i++)
   {
      printf ("%s %d\n", name, i);
      task_yield ();
   }
   printf ("%s FIM\n", name);
   task_exit (0);
}

void BodyPeng (void * arg)
{
   int i;
   char* name = (char *) arg;
   
   for (i=0; i<4; i++)
   {
      printf ("%s %d\n", name, i);
      task_yield ();
   }
   printf ("%s FIM\n", name);
   task_exit (0);
}

void BodyPing (void * arg)
{
   int i;
   char* name = (char *) arg;
     
   for (i=0; i<4; i++)
   {
      printf ("%s %d\n", name, i);
      task_yield ();
   }
   printf ("%s FIM\n", name);
   task_exit (0);
}

void BodyPong (void * arg)
{
   int i;
   char* name = (char *) arg;
   
   for (i=0; i<4; i++)
   {
      printf ("%s %d\n", name, i);
      task_yield ();
   }
   printf ("%s FIM\n", name);
   task_exit (0);
}

void BodyPung (void * arg)
{
   int i;
   char* name = (char *) arg;
   
   for (i=0; i<4; i++)
   {
      printf ("%s %d\n", name, i);
      task_yield ();
    
   }
   printf ("%s FIM\n", name);
   task_exit (0);
}


int main (int argc, char *argv[])
{
   printf ("Main INICIO\n");
   task_init ();
   task_create (&Pang, BodyPang, "Pang");
   task_create (&Peng, BodyPeng, "   Peng");
   task_create (&Ping, BodyPing, "      Ping");       
   task_create (&Pong, BodyPong, "         Pong");
   task_create (&Pung, BodyPung, "            Pung");
   task_yield ();
   
   printf ("Main FIM\n");
   
   exit (0);
}

Link to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...