211 lines
6.7 KiB
C
211 lines
6.7 KiB
C
|
/* Kernel specific structures and functions
|
||
|
*
|
||
|
* Copyright 2004-2006, Haiku Inc. All Rights Reserved.
|
||
|
* Distributed under the terms of the MIT License.
|
||
|
*/
|
||
|
#ifndef _FSSH_SEM_H
|
||
|
#define _FSSH_SEM_H
|
||
|
|
||
|
#include "fssh_types.h"
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------*/
|
||
|
/* System constants */
|
||
|
|
||
|
#define FSSH_B_OS_NAME_LENGTH 32
|
||
|
#define FSSH_B_PAGE_SIZE 4096
|
||
|
#define FSSH_B_INFINITE_TIMEOUT (9223372036854775807LL)
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------*/
|
||
|
/* Types */
|
||
|
|
||
|
typedef int32_t fssh_area_id;
|
||
|
typedef int32_t fssh_port_id;
|
||
|
typedef int32_t fssh_sem_id;
|
||
|
typedef int32_t fssh_team_id;
|
||
|
typedef int32_t fssh_thread_id;
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------*/
|
||
|
/* Semaphores */
|
||
|
|
||
|
typedef struct fssh_sem_info {
|
||
|
fssh_sem_id sem;
|
||
|
fssh_team_id team;
|
||
|
char name[FSSH_B_OS_NAME_LENGTH];
|
||
|
int32_t count;
|
||
|
fssh_thread_id latest_holder;
|
||
|
} fssh_sem_info;
|
||
|
|
||
|
/* semaphore flags */
|
||
|
enum {
|
||
|
FSSH_B_CAN_INTERRUPT = 0x01, // acquisition of the semaphore can be
|
||
|
// interrupted (system use only)
|
||
|
FSSH_B_CHECK_PERMISSION = 0x04, // ownership will be checked (system use
|
||
|
// only)
|
||
|
FSSH_B_KILL_CAN_INTERRUPT = 0x20, // acquisition of the semaphore can be
|
||
|
// interrupted by SIGKILL[THR], even
|
||
|
// if not B_CAN_INTERRUPT (system use
|
||
|
// only)
|
||
|
|
||
|
/* release_sem_etc() only flags */
|
||
|
FSSH_B_DO_NOT_RESCHEDULE = 0x02, // thread is not rescheduled
|
||
|
FSSH_B_RELEASE_ALL = 0x08, // all waiting threads will be woken up,
|
||
|
// count will be zeroed
|
||
|
FSSH_B_RELEASE_IF_WAITING_ONLY = 0x10 // release count only if there are any
|
||
|
// threads waiting
|
||
|
};
|
||
|
|
||
|
extern fssh_sem_id fssh_create_sem(int32_t count, const char *name);
|
||
|
extern fssh_status_t fssh_delete_sem(fssh_sem_id id);
|
||
|
extern fssh_status_t fssh_acquire_sem(fssh_sem_id id);
|
||
|
extern fssh_status_t fssh_acquire_sem_etc(fssh_sem_id id, int32_t count,
|
||
|
uint32_t flags, fssh_bigtime_t timeout);
|
||
|
extern fssh_status_t fssh_release_sem(fssh_sem_id id);
|
||
|
extern fssh_status_t fssh_release_sem_etc(fssh_sem_id id, int32_t count,
|
||
|
uint32_t flags);
|
||
|
extern fssh_status_t fssh_get_sem_count(fssh_sem_id id,
|
||
|
int32_t *threadCount);
|
||
|
extern fssh_status_t fssh_set_sem_owner(fssh_sem_id id, fssh_team_id team);
|
||
|
|
||
|
/* system private, use the macros instead */
|
||
|
extern fssh_status_t _fssh_get_sem_info(fssh_sem_id id,
|
||
|
struct fssh_sem_info *info, fssh_size_t infoSize);
|
||
|
extern fssh_status_t _fssh_get_next_sem_info(fssh_team_id team,
|
||
|
int32_t *cookie, struct fssh_sem_info *info,
|
||
|
fssh_size_t infoSize);
|
||
|
|
||
|
#define fssh_get_sem_info(sem, info) \
|
||
|
_fssh_get_sem_info((sem), (info), sizeof(*(info)))
|
||
|
|
||
|
#define fssh_get_next_sem_info(team, cookie, info) \
|
||
|
_fssh_get_next_sem_info((team), (cookie), (info), sizeof(*(info)))
|
||
|
|
||
|
|
||
|
|
||
|
enum {
|
||
|
FSSH_B_TIMEOUT = 8, /* relative timeout */
|
||
|
FSSH_B_RELATIVE_TIMEOUT = 8, /* fails after a relative timeout with B_WOULD_BLOCK */
|
||
|
FSSH_B_ABSOLUTE_TIMEOUT = 16 /* fails after an absolute timeout with B_WOULD BLOCK */
|
||
|
};
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------*/
|
||
|
/* Teams */
|
||
|
|
||
|
#define FSSH_B_CURRENT_TEAM 0
|
||
|
#define FSSH_B_SYSTEM_TEAM 1
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------*/
|
||
|
/* Threads */
|
||
|
|
||
|
typedef enum {
|
||
|
FSSH_B_THREAD_RUNNING = 1,
|
||
|
FSSH_B_THREAD_READY,
|
||
|
FSSH_B_THREAD_RECEIVING,
|
||
|
FSSH_B_THREAD_ASLEEP,
|
||
|
FSSH_B_THREAD_SUSPENDED,
|
||
|
FSSH_B_THREAD_WAITING
|
||
|
} fssh_thread_state;
|
||
|
|
||
|
typedef struct {
|
||
|
fssh_thread_id thread;
|
||
|
fssh_team_id team;
|
||
|
char name[FSSH_B_OS_NAME_LENGTH];
|
||
|
fssh_thread_state state;
|
||
|
int32_t priority;
|
||
|
fssh_sem_id sem;
|
||
|
fssh_bigtime_t user_time;
|
||
|
fssh_bigtime_t kernel_time;
|
||
|
void *stack_base;
|
||
|
void *stack_end;
|
||
|
} fssh_thread_info;
|
||
|
|
||
|
#define FSSH_B_IDLE_PRIORITY 0
|
||
|
#define FSSH_B_LOWEST_ACTIVE_PRIORITY 1
|
||
|
#define FSSH_B_LOW_PRIORITY 5
|
||
|
#define FSSH_B_NORMAL_PRIORITY 10
|
||
|
#define FSSH_B_DISPLAY_PRIORITY 15
|
||
|
#define FSSH_B_URGENT_DISPLAY_PRIORITY 20
|
||
|
#define FSSH_B_REAL_TIME_DISPLAY_PRIORITY 100
|
||
|
#define FSSH_B_URGENT_PRIORITY 110
|
||
|
#define FSSH_B_REAL_TIME_PRIORITY 120
|
||
|
|
||
|
#define FSSH_B_FIRST_REAL_TIME_PRIORITY B_REAL_TIME_DISPLAY_PRIORITY
|
||
|
#define FSSH_B_MIN_PRIORITY B_IDLE_PRIORITY
|
||
|
#define FSSH_B_MAX_PRIORITY B_REAL_TIME_PRIORITY
|
||
|
|
||
|
#define FSSH_B_SYSTEM_TIMEBASE 0
|
||
|
|
||
|
typedef fssh_status_t (*fssh_thread_func)(void *);
|
||
|
#define fssh_thread_entry fssh_thread_func
|
||
|
/* thread_entry is for backward compatibility only! Use thread_func */
|
||
|
|
||
|
extern fssh_thread_id fssh_spawn_thread(fssh_thread_func, const char *name,
|
||
|
int32_t priority, void *data);
|
||
|
extern fssh_status_t fssh_kill_thread(fssh_thread_id thread);
|
||
|
extern fssh_status_t fssh_resume_thread(fssh_thread_id thread);
|
||
|
extern fssh_status_t fssh_suspend_thread(fssh_thread_id thread);
|
||
|
|
||
|
extern fssh_status_t fssh_rename_thread(fssh_thread_id thread,
|
||
|
const char *newName);
|
||
|
extern fssh_status_t fssh_set_thread_priority (fssh_thread_id thread,
|
||
|
int32_t newPriority);
|
||
|
extern void fssh_exit_thread(fssh_status_t status);
|
||
|
extern fssh_status_t fssh_wait_for_thread (fssh_thread_id thread,
|
||
|
fssh_status_t *threadReturnValue);
|
||
|
extern fssh_status_t fssh_on_exit_thread(void (*callback)(void *),
|
||
|
void *data);
|
||
|
|
||
|
extern fssh_thread_id fssh_find_thread(const char *name);
|
||
|
|
||
|
extern fssh_status_t fssh_send_data(fssh_thread_id thread, int32_t code,
|
||
|
const void *buffer,
|
||
|
fssh_size_t bufferSize);
|
||
|
extern int32_t fssh_receive_data(fssh_thread_id *sender, void *buffer,
|
||
|
fssh_size_t bufferSize);
|
||
|
extern bool fssh_has_data(fssh_thread_id thread);
|
||
|
|
||
|
extern fssh_status_t fssh_snooze(fssh_bigtime_t amount);
|
||
|
extern fssh_status_t fssh_snooze_etc(fssh_bigtime_t amount, int timeBase,
|
||
|
uint32_t flags);
|
||
|
extern fssh_status_t fssh_snooze_until(fssh_bigtime_t time, int timeBase);
|
||
|
|
||
|
/* system private, use macros instead */
|
||
|
extern fssh_status_t _fssh_get_thread_info(fssh_thread_id id,
|
||
|
fssh_thread_info *info, fssh_size_t size);
|
||
|
extern fssh_status_t _fssh_get_next_thread_info(fssh_team_id team,
|
||
|
int32_t *cookie, fssh_thread_info *info,
|
||
|
fssh_size_t size);
|
||
|
|
||
|
#define fssh_get_thread_info(id, info) \
|
||
|
_fssh_get_thread_info((id), (info), sizeof(*(info)))
|
||
|
|
||
|
#define fssh_get_next_thread_info(team, cookie, info) \
|
||
|
_fssh_get_next_thread_info((team), (cookie), (info), sizeof(*(info)))
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------*/
|
||
|
/* Time */
|
||
|
|
||
|
extern uint32_t fssh_real_time_clock(void);
|
||
|
extern void fssh_set_real_time_clock(uint32_t secs_since_jan1_1970);
|
||
|
extern fssh_bigtime_t fssh_real_time_clock_usecs(void);
|
||
|
extern fssh_status_t fssh_set_timezone(char *timezone);
|
||
|
extern fssh_bigtime_t fssh_system_time(void); /* time since booting in microseconds */
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#endif // _FSSH_TYPES_H
|