Esempio n. 1
0
EXPORT 
void co_resume( Coroutine* co ){
   switch(co->status){
      case STATUS_NEW:
         co_start(co);
      case STATUS_TERMINATED:
         return;
      default:
         if( !setjmp(co_cur->ctx) ){
            co_cur = co;
            longjmp(co_cur->ctx,1);
         }
   }
}
Esempio n. 2
0
void *co_loop(void *notUsed)
{
	int i, nbRunningProcess = 0;
	TaskToWait *temp;
	siginfo_t status;

	while(param->sigEnd == False)
	{
		/* Mise en pause pour éviter une surcharge */
		sleep(param->timeBetweenTwoConverts);

		/* Recherche de nouveautés */
		for(i=0;i<playlist->nbFile;i++)
		{
			/* Si on trouve une musique nouvelle ajouté à la playlist, et qu'on a pas encore atteint la limite de processus */
			if(playlist->state[i] == 0 && (nbRunningProcess < param->maxRunningProcess || param->maxRunningProcess == 0))
			{
				/* Indication que cette musique est en train d'être converti */
				playlist->state[i] = 1;

				/* Comptage du nombre de processus actuellement en route */
				nbRunningProcess++;

				/* Lancment de la convertion */
				co_start(i, playlist->pathList[i]);
			}
		}

		/* Recherche de processus finis */
		temp = tasktowait;
		while(temp != NULL)
		{
			/* On vérifie si le processus de pid "temp->pid" a fini ou non */
			status.si_pid = 0;
			waitid(P_PID, temp->pid, &status, WEXITED | WNOHANG);
			
			/* S'il a fini */
			if(status.si_pid != 0)
			{
				/* On vérifie si le processus c'est fini correctement ou non */
				if(status.si_status == 0)
				{
					/* On enregistre le lien vers la musique converti dans la structure playlist */
					pl_updateEffList(temp->index, temp->tempPath);
					/* 2 = conversion effectué avec succes */
					playlist->state[temp->index] = 2;
				}
				else
					/* -1 = erreur dans la conversion */
					playlist->state[temp->index] = -1;

				/* Le processus étant fini, on peut le retirer de TaskToWait */
				co_remove(temp->index);

				/* Et on met à jour le compteur de processus actif */
				nbRunningProcess--;
			}
			temp = temp->next;
		}
	}
	co_end();

	return NULL;
}