1 /* Kernel specific structures and functions
3 * Copyright 2004-2006, Haiku Inc. All Rights Reserved.
4 * Distributed under the terms of the MIT License.
9 #include "fssh_types.h"
17 /*-------------------------------------------------------------*/
18 /* System constants */
20 #define FSSH_B_OS_NAME_LENGTH 32
21 #define FSSH_B_PAGE_SIZE 4096
22 #define FSSH_B_INFINITE_TIMEOUT (9223372036854775807LL)
25 /*-------------------------------------------------------------*/
28 typedef int32_t fssh_area_id
;
29 typedef int32_t fssh_port_id
;
30 typedef int32_t fssh_sem_id
;
31 typedef int32_t fssh_team_id
;
32 typedef int32_t fssh_thread_id
;
35 /*-------------------------------------------------------------*/
38 typedef struct fssh_sem_info
{
41 char name
[FSSH_B_OS_NAME_LENGTH
];
43 fssh_thread_id latest_holder
;
48 FSSH_B_CAN_INTERRUPT
= 0x01, // acquisition of the semaphore can be
49 // interrupted (system use only)
50 FSSH_B_CHECK_PERMISSION
= 0x04, // ownership will be checked (system use
52 FSSH_B_KILL_CAN_INTERRUPT
= 0x20, // acquisition of the semaphore can be
53 // interrupted by SIGKILL[THR], even
54 // if not B_CAN_INTERRUPT (system use
57 /* release_sem_etc() only flags */
58 FSSH_B_DO_NOT_RESCHEDULE
= 0x02, // thread is not rescheduled
59 FSSH_B_RELEASE_ALL
= 0x08, // all waiting threads will be woken up,
60 // count will be zeroed
61 FSSH_B_RELEASE_IF_WAITING_ONLY
= 0x10 // release count only if there are any
65 extern fssh_sem_id
fssh_create_sem(int32_t count
, const char *name
);
66 extern fssh_status_t
fssh_delete_sem(fssh_sem_id id
);
67 extern fssh_status_t
fssh_acquire_sem(fssh_sem_id id
);
68 extern fssh_status_t
fssh_acquire_sem_etc(fssh_sem_id id
, int32_t count
,
69 uint32_t flags
, fssh_bigtime_t timeout
);
70 extern fssh_status_t
fssh_release_sem(fssh_sem_id id
);
71 extern fssh_status_t
fssh_release_sem_etc(fssh_sem_id id
, int32_t count
,
73 extern fssh_status_t
fssh_get_sem_count(fssh_sem_id id
,
74 int32_t *threadCount
);
75 extern fssh_status_t
fssh_set_sem_owner(fssh_sem_id id
, fssh_team_id team
);
77 /* system private, use the macros instead */
78 extern fssh_status_t
_fssh_get_sem_info(fssh_sem_id id
,
79 struct fssh_sem_info
*info
, fssh_size_t infoSize
);
80 extern fssh_status_t
_fssh_get_next_sem_info(fssh_team_id team
,
81 int32_t *cookie
, struct fssh_sem_info
*info
,
82 fssh_size_t infoSize
);
84 #define fssh_get_sem_info(sem, info) \
85 _fssh_get_sem_info((sem), (info), sizeof(*(info)))
87 #define fssh_get_next_sem_info(team, cookie, info) \
88 _fssh_get_next_sem_info((team), (cookie), (info), sizeof(*(info)))
93 FSSH_B_TIMEOUT
= 8, /* relative timeout */
94 FSSH_B_RELATIVE_TIMEOUT
= 8, /* fails after a relative timeout with B_WOULD_BLOCK */
95 FSSH_B_ABSOLUTE_TIMEOUT
= 16 /* fails after an absolute timeout with B_WOULD BLOCK */
99 /*-------------------------------------------------------------*/
102 #define FSSH_B_CURRENT_TEAM 0
103 #define FSSH_B_SYSTEM_TEAM 1
106 /*-------------------------------------------------------------*/
110 FSSH_B_THREAD_RUNNING
= 1,
112 FSSH_B_THREAD_RECEIVING
,
113 FSSH_B_THREAD_ASLEEP
,
114 FSSH_B_THREAD_SUSPENDED
,
115 FSSH_B_THREAD_WAITING
119 fssh_thread_id thread
;
121 char name
[FSSH_B_OS_NAME_LENGTH
];
122 fssh_thread_state state
;
125 fssh_bigtime_t user_time
;
126 fssh_bigtime_t kernel_time
;
131 #define FSSH_B_IDLE_PRIORITY 0
132 #define FSSH_B_LOWEST_ACTIVE_PRIORITY 1
133 #define FSSH_B_LOW_PRIORITY 5
134 #define FSSH_B_NORMAL_PRIORITY 10
135 #define FSSH_B_DISPLAY_PRIORITY 15
136 #define FSSH_B_URGENT_DISPLAY_PRIORITY 20
137 #define FSSH_B_REAL_TIME_DISPLAY_PRIORITY 100
138 #define FSSH_B_URGENT_PRIORITY 110
139 #define FSSH_B_REAL_TIME_PRIORITY 120
141 #define FSSH_B_FIRST_REAL_TIME_PRIORITY B_REAL_TIME_DISPLAY_PRIORITY
142 #define FSSH_B_MIN_PRIORITY B_IDLE_PRIORITY
143 #define FSSH_B_MAX_PRIORITY B_REAL_TIME_PRIORITY
145 #define FSSH_B_SYSTEM_TIMEBASE 0
147 typedef fssh_status_t (*fssh_thread_func
)(void *);
148 #define fssh_thread_entry fssh_thread_func
149 /* thread_entry is for backward compatibility only! Use thread_func */
151 extern fssh_thread_id
fssh_spawn_thread(fssh_thread_func
, const char *name
,
152 int32_t priority
, void *data
);
153 extern fssh_status_t
fssh_kill_thread(fssh_thread_id thread
);
154 extern fssh_status_t
fssh_resume_thread(fssh_thread_id thread
);
155 extern fssh_status_t
fssh_suspend_thread(fssh_thread_id thread
);
157 extern fssh_status_t
fssh_rename_thread(fssh_thread_id thread
,
158 const char *newName
);
159 extern fssh_status_t
fssh_set_thread_priority (fssh_thread_id thread
,
160 int32_t newPriority
);
161 extern void fssh_exit_thread(fssh_status_t status
);
162 extern fssh_status_t
fssh_wait_for_thread (fssh_thread_id thread
,
163 fssh_status_t
*threadReturnValue
);
164 extern fssh_status_t
fssh_on_exit_thread(void (*callback
)(void *),
167 extern fssh_thread_id
fssh_find_thread(const char *name
);
169 extern fssh_status_t
fssh_send_data(fssh_thread_id thread
, int32_t code
,
171 fssh_size_t bufferSize
);
172 extern int32_t fssh_receive_data(fssh_thread_id
*sender
, void *buffer
,
173 fssh_size_t bufferSize
);
174 extern bool fssh_has_data(fssh_thread_id thread
);
176 extern fssh_status_t
fssh_snooze(fssh_bigtime_t amount
);
177 extern fssh_status_t
fssh_snooze_etc(fssh_bigtime_t amount
, int timeBase
,
179 extern fssh_status_t
fssh_snooze_until(fssh_bigtime_t time
, int timeBase
);
181 /* system private, use macros instead */
182 extern fssh_status_t
_fssh_get_thread_info(fssh_thread_id id
,
183 fssh_thread_info
*info
, fssh_size_t size
);
184 extern fssh_status_t
_fssh_get_next_thread_info(fssh_team_id team
,
185 int32_t *cookie
, fssh_thread_info
*info
,
188 #define fssh_get_thread_info(id, info) \
189 _fssh_get_thread_info((id), (info), sizeof(*(info)))
191 #define fssh_get_next_thread_info(team, cookie, info) \
192 _fssh_get_next_thread_info((team), (cookie), (info), sizeof(*(info)))
195 /*-------------------------------------------------------------*/
198 extern unsigned long fssh_real_time_clock(void);
199 extern void fssh_set_real_time_clock(unsigned long secs_since_jan1_1970
);
200 extern fssh_bigtime_t
fssh_real_time_clock_usecs(void);
201 extern fssh_status_t
fssh_set_timezone(char *timezone
);
202 extern fssh_bigtime_t
fssh_system_time(void); /* time since booting in microseconds */
210 #endif // _FSSH_TYPES_H