Subversion Repositories freemyipod

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 theseven 1
//
2
//
3
//    Copyright 2010 TheSeven
4
//
5
//
6
//    This file is part of emBIOS.
7
//
8
//    emBIOS is free software: you can redistribute it and/or
9
//    modify it under the terms of the GNU General Public License as
10
//    published by the Free Software Foundation, either version 2 of the
11
//    License, or (at your option) any later version.
12
//
13
//    emBIOS is distributed in the hope that it will be useful,
14
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
15
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16
//    See the GNU General Public License for more details.
17
//
18
//    You should have received a copy of the GNU General Public License along
19
//    with emBIOS.  If not, see <http://www.gnu.org/licenses/>.
20
//
21
//
22
 
23
 
24
#ifndef __THREAD_H__
25
#define __THREAD_H__
26
 
27
 
28
#include "global.h"
29
#include "contextswitch.h"
30
 
31
 
32
#define TIMEOUT_NONE 0
33
#define TIMEOUT_BLOCK -1
34
 
35
#define THREAD_FOUND 1
36
#define THREAD_OK 0
37
#define THREAD_TIMEOUT -1
38
#define NO_MORE_THREADS -2
39
#define INVALID_THREAD -3
40
#define ALREADY_SUSPENDED -4
41
#define ALREADY_RESUMED -5
42
 
43
 
44
enum thread_state
45
{
46
    THREAD_FREE = 0,
43 theseven 47
    THREAD_SUSPENDED = 1,
14 theseven 48
    THREAD_READY,
49
    THREAD_RUNNING,
50
    THREAD_BLOCKED,
15 theseven 51
    THREAD_DEFUNCT,
52
    THREAD_DEFUNCT_ACK
14 theseven 53
};
54
 
55
enum thread_block
56
{
57
    THREAD_NOT_BLOCKED = 0,
58
    THREAD_BLOCK_SLEEP,
59
    THREAD_BLOCK_MUTEX,
15 theseven 60
    THREAD_BLOCK_WAKEUP,
50 theseven 61
    THREAD_DEFUNCT_STKOV,
62
    THREAD_DEFUNCT_PANIC
14 theseven 63
};
64
 
15 theseven 65
enum thread_type
66
{
67
    USER_THREAD = 0,
132 theseven 68
    OS_THREAD,
69
    CORE_THREAD
15 theseven 70
};
71
 
31 theseven 72
 
73
#define SCHEDULER_THREAD_INFO_VERSION 1
74
 
14 theseven 75
struct scheduler_thread
76
{
77
    uint32_t regs[16];
78
    uint32_t cpsr;
43 theseven 79
    uint32_t state;
14 theseven 80
    const char* name;
43 theseven 81
    uint32_t cputime_current;
14 theseven 82
    uint64_t cputime_total;
83
    uint32_t startusec;
84
    struct scheduler_thread* queue_next;
85
    uint32_t timeout;
86
    uint32_t blocked_since;
87
    void* blocked_by;
88
    uint32_t* stack;
71 theseven 89
    int err_no;
14 theseven 90
    enum thread_block block_type;
15 theseven 91
    enum thread_type type;
14 theseven 92
    uint8_t priority;
93
    uint8_t cpuload;
94
};
95
 
96
struct mutex
97
{
98
    struct scheduler_thread* owner;
99
    struct scheduler_thread* waiters;
100
    int count;
101
};
102
 
103
struct wakeup
104
{
105
    struct scheduler_thread* waiter;
106
    bool signalled;
107
};
108
 
109
 
110
void scheduler_init() INITCODE_ATTR;
111
void scheduler_switch(int thread) ICODE_ATTR;
54 theseven 112
bool scheduler_freeze(bool value);
14 theseven 113
int thread_create(const char* name, const void* code, void* stack,
15 theseven 114
                  int stacksize, enum thread_type type, int priority, bool run);
14 theseven 115
int thread_suspend(int thread);
116
int thread_resume(int thread);
117
int thread_terminate(int thread);
118
void thread_exit();
119
void mutex_init(struct mutex* obj) ICODE_ATTR;
120
int mutex_lock(struct mutex* obj, int timeout) ICODE_ATTR;
121
int mutex_unlock(struct mutex* obj) ICODE_ATTR;
122
void wakeup_init(struct wakeup* obj) ICODE_ATTR;
123
int wakeup_wait(struct wakeup* obj, int timeout) ICODE_ATTR;
124
int wakeup_signal(struct wakeup* obj) ICODE_ATTR;
125
void sleep(int usecs) ICODE_ATTR;
126
 
127
static inline void yield()
128
{
129
    context_switch();
130
}
131
 
132
#endif