Ir para conteúdo
Fórum Script Brasil
  • 0

Sistema Operacional


Loco

Pergunta

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 para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...