Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "../include/support.h"
- #include "../include/cthread.h"
- #include "../include/cdata.h"
- const int MEM = 32000;
- // Fila de aptos
- // Criar mais de uma fila de aptos, dependendo do numero de tickets???
- FILA2 aptos = NULL;
- // Fila de bloqueados
- FILA2 bloqueados = NULL;
- // Fila de zumbis
- FILA2 zumbis = NULL;
- // Executando - processo unico
- TCB_t * exec = NULL;
- void start_context(ucontext_t contexto, void* (*start)(void*), void *arg)
- {
- getcontext(&contexto);
- contexto.uc_link=0;
- contexto.uc_stack.ss_sp=malloc(MEM);
- contexto.uc_stack.ss_size=MEM;
- contexto.uc_stack.ss_flags=0;
- makecontext(&contexto, start, 0, arg);
- }
- choose_thread_exe(){
- int i;
- FirstFila2(&aptos);
- while(){
- NextFila2(&aptos);
- }
- return;
- }
- int ccreate (void* (*start)(void*), void *arg)
- {
- static tid_counter = 0;
- NODE2* nodo = (NODE2*) malloc(sizeof(NODE2));
- /// Cria TCB para nova thread
- nodo->tcb = (void *) malloc(sizeof(TCB_t));
- /// Cria fila - tem que ser criada somente na primeira chamada de ccreate
- // if (n_ha_threads)
- if (CreateFila2(&aptos))
- {
- printf ("Erro: não conseguiu criar a fila\n");
- return -1;
- }
- /// Coloca nodo na fila
- if (AppendFila2(&aptos, (void *)(nodo)))
- {
- printf ("Error: could not append item to the queue\n");
- return -1;
- }
- /// Set conteudo do TCB
- nodo->tcb->tid = tid_counter;
- nodo->tcb->state = PROCST_APTO;
- nodo->tcb>ticket = Random2;
- start_context(&(nodo->tcb->context), start, arg); /// Cria contexto para nova thread
- tid_counter++;
- return nodo->tcb->tid;
- }
- int mod(num){
- num >= 0 ? return num; return -num;
- }
- int closer_to_premio(){
- int dist_p_to_premiado = primeiro - premiado;
- int dist_s_to_premiado = segundo - premiado;
- mod(dist_p_to_premiado) > mod(dist_s_to_premiado) ? return 1: return 0;
- }
- int cyield(void)
- {
- // colocar na fila de aptos - necessario, e.g. tds outras threads em wait por unica thread em exec
- // descobrindo thread em exec
- exec->tid;
- FirstFila2(aptos); /// Set iterador da fila para primeiro elemento
- // iterar sobre fila de threads para achar aquela com maior tid
- TCB_t * tcb = (TCB_t *) GetAtIteratorFila2(aptos);
- int premiado = Random2();
- while (NextFila2(aptos) == 0){ /** NextFila2 retorna 0 se conseguiu mudar iterador para proximo elemento*/
- (TCB_t *) next_tcb = (TCB_t *) GetAtIteratorFila2(aptos);
- if (closer_to_premio(tcb, next_tcb, premiado)) tcb = next_tcb;
- }
- // swapcontext( endereço da thread(funcao) sainte, endereço da thread(funcao) entrante);
- swapcontext( exec, aptos->it);
- // colocar outra thread em execução
- // thread em execução tem q ser tirada da fila de aptos
- // swap cotext
- return;
- }
- int cjoin(int tid)
- {
- //
- // destruir contexos
- // ajeitar ponteiros da fila
- // ajeitar ponteiros iteradores
- return;
- }
- int csem_init(csem_t *sem, int count)
- {
- return;
- }
- int cwait(csem_t *sem)
- {
- return;
- }
- int csignal(csem_t *sem)
- {
- return;
- }
- int cidentify (char *name, int size)
- {
- int size_por_aluno = size / 2;
- int i;
- char um_sobrenome[] = "Pena Neto";
- char dois_sobrenome[] = "Falcao Amaya";
- char dois_nome[] = "Guillermo";
- char dois_nome[] = "Alberto";
- // inserir cartoes
- for (i=0; i <= size_por_aluno -1; i++)
- {
- printf("%c", um_sobrenome[i]);
- }
- printf("\n");
- for (i=0; i <= size_por_aluno -1; i++)
- {
- printf("%c", dois_sobrenome[i]);
- }
- return 0;
- return -1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement