2024-03-09 18:22:32 +01:00
|
|
|
|
#pragma once
|
|
|
|
|
|
2024-04-18 17:41:41 +02:00
|
|
|
|
#include <pthread.h>
|
2024-03-09 18:22:32 +01:00
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
2024-04-18 22:38:01 +02:00
|
|
|
|
#define MAX_TASKS 81920
|
2024-04-18 17:41:41 +02:00
|
|
|
|
|
2024-03-09 18:22:32 +01:00
|
|
|
|
struct scheduler;
|
|
|
|
|
|
|
|
|
|
typedef void (*taskfunc)(void *, struct scheduler *);
|
|
|
|
|
|
2024-04-18 22:38:01 +02:00
|
|
|
|
typedef struct task_info {
|
|
|
|
|
taskfunc f;
|
|
|
|
|
void *closure;
|
|
|
|
|
} taskinfo;
|
|
|
|
|
|
2024-04-18 17:41:41 +02:00
|
|
|
|
struct scheduler {
|
2024-04-18 22:38:01 +02:00
|
|
|
|
/* Mutex qui protège la structure */
|
2024-04-18 17:41:41 +02:00
|
|
|
|
pthread_mutex_t mutex;
|
|
|
|
|
|
2024-04-18 22:38:01 +02:00
|
|
|
|
/* Indicateur de changement d'état */
|
2024-04-18 17:41:41 +02:00
|
|
|
|
pthread_cond_t cond;
|
|
|
|
|
|
|
|
|
|
/* Position actuelle dans la pile */
|
|
|
|
|
int top;
|
|
|
|
|
|
|
|
|
|
/* Tâches */
|
2024-04-18 22:38:01 +02:00
|
|
|
|
taskinfo tasks[MAX_TASKS];
|
2024-04-19 12:57:21 +02:00
|
|
|
|
|
|
|
|
|
/* Nombre de tâches en cours */
|
|
|
|
|
int ntasks;
|
2024-04-18 17:41:41 +02:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static inline int sched_default_threads(void) {
|
2024-03-09 18:22:32 +01:00
|
|
|
|
return sysconf(_SC_NPROCESSORS_ONLN);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Lance l'ordonnanceur
|
2024-04-18 17:41:12 +02:00
|
|
|
|
* - nthreads : nombre de threads créer par l'ordonnanceur.
|
2024-03-09 18:22:32 +01:00
|
|
|
|
* Si 0, le nombre de threads sera égal au nombre de coeurs de votre machine
|
|
|
|
|
*
|
|
|
|
|
* - qlen : nombre minimum de tâches simultanées que l’ordonnanceur devra
|
2024-04-18 17:41:12 +02:00
|
|
|
|
* supporter.
|
2024-03-09 18:22:32 +01:00
|
|
|
|
* Retourne une erreur si l'utilisateur dépasse qlen
|
|
|
|
|
*
|
|
|
|
|
* - f, closure : tâche initiale
|
|
|
|
|
*
|
|
|
|
|
* Renvoie 1 quand elle a terminé, -1 en cas d'échec d'initialisation
|
|
|
|
|
*/
|
|
|
|
|
int sched_init(int nthreads, int qlen, taskfunc f, void *closure);
|
|
|
|
|
|
2024-03-09 18:47:40 +01:00
|
|
|
|
/* Enfile une nouvelle tâche (f, closure) à l'ordonanceur (s)
|
|
|
|
|
*
|
|
|
|
|
* Peut renvoyer -1 avec errno = EAGAIN quand on dépasse la capacité de
|
2024-04-18 17:41:12 +02:00
|
|
|
|
* l'ordonanceur
|
2024-03-09 18:47:40 +01:00
|
|
|
|
* */
|
2024-03-09 18:22:32 +01:00
|
|
|
|
int sched_spawn(taskfunc f, void *closure, struct scheduler *s);
|