Subversion Repositories freemyipod

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 theseven 1
//
2
//
3
//    Copyright 2010 TheSeven
4
//
5
//
427 farthen 6
//    This file is part of emCORE.
14 theseven 7
//
427 farthen 8
//    emCORE is free software: you can redistribute it and/or
14 theseven 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
//
427 farthen 13
//    emCORE is distributed in the hope that it will be useful,
14 theseven 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
427 farthen 19
//    with emCORE.  If not, see <http://www.gnu.org/licenses/>.
14 theseven 20
//
21
//
22
 
23
 
24
#ifndef __THREAD_H__
25
#define __THREAD_H__
26
 
27
 
28
#include "global.h"
29
#include "contextswitch.h"
30
 
31
 
814 theseven 32
enum owner_type
33
{
34
    OWNER_THREAD = 0,
35
    OWNER_LIBRARY = 1,
36
    OWNER_KERNEL = 2,
37
    OWNER_RESERVED = 3
38
};
39
 
40
enum kernel_owner_type
41
{
42
    KERNEL_OWNER_UNKNOWN = 0,
43
    KERNEL_OWNER_USB_MONITOR = 1,
44
    KERNEL_OWNER_FILE_HANDLE = 2,
45
    KERNEL_OWNER_DIR_HANDLE = 3,
46
    KERNEL_OWNER_ATA_BBT = 4
47
};
48
 
49
#define OWNER_TYPE(x, y) ((struct scheduler_thread*)((((int)(y)) & ~3) | x))
50
#define KERNEL_OWNER(x) ((struct scheduler_thread*)(((x) << 2) | OWNER_KERNEL))
51
 
52
 
14 theseven 53
#define TIMEOUT_NONE 0
54
#define TIMEOUT_BLOCK -1
55
 
56
#define THREAD_FOUND 1
57
#define THREAD_OK 0
58
#define THREAD_TIMEOUT -1
59
#define ALREADY_SUSPENDED -4
60
#define ALREADY_RESUMED -5
61
 
62
 
63
enum thread_state
64
{
65
    THREAD_FREE = 0,
43 theseven 66
    THREAD_SUSPENDED = 1,
14 theseven 67
    THREAD_READY,
68
    THREAD_RUNNING,
69
    THREAD_BLOCKED,
15 theseven 70
    THREAD_DEFUNCT,
71
    THREAD_DEFUNCT_ACK
14 theseven 72
};
73
 
74
enum thread_block
75
{
76
    THREAD_NOT_BLOCKED = 0,
77
    THREAD_BLOCK_SLEEP,
78
    THREAD_BLOCK_MUTEX,
15 theseven 79
    THREAD_BLOCK_WAKEUP,
50 theseven 80
    THREAD_DEFUNCT_STKOV,
81
    THREAD_DEFUNCT_PANIC
14 theseven 82
};
83
 
15 theseven 84
enum thread_type
85
{
86
    USER_THREAD = 0,
132 theseven 87
    OS_THREAD,
88
    CORE_THREAD
15 theseven 89
};
90
 
31 theseven 91
 
691 theseven 92
#define SCHEDULER_THREAD_INFO_VERSION 3
31 theseven 93
 
691 theseven 94
struct mutex;
95
 
14 theseven 96
struct scheduler_thread
97
{
98
    uint32_t regs[16];
99
    uint32_t cpsr;
43 theseven 100
    uint32_t state;
14 theseven 101
    const char* name;
43 theseven 102
    uint32_t cputime_current;
14 theseven 103
    uint64_t cputime_total;
104
    uint32_t startusec;
429 theseven 105
    struct scheduler_thread* thread_next;
14 theseven 106
    struct scheduler_thread* queue_next;
691 theseven 107
    struct mutex* owned_mutexes;
14 theseven 108
    uint32_t timeout;
109
    uint32_t blocked_since;
110
    void* blocked_by;
111
    uint32_t* stack;
71 theseven 112
    int err_no;
14 theseven 113
    enum thread_block block_type;
15 theseven 114
    enum thread_type type;
14 theseven 115
    uint8_t priority;
116
    uint8_t cpuload;
117
};
118
 
119
struct mutex
120
{
121
    struct scheduler_thread* owner;
122
    struct scheduler_thread* waiters;
691 theseven 123
    struct mutex* owned_next;
14 theseven 124
    int count;
125
};
126
 
127
struct wakeup
128
{
129
    struct scheduler_thread* waiter;
130
    bool signalled;
131
};
132
 
133
 
429 theseven 134
extern struct scheduler_thread* head_thread IBSS_ATTR;
135
extern struct scheduler_thread* current_thread IBSS_ATTR;
136
 
137
 
14 theseven 138
void scheduler_init() INITCODE_ATTR;
389 theseven 139
void scheduler_pause_accounting() ICODE_ATTR;
140
void scheduler_resume_accounting() ICODE_ATTR;
595 theseven 141
void scheduler_switch(struct scheduler_thread* thread, struct scheduler_thread* block) ICODE_ATTR;
54 theseven 142
bool scheduler_freeze(bool value);
429 theseven 143
struct scheduler_thread* thread_create(struct scheduler_thread* thread, const char* name,
144
                                       const void* code, void* stack, int stacksize,
145
                                       enum thread_type type, int priority, bool run);
146
int thread_suspend(struct scheduler_thread* thread);
147
int thread_resume(struct scheduler_thread* thread);
453 theseven 148
void thread_set_name(struct scheduler_thread* thread, char* name);
149
void thread_set_priority(struct scheduler_thread* thread, int priority);
429 theseven 150
int thread_terminate(struct scheduler_thread* thread);
423 theseven 151
int thread_killlevel(enum thread_type type, bool killself);
429 theseven 152
enum thread_state thread_get_state(struct scheduler_thread* thread);
14 theseven 153
void thread_exit();
154
void mutex_init(struct mutex* obj) ICODE_ATTR;
155
int mutex_lock(struct mutex* obj, int timeout) ICODE_ATTR;
156
int mutex_unlock(struct mutex* obj) ICODE_ATTR;
157
void wakeup_init(struct wakeup* obj) ICODE_ATTR;
158
int wakeup_wait(struct wakeup* obj, int timeout) ICODE_ATTR;
159
int wakeup_signal(struct wakeup* obj) ICODE_ATTR;
160
void sleep(int usecs) ICODE_ATTR;
161
 
162
#endif