227fe7d34a
- Moved scheduler listening interface to <listeners.h> and added more convenient to use templatized notification functions. - Added a listener mechanism for the wait objects (semaphores, condition variables, mutex, rw_lock). * system profiler: - Hopefully fixed locking issues related to notifying the profiler thread for good. We still had an inconsistent locking order, since the scheduler notification callbacks are invoked with the thread lock held and have to acquire the object lock then, while the other callbacks acquired the object lock first and as a side effect of ConditionVariable::NotifyOne() acquired the thread lock. Now we make sure the object lock is the innermost lock. - Track the number of dropped events due to a full buffer. _user_system_profiler_next_buffer() returns this count now. - When scheduling profiling events are requested also listen to wait objects and generate the respective profiling events. We send those events lazily and cache the infos to avoid resending an event for the same wait object. - When starting profiling we do now generate "thread scheduled" events for the already running threads. - _user_system_profiler_start(): Check whether the parameters pointer is a userland address at all. - The system_profiler_team_added event does now also contain the team's name. * Added a sem_get_name_unsafe() returning a semaphore's name. It is "unsafe", since the caller has to ensure that the semaphore exists and continues to exist as long as the returned name is used. * Adjusted the "profile" and "scheduling_recorder" according to the system profiling changes. The latter prints the number of dropped events, now. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30345 a95241bf-73f2-0310-859d-f6bbb57e9c96
55 lines
1.7 KiB
C
55 lines
1.7 KiB
C
/*
|
|
* Copyright 2002-2005, Axel Dörfler, axeld@pinc-software.de.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
|
* Distributed under the terms of the NewOS License.
|
|
*/
|
|
#ifndef KERNEL_SEM_H
|
|
#define KERNEL_SEM_H
|
|
|
|
|
|
#include <OS.h>
|
|
#include <thread.h>
|
|
|
|
struct kernel_args;
|
|
struct select_info;
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
extern status_t haiku_sem_init(struct kernel_args *args);
|
|
extern int sem_delete_owned_sems(team_id owner);
|
|
extern int32 sem_used_sems(void);
|
|
extern int32 sem_max_sems(void);
|
|
|
|
extern status_t select_sem(int32 object, struct select_info *info, bool kernel);
|
|
extern status_t deselect_sem(int32 object, struct select_info *info,
|
|
bool kernel);
|
|
|
|
extern sem_id create_sem_etc(int32 count, const char *name, team_id owner);
|
|
|
|
extern const char* sem_get_name_unsafe(sem_id id);
|
|
|
|
/* user calls */
|
|
sem_id _user_create_sem(int32 count, const char *name);
|
|
status_t _user_delete_sem(sem_id id);
|
|
status_t _user_acquire_sem(sem_id id);
|
|
status_t _user_acquire_sem_etc(sem_id id, int32 count, uint32 flags, bigtime_t timeout);
|
|
status_t _user_switch_sem(sem_id releaseSem, sem_id id);
|
|
status_t _user_switch_sem_etc(sem_id releaseSem, sem_id id, int32 count, uint32 flags, bigtime_t timeout);
|
|
status_t _user_release_sem(sem_id id);
|
|
status_t _user_release_sem_etc(sem_id id, int32 count, uint32 flags);
|
|
status_t _user_get_sem_count(sem_id id, int32* thread_count);
|
|
status_t _user_get_sem_info(sem_id, struct sem_info *, size_t);
|
|
status_t _user_get_next_sem_info(team_id, int32 *, struct sem_info *, size_t);
|
|
status_t _user_set_sem_owner(sem_id id, team_id team);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* KERNEL_SEM_H */
|