Skip to content

Daemons

include/thread/daemon.h View source View on GitHub
struct daemon_thread (6 fields) source
§ struct list_node list_node
§ bool background
§ struct thread *thread
§ struct daemon *daemon

What daemon are we attached to?

§ atomic_bool executing_work
§ enum daemon_thread_command command
struct daemon_work (4 fields) source
§ daemon_fn function
§ struct work_args args
§ struct daemon *daemon
§ void *private

Whatever anything wants

struct daemon_attributes (7 fields) source
§ size_t max_timesharing_threads
§ size_t min_timesharing_threads
§ atomic_size_t timesharing_threads

Internal

§ atomic_size_t idle_timesharing_threads

Internal

§ atomic_bool background_thread_present

Internal

§ struct cpu_mask thread_cpu_mask
§ enum daemon_flags flags
struct daemon (12 fields) source
§ char *name
§ struct semaphore ts_sem
§ struct semaphore bg_sem
§ struct list_head timesharing_threads
§ struct daemon_work *timesharing_work
§ struct daemon_thread *background_thread
§ struct daemon_work *background_work
§ struct workqueue *workqueue
§ struct daemon_attributes attrs
§ struct spinlock lock
§ refcount_t refcount
§ atomic(enum daemon_state) state
enum daemon_thread_command (5 variants) source

These commands are sent back up to the daemon thread executing a daemon work and are operated upon the completion of the daemon work

§ DAEMON_THREAD_COMMAND_NONE
§ DAEMON_THREAD_COMMAND_EXIT

Daemon thread exit

§ DAEMON_THREAD_COMMAND_RESTART

Restart the function

§ DAEMON_THREAD_COMMAND_SLEEP

Go to sleep

§ DAEMON_THREAD_COMMAND_DEFAULT = DAEMON_THREAD_COMMAND_SLEEP
enum daemon_flags (5 variants) source
§ DAEMON_FLAG_HAS_WORKQUEUE = 1
§ DAEMON_FLAG_HAS_NAME = 1 << 1
§ DAEMON_FLAG_AUTO_SPAWN = 1 << 2
§ DAEMON_FLAG_NO_TS_THREADS = 1 << 3
§ DAEMON_FLAG_NONE = 0
enum daemon_state (3 variants) source
§ DAEMON_STATE_ACTIVE
§ DAEMON_STATE_DESTROYING
§ DAEMON_STATE_DEAD
typedef enum daemon_thread_command (*daemon_fn)(
    void * arg,
    void * arg2
)
source
const char * daemon_state_str(enum daemon_state s)
source
struct daemon * daemon_create_full(
    struct daemon_attributes *attrs,
    struct daemon_work *timesharing_work,
    struct daemon_work *background_work,
    struct workqueue_attributes *wq_attrs,
    const char *fmt
)
source
void daemon_destroy(struct daemon *daemon)
source
struct daemon_thread * daemon_spawn_worker(struct daemon *daemon)
source
enum workqueue_error daemon_submit_oneshot_work(
    struct daemon *daemon,
    work_function func,
    struct work_args args
)
source
enum workqueue_error daemon_submit_work(
    struct daemon *daemon,
    struct work *work
)
source
void daemon_print(struct daemon *daemon)
source
void daemon_wake_background_worker(struct daemon *daemon)
source
void daemon_wake_timesharing_worker(struct daemon *daemon)
source
void daemon_wake_all_idle_timesharing_workers(struct daemon *daemon)
source
#define DAEMON_WORK_FROM(fn, a)
source
Expansion
#define DAEMON_WORK_FROM(fn, a) \
    ((struct daemon_work) {.function = fn, .args = a})
#define daemon_thread_from_list_node(ln)
source
#define daemon_create(name, attrs, timesharing_work, background_work, \ wq_attrs)
source
Expansion
#define daemon_create(name, attrs, timesharing_work, background_work, \
                      wq_attrs) \
    daemon_create_full((attrs), (timesharing_work), (background_work), \
                       (wq_attrs), PP_UNPAREN(name))
#define DAEMON_FLAG_TEST(daemon, flag)
source
Expansion
#define DAEMON_FLAG_TEST(daemon, flag) (daemon->attrs.flags & flag)