/**
* Paraslash's task structure.
*
- * Before registering a task to the scheduler, the task structure must be
- * filled in properly by the caller.
+ * This is considered an internal structure and will eventually be made private.
*
* \sa \ref sched.
*/
struct task {
+ /** Copied from the task_info struct during task_register(). */
+ void (*pre_select)(struct sched *s, struct task *t);
+ /** Copied from the task_info struct during task_register(). */
+ int (*post_select)(struct sched *s, struct task *t);
+ /** Whether this task is active (>=0) or in error state (<0). */
+ int error;
+ /** Position of the task in the task list of the scheduler. */
+ struct list_head node;
+ /** The task name supplied when the task was registered(). */
+ char status[255];
+ /** If less than zero, the task was notified by another task. */
+ int notification;
+ /** True if task is in error state and exit status has been queried. */
+ bool dead;
+ /** Usually a pointer to the struct containing this task. */
+ void *context;
+};
+
+/** Information that must be supplied by callers of \ref task_register(). */
+struct task_info {
+ /** Used for log messages and by \ref get_task_list(). */
+ const char *name;
/**
- * The optional pre select hook of \a t.
+ * The optional pre select method.
*
* Its purpose is to add file descriptors to the fd sets of the
* scheduler and to decrease the select timeout if necessary.
*/
void (*pre_select)(struct sched *s, struct task *t);
/**
- * The mandatory post select hook of \a t.
+ * The mandatory post select method.
*
* Its purpose is to evaluate and act upon the results of the previous
* select call. If this function returns a negative value, the
* scheduler unregisters the task.
*/
int (*post_select)(struct sched *s, struct task *t);
- /** Whether this task is active (>=0) or in error state (<0). */
- int error;
- /** Position of the task in the task list of the scheduler. */
- struct list_head node;
- /** Descriptive text and current status of the task. */
- char status[255];
- /** If less than zero, the task was notified by another task. */
- int notification;
+ /**
+ * This pointer is saved when the task is register(ed). It may be
+ * queried from ->pre_select() and ->post_select() via \ref
+ * task_context(). Usually this is a pointer to the struct owned by the
+ * caller which contains the task pointer as one member.
+ */
+ void *context;
};
/**
*/
extern struct timeval *now;
-void register_task(struct sched *s, struct task *t);
+struct task *task_register(struct task_info *info, struct sched *s);
+void *task_context(struct task *t);
int schedule(struct sched *s);
+void sched_shutdown(struct sched *s);
char *get_task_list(struct sched *s);
void task_notify(struct task *t, int err);
void task_notify_all(struct sched *s, int err);
int task_get_notification(const struct task *t);
+int task_reap(struct task **tptr);
void sched_min_delay(struct sched *s);
void sched_request_timeout(struct timeval *to, struct sched *s);
void sched_request_timeout_ms(long unsigned ms, struct sched *s);