Advertisement
Guest User

eh_pra_quinta

a guest
Sep 27th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.64 KB | None | 0 0
  1. #include "../include/support.h"
  2. #include "../include/cthread.h"
  3. #include "../include/cdata.h"
  4.  
  5. const int MEM = 32000;
  6.  
  7. // Fila de aptos
  8. // Criar mais de uma fila de aptos, dependendo do numero de tickets???
  9. FILA2 aptos = NULL;
  10. // Fila de bloqueados
  11. FILA2 bloqueados = NULL;
  12. // Fila de zumbis
  13. FILA2 zumbis = NULL;
  14. // Executando - processo unico
  15. TCB_t * exec = NULL;
  16.  
  17. void start_context(ucontext_t contexto, void* (*start)(void*), void *arg)
  18. {
  19.     getcontext(&contexto);
  20.     contexto.uc_link=0;
  21.     contexto.uc_stack.ss_sp=malloc(MEM);
  22.     contexto.uc_stack.ss_size=MEM;
  23.     contexto.uc_stack.ss_flags=0;
  24.     makecontext(&contexto, start, 0, arg);
  25. }
  26.  
  27. choose_thread_exe(){
  28.     int i;
  29.     FirstFila2(&aptos);
  30.     while(){
  31.         NextFila2(&aptos);
  32.     }
  33.  
  34.     return;
  35. }
  36. int ccreate (void* (*start)(void*), void *arg)
  37. {
  38.     static tid_counter = 0;
  39.     NODE2* nodo = (NODE2*) malloc(sizeof(NODE2));
  40.     /// Cria TCB para nova thread
  41.     nodo->tcb = (void *) malloc(sizeof(TCB_t));
  42.  
  43.     /// Cria fila - tem que ser criada somente na primeira chamada de ccreate
  44.     // if (n_ha_threads)
  45.     if (CreateFila2(&aptos))
  46.     {
  47.         printf ("Erro: não conseguiu criar a fila\n");
  48.         return -1;
  49.     }
  50.  
  51.     /// Coloca nodo na fila
  52.     if (AppendFila2(&aptos, (void *)(nodo)))
  53.     {
  54.         printf ("Error: could not append item to the queue\n");
  55.         return -1;
  56.     }
  57.  
  58.     /// Set conteudo do TCB
  59.     nodo->tcb->tid = tid_counter;
  60.     nodo->tcb->state = PROCST_APTO;
  61.     nodo->tcb>ticket = Random2;
  62.     start_context(&(nodo->tcb->context), start, arg); /// Cria contexto para nova thread
  63.  
  64.     tid_counter++;
  65.     return nodo->tcb->tid;
  66. }
  67.  
  68. int mod(num){
  69.     num >= 0 ? return num; return -num;
  70. }
  71.  
  72. int closer_to_premio(){
  73.     int dist_p_to_premiado = primeiro - premiado;
  74.     int dist_s_to_premiado = segundo - premiado;
  75.     mod(dist_p_to_premiado) > mod(dist_s_to_premiado) ? return 1: return 0;
  76. }
  77.  
  78. int cyield(void)
  79. {
  80.     // colocar na fila de aptos - necessario, e.g. tds outras threads em wait por unica thread em exec
  81.     // descobrindo thread em exec
  82.     exec->tid;
  83.     FirstFila2(aptos); /// Set iterador da fila para primeiro elemento
  84.     // iterar sobre fila de threads para achar aquela com maior tid
  85.     TCB_t * tcb = (TCB_t *) GetAtIteratorFila2(aptos);
  86.     int premiado = Random2();
  87.     while (NextFila2(aptos) == 0){ /** NextFila2 retorna 0 se conseguiu mudar iterador para proximo elemento*/
  88.         (TCB_t *) next_tcb = (TCB_t *) GetAtIteratorFila2(aptos);
  89.         if (closer_to_premio(tcb, next_tcb, premiado)) tcb = next_tcb;
  90.  
  91.     }
  92.  
  93.     // swapcontext( endereço da thread(funcao) sainte, endereço da thread(funcao) entrante);
  94.     swapcontext( exec, aptos->it);
  95.     // colocar outra thread em execução
  96.     // thread em execução tem q ser tirada da fila de aptos
  97.     // swap cotext
  98.     return;
  99. }
  100. int cjoin(int tid)
  101. {
  102.     //
  103.     // destruir contexos
  104.     // ajeitar ponteiros da fila
  105.  
  106.     // ajeitar ponteiros iteradores
  107.  
  108.     return;
  109. }
  110. int csem_init(csem_t *sem, int count)
  111. {
  112.     return;
  113. }
  114. int cwait(csem_t *sem)
  115. {
  116.     return;
  117. }
  118. int csignal(csem_t *sem)
  119. {
  120.     return;
  121. }
  122. int cidentify (char *name, int size)
  123. {
  124.     int size_por_aluno = size / 2;
  125.     int i;
  126.     char um_sobrenome[] = "Pena Neto";
  127.     char dois_sobrenome[] = "Falcao Amaya";
  128.     char dois_nome[] = "Guillermo";
  129.     char dois_nome[] = "Alberto";
  130.  
  131.     // inserir cartoes
  132.     for (i=0; i <= size_por_aluno -1; i++)
  133.     {
  134.         printf("%c", um_sobrenome[i]);
  135.     }
  136.     printf("\n");
  137.     for (i=0; i <= size_por_aluno -1; i++)
  138.     {
  139.         printf("%c", dois_sobrenome[i]);
  140.     }
  141.     return 0;
  142.     return -1;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement