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;
}
Question
Loco
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
TASK.C MAIN.CLink to comment
Share on other sites
0 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.