xref: /haiku/headers/private/kernel/UserEvent.h (revision c80809a3ab0b0a2ce53ea861a2b00ace24ff452d)
1 /*
2  * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _KERNEL_USER_EVENT_H
6 #define _KERNEL_USER_EVENT_H
7 
8 
9 #include <signal.h>
10 
11 #include <SupportDefs.h>
12 
13 #include <DPC.h>
14 #include <thread.h>
15 
16 
17 namespace BKernel {
18 
19 
20 struct Team;
21 struct Thread;
22 
23 
24 struct UserEvent {
25 	virtual						~UserEvent();
26 
27 	virtual	status_t			Fire() = 0;
28 };
29 
30 
31 struct SignalEvent : UserEvent {
32 	virtual						~SignalEvent();
33 
34 			void				SetUserValue(union sigval userValue);
35 
36 protected:
37 			struct EventSignal;
38 
39 protected:
40 								SignalEvent(EventSignal* signal);
41 
42 protected:
43 			EventSignal*		fSignal;
44 };
45 
46 
47 struct TeamSignalEvent : SignalEvent {
48 	static	TeamSignalEvent*	Create(Team* team, uint32 signalNumber,
49 									int32 signalCode, int32 errorCode);
50 
51 	virtual	status_t			Fire();
52 
53 private:
54 								TeamSignalEvent(Team* team,
55 									EventSignal* signal);
56 
57 private:
58 			Team*				fTeam;
59 };
60 
61 
62 struct ThreadSignalEvent : SignalEvent {
63 	static	ThreadSignalEvent*	Create(Thread* thread, uint32 signalNumber,
64 									int32 signalCode, int32 errorCode,
65 									pid_t sendingTeam);
66 
67 	virtual	status_t			Fire();
68 
69 private:
70 								ThreadSignalEvent(Thread* thread,
71 									EventSignal* signal);
72 
73 private:
74 			Thread*				fThread;
75 };
76 
77 
78 struct CreateThreadEvent : UserEvent, private DPCCallback {
79 								~CreateThreadEvent();
80 
81 	static	CreateThreadEvent*	Create(
82 									const ThreadCreationAttributes& attributes);
83 
84 	virtual	status_t			Fire();
85 
86 private:
87 								CreateThreadEvent(
88 									const ThreadCreationAttributes& attributes);
89 
90 	virtual	void				DoDPC(DPCQueue* queue);
91 
92 private:
93 			ThreadCreationAttributes fCreationAttributes;
94 			char				fThreadName[B_OS_NAME_LENGTH];
95 			bool				fPendingDPC;
96 };
97 
98 
99 }	// namespace BKernel
100 
101 
102 using BKernel::CreateThreadEvent;
103 using BKernel::SignalEvent;
104 using BKernel::TeamSignalEvent;
105 using BKernel::ThreadSignalEvent;
106 using BKernel::UserEvent;
107 
108 
109 #endif	// _KERNEL_USER_EVENT_H
110