void yield(void) { //Isolation de la section critique de code irq_disable(); //Si la structure courante existe, on va switcher sur un suivant qui n'est pas terminé if (struct_reference) { struct ctx_s* tmp; //On va chercher le prochain contexte non-terminé, ne pointant pas sur nous-mêmes while (struct_reference -> ctx_next -> ctx_state == CTX_TERMINATED && struct_reference -> ctx_next != struct_reference) { tmp = struct_reference -> ctx_next; struct_reference -> ctx_next = struct_reference -> ctx_next -> ctx_next; free(tmp -> ctx_ptr_malloc); free(tmp); } //Switch_to sur le prochain contexte s'il n'est pas encore terminé if (struct_reference -> ctx_next -> ctx_state != CTX_TERMINATED) { switch_to_ctx(struct_reference -> ctx_next); } //Sinon, on pointe sur soi -> EXIT else { exit(EXIT_SUCCESS); } } //Si la structure courante n'existe pas, on switch directement sur le contexte pointé dans la pile ctxs else { if (ctxs != NULL) { switch_to_ctx(ctxs); } } }
void f_pong(void *args){ while(1){ printf("1"); switch_to_ctx(&ctx_ping); printf("2"); switch_to_ctx(&ctx_ping); } }
void f1(void *args) { printf("Entrée dans le ctx1\n") ; printf("switch to ctx2\n"); switch_to_ctx(&ctx2); printf("Retour dans ctx1\n") ; printf("switch to ctx3\n"); switch_to_ctx(&ctx3); printf("fin ctx1 \n"); }
void f_ping(void *args) { int i = 100; while(i--) { printf("A") ; switch_to_ctx(&ctx_pong); printf("B") ; switch_to_ctx(&ctx_pong); printf("C") ; switch_to_ctx(&ctx_pong); } }
void f_ping(void * arg) { while(1) { printf("A"); switch_to_ctx(&ctx_pong); printf("B"); switch_to_ctx(&ctx_pong); printf("C"); switch_to_ctx(&ctx_pong); } }
void start_scheduler() { setup_irq(TIMER_IRQ, &timer_handler); start_hw(); switch_to_ctx(liste); }
void yield(void){ struct ctx_s *tmp; if(ctx_courant==NULL) switch_to_ctx(anneau); else while (ctx_courant->suivant->ctx_state==TERMINATED && ctx_courant->suivant != ctx_courant){ free(ctx_courant->suivant->stack); tmp = ctx_courant->suivant->suivant; free(ctx_courant->suivant); ctx_courant->suivant = tmp; } if (ctx_courant->suivant->ctx_state==TERMINATED) exit(0); switch_to_ctx(ctx_courant->suivant); return ; }
void f2(void *args) { printf("Entrée dans ctx2\n") ; printf("switch to ctx1\n"); switch_to_ctx(&ctx1); printf("fin ctx2 \n"); }
int main(int argc, char *argv[]) { init_ctx(&ctx_ping, 16384, f_ping, NULL); init_ctx(&ctx_pong, 16384, f_pong, NULL); switch_to_ctx(&ctx_ping); exit(EXIT_SUCCESS); }
void f_pang(void * arg) { int i; for(i = 1; i<=100;++i) { printf("x%d",i); switch_to_ctx(&ctx_ping); } }
int main(int argc, char *argv[]) { init_ctx(&ctx1, 16384, f1, NULL); printf("initialisation ctx1\n"); init_ctx(&ctx2, 16384, f2, NULL); printf("initialisation ctx2\n"); init_ctx(&ctx3, 16384, f3, NULL); printf("initialisation ctx3\n"); printf("switch to ctx1\n"); switch_to_ctx(&ctx1); printf("retour au main\n"); exit(EXIT_SUCCESS); }
void yield() { ctx_t *current; if (ctx == NULL) return; irq_disable(); //CORE LOCK current = find_next_iddle(); if (current == NULL) { //CORE UNLOCK irq_enable(); return; } switch_to_ctx(current, _in(CORE_ID)); clean_ctx(current); //CORE UNLOCK irq_enable(); }
void yield() { switch_to_ctx(liste->suivant); }