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