1/* Kernel specific structures and functions
2 *
3 * Copyright 2004-2006, Haiku Inc. All Rights Reserved.
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef _FSSH_SEM_H
7#define _FSSH_SEM_H
8
9#include "fssh_types.h"
10
11
12#ifdef __cplusplus
13extern "C" {
14#endif
15
16
17/*-------------------------------------------------------------*/
18/* System constants */
19
20#define FSSH_B_OS_NAME_LENGTH	32
21#define FSSH_B_PAGE_SIZE		4096
22#define FSSH_B_INFINITE_TIMEOUT	(9223372036854775807LL)
23
24
25/*-------------------------------------------------------------*/
26/* Types */
27
28typedef int32_t fssh_area_id;
29typedef int32_t	fssh_port_id;
30typedef int32_t	fssh_sem_id;
31typedef int32_t	fssh_team_id;
32typedef int32_t	fssh_thread_id;
33
34
35/*-------------------------------------------------------------*/
36/* Semaphores */
37
38typedef struct fssh_sem_info {
39	fssh_sem_id		sem;
40	fssh_team_id	team;
41	char			name[FSSH_B_OS_NAME_LENGTH];
42	int32_t			count;
43	fssh_thread_id	latest_holder;
44} fssh_sem_info;
45
46/* semaphore flags */
47enum {
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
51											// only)
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
55											// only)
56
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
62											// threads waiting
63};
64
65extern fssh_sem_id		fssh_create_sem(int32_t count, const char *name);
66extern fssh_status_t	fssh_delete_sem(fssh_sem_id id);
67extern fssh_status_t	fssh_acquire_sem(fssh_sem_id id);
68extern fssh_status_t	fssh_acquire_sem_etc(fssh_sem_id id, int32_t count,
69							uint32_t flags, fssh_bigtime_t timeout);
70extern fssh_status_t	fssh_release_sem(fssh_sem_id id);
71extern fssh_status_t	fssh_release_sem_etc(fssh_sem_id id, int32_t count,
72							uint32_t flags);
73extern fssh_status_t	fssh_get_sem_count(fssh_sem_id id,
74							int32_t *threadCount);
75extern fssh_status_t	fssh_set_sem_owner(fssh_sem_id id, fssh_team_id team);
76
77/* system private, use the macros instead */
78extern fssh_status_t	_fssh_get_sem_info(fssh_sem_id id,
79							struct fssh_sem_info *info, fssh_size_t infoSize);
80extern 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);
83
84#define fssh_get_sem_info(sem, info) \
85			_fssh_get_sem_info((sem), (info), sizeof(*(info)))
86
87#define fssh_get_next_sem_info(team, cookie, info) \
88			_fssh_get_next_sem_info((team), (cookie), (info), sizeof(*(info)))
89
90
91
92enum {
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 */
96};
97
98
99/*-------------------------------------------------------------*/
100/* Teams */
101
102#define FSSH_B_CURRENT_TEAM	0
103#define FSSH_B_SYSTEM_TEAM	1
104
105
106/*-------------------------------------------------------------*/
107/* Threads */
108
109typedef enum {
110	FSSH_B_THREAD_RUNNING	= 1,
111	FSSH_B_THREAD_READY,
112	FSSH_B_THREAD_RECEIVING,
113	FSSH_B_THREAD_ASLEEP,
114	FSSH_B_THREAD_SUSPENDED,
115	FSSH_B_THREAD_WAITING
116} fssh_thread_state;
117
118typedef struct {
119	fssh_thread_id		thread;
120	fssh_team_id		team;
121	char				name[FSSH_B_OS_NAME_LENGTH];
122	fssh_thread_state	state;
123	int32_t				priority;
124	fssh_sem_id			sem;
125	fssh_bigtime_t		user_time;
126	fssh_bigtime_t		kernel_time;
127	void				*stack_base;
128	void				*stack_end;
129} fssh_thread_info;
130
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
140
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
144
145#define FSSH_B_SYSTEM_TIMEBASE				0
146
147typedef 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 */
150
151extern fssh_thread_id	fssh_spawn_thread(fssh_thread_func, const char *name,
152							int32_t priority, void *data);
153extern fssh_status_t	fssh_kill_thread(fssh_thread_id thread);
154extern fssh_status_t	fssh_resume_thread(fssh_thread_id thread);
155extern fssh_status_t	fssh_suspend_thread(fssh_thread_id thread);
156
157extern fssh_status_t	fssh_rename_thread(fssh_thread_id thread,
158							const char *newName);
159extern fssh_status_t	fssh_set_thread_priority (fssh_thread_id thread,
160							int32_t newPriority);
161extern void				fssh_exit_thread(fssh_status_t status);
162extern fssh_status_t	fssh_wait_for_thread (fssh_thread_id thread,
163							fssh_status_t *threadReturnValue);
164extern fssh_status_t	fssh_on_exit_thread(void (*callback)(void *),
165							void *data);
166
167extern fssh_thread_id 	fssh_find_thread(const char *name);
168
169extern fssh_status_t	fssh_send_data(fssh_thread_id thread, int32_t code,
170							const void *buffer,
171						fssh_size_t bufferSize);
172extern int32_t			fssh_receive_data(fssh_thread_id *sender, void *buffer,
173							fssh_size_t bufferSize);
174extern bool				fssh_has_data(fssh_thread_id thread);
175
176extern fssh_status_t	fssh_snooze(fssh_bigtime_t amount);
177extern fssh_status_t	fssh_snooze_etc(fssh_bigtime_t amount, int timeBase,
178							uint32_t flags);
179extern fssh_status_t	fssh_snooze_until(fssh_bigtime_t time, int timeBase);
180
181/* system private, use macros instead */
182extern fssh_status_t	_fssh_get_thread_info(fssh_thread_id id,
183							fssh_thread_info *info, fssh_size_t size);
184extern fssh_status_t	_fssh_get_next_thread_info(fssh_team_id team,
185							int32_t *cookie, fssh_thread_info *info,
186							fssh_size_t size);
187
188#define fssh_get_thread_info(id, info) \
189			_fssh_get_thread_info((id), (info), sizeof(*(info)))
190
191#define fssh_get_next_thread_info(team, cookie, info) \
192			_fssh_get_next_thread_info((team), (cookie), (info), sizeof(*(info)))
193
194
195/*-------------------------------------------------------------*/
196/* Time */
197
198extern unsigned long	fssh_real_time_clock(void);
199extern void				fssh_set_real_time_clock(unsigned long secs_since_jan1_1970);
200extern fssh_bigtime_t	fssh_real_time_clock_usecs(void);
201extern fssh_status_t	fssh_set_timezone(char *timezone);
202extern fssh_bigtime_t	fssh_system_time(void);     /* time since booting in microseconds */
203
204
205#ifdef __cplusplus
206}
207#endif
208
209
210#endif	// _FSSH_TYPES_H
211