/**
 * Copyright © 2019, Oracle and/or its affiliates. All rights reserved.
 *
 * Licensed under the Universal Permissive License v 1.0 as shown at
 * http://oss.oracle.com/licenses/upl
 *
 */
#ifndef TODO_H
#define TODO_H

/* This is a scheduler for a simple to-do list.  You create a todo_list and
 * then you start it running with some workers with an initial todo item.  The
 * workers pop things from the todo list (and the work function can push more
 * things on) until everything is done.
 */

#include <stddef.h>

struct todo_item;
struct todo_list;

struct todo_list *
mk_todo_list(void);

struct todo_list *
todo_list_destroy(struct todo_list *todo_list);

void
todo_list_push(struct todo_list *tl,
               struct todo_item *item);

void
todo_list_run(struct todo_list *todo_list,
              size_t n_threads,
              struct todo_item *first_item,
              void (*work_on_item_function)(struct todo_list *,
                                            struct todo_item *));

#endif
