aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/include/sched.h
blob: ea3239d6029a9a586fbe05f8552130ca7c3e4ea9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#ifndef __SCHED_H__
#define __SCHED_H__

#include <mini-os/list.h>
#include <mini-os/time.h>
#include <mini-os/arch_sched.h>
#ifdef HAVE_LIBC
#include <sys/reent.h>
#endif

struct thread
{
    char *name;
    char *stack;
#if !defined(__ia64__)
    /* keep in that order */
    unsigned long sp;  /* Stack pointer */
    unsigned long ip;  /* Instruction pointer */
#else /* !defined(__ia64__) */
    thread_regs_t regs;
#endif /* !defined(__ia64__) */
    MINIOS_TAILQ_ENTRY(struct thread) thread_list;
    uint32_t flags;
    s_time_t wakeup_time;
#ifdef HAVE_LIBC
    struct _reent reent;
#endif
};

extern struct thread *idle_thread;
void idle_thread_fn(void *unused);

#define RUNNABLE_FLAG   0x00000001

#define is_runnable(_thread)    (_thread->flags & RUNNABLE_FLAG)
#define set_runnable(_thread)   (_thread->flags |= RUNNABLE_FLAG)
#define clear_runnable(_thread) (_thread->flags &= ~RUNNABLE_FLAG)

#define switch_threads(prev, next) arch_switch_threads(prev, next)
 
    /* Architecture specific setup of thread creation. */
struct thread* arch_create_thread(char *name, void (*function)(void *),
                                  void *data);

void init_sched(void);
void run_idle_thread(void);
struct thread* create_thread(char *name, void (*function)(void *), void *data);
void exit_thread(void) __attribute__((noreturn));
void schedule(void);

#ifdef __INSIDE_MINIOS__
#define current get_current()
#endif

void wake(struct thread *thread);
void block(struct thread *thread);
void msleep(uint32_t millisecs);

#endif /* __SCHED_H__ */