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);
		}
	}

}
Esempio n. 2
0
File: main.c Progetto: DherJ/Master1
void f_pong(void *args){
	while(1){
		printf("1");
		switch_to_ctx(&ctx_ping);
		printf("2");
		switch_to_ctx(&ctx_ping);
	}
}
Esempio n. 3
0
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");
}
Esempio n. 4
0
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);
  }
}
Esempio n. 5
0
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);
    }
}
Esempio n. 6
0
void start_scheduler()
{
	setup_irq(TIMER_IRQ, &timer_handler);
	start_hw();
	switch_to_ctx(liste);

}
Esempio n. 7
0
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 ;
}
Esempio n. 8
0
void f2(void *args)
{
    printf("Entrée dans ctx2\n") ;
    printf("switch to ctx1\n");
    switch_to_ctx(&ctx1);
    printf("fin ctx2 \n");
} 
Esempio n. 9
0
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);
}
Esempio n. 10
0
void f_pang(void * arg)
{
  int i;
  for(i = 1; i<=100;++i)
    {
      printf("x%d",i);
      switch_to_ctx(&ctx_ping);
    }
}
Esempio n. 11
0
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);
}
Esempio n. 12
0
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();
}
Esempio n. 13
0
void yield()
{
	switch_to_ctx(liste->suivant);
}