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