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