Merged signals-merge branch into trunk with the following changes:
* Reorganized the kernel locking related to threads and teams. * We now discriminate correctly between process and thread signals. Signal handlers have been moved to teams. Fixes #5679. * Implemented real-time signal support, including signal queuing, SA_SIGINFO support, sigqueue(), sigwaitinfo(), sigtimedwait(), waitid(), and the addition of the real-time signal range. Closes #1935 and #2695. * Gave SIGBUS a separate signal number. Fixes #6704. * Implemented <time.h> clock and timer support, and fixed/completed alarm() and [set]itimer(). Closes #5682. * Implemented support for thread cancellation. Closes #5686. * Moved send_signal() from <signal.h> to <OS.h>. Fixes #7554. * Lots over smaller more or less related changes. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42116 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright 2011, Ingo Weinhold, [email protected].
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _KERNEL_USER_EVENT_H
|
||||
#define _KERNEL_USER_EVENT_H
|
||||
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
#include <SupportDefs.h>
|
||||
|
||||
#include <DPC.h>
|
||||
#include <thread.h>
|
||||
|
||||
|
||||
namespace BKernel {
|
||||
|
||||
|
||||
struct Team;
|
||||
struct Thread;
|
||||
|
||||
|
||||
struct UserEvent {
|
||||
virtual ~UserEvent();
|
||||
|
||||
virtual status_t Fire() = 0;
|
||||
};
|
||||
|
||||
|
||||
struct SignalEvent : UserEvent {
|
||||
virtual ~SignalEvent();
|
||||
|
||||
void SetUserValue(union sigval userValue);
|
||||
|
||||
protected:
|
||||
struct EventSignal;
|
||||
|
||||
protected:
|
||||
SignalEvent(EventSignal* signal);
|
||||
|
||||
protected:
|
||||
EventSignal* fSignal;
|
||||
};
|
||||
|
||||
|
||||
struct TeamSignalEvent : SignalEvent {
|
||||
static TeamSignalEvent* Create(Team* team, uint32 signalNumber,
|
||||
int32 signalCode, int32 errorCode);
|
||||
|
||||
virtual status_t Fire();
|
||||
|
||||
private:
|
||||
TeamSignalEvent(Team* team,
|
||||
EventSignal* signal);
|
||||
|
||||
private:
|
||||
Team* fTeam;
|
||||
};
|
||||
|
||||
|
||||
struct ThreadSignalEvent : SignalEvent {
|
||||
static ThreadSignalEvent* Create(Thread* thread, uint32 signalNumber,
|
||||
int32 signalCode, int32 errorCode,
|
||||
pid_t sendingTeam);
|
||||
|
||||
virtual status_t Fire();
|
||||
|
||||
private:
|
||||
ThreadSignalEvent(Thread* thread,
|
||||
EventSignal* signal);
|
||||
|
||||
private:
|
||||
Thread* fThread;
|
||||
};
|
||||
|
||||
|
||||
struct CreateThreadEvent : UserEvent, private DPCCallback {
|
||||
~CreateThreadEvent();
|
||||
|
||||
static CreateThreadEvent* Create(
|
||||
const ThreadCreationAttributes& attributes);
|
||||
|
||||
virtual status_t Fire();
|
||||
|
||||
private:
|
||||
CreateThreadEvent(
|
||||
const ThreadCreationAttributes& attributes);
|
||||
|
||||
virtual void DoDPC(DPCQueue* queue);
|
||||
|
||||
private:
|
||||
ThreadCreationAttributes fCreationAttributes;
|
||||
char fThreadName[B_OS_NAME_LENGTH];
|
||||
bool fPendingDPC;
|
||||
};
|
||||
|
||||
|
||||
} // namespace BKernel
|
||||
|
||||
|
||||
using BKernel::CreateThreadEvent;
|
||||
using BKernel::SignalEvent;
|
||||
using BKernel::TeamSignalEvent;
|
||||
using BKernel::ThreadSignalEvent;
|
||||
using BKernel::UserEvent;
|
||||
|
||||
|
||||
#endif // _KERNEL_USER_EVENT_H
|
||||
Reference in New Issue
Block a user