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