xref: /haiku/src/servers/registrar/ShutdownProcess.h (revision 2222d0559df303a9846a2fad53741f8b20b14d7c)
1 /*
2  * Copyright 2005, Ingo Weinhold, bonefish@users.sf.net.
3  * Distributed under the terms of the MIT License.
4  *
5  * Manages the shutdown process.
6  */
7 #ifndef SHUTDOWN_PROCESS_H
8 #define SHUTDOWN_PROCESS_H
9 
10 #include <hash_set>
11 
12 #include <Locker.h>
13 #include <Looper.h>
14 
15 #include "AppInfoList.h"
16 #include "EventMaskWatcher.h"
17 #include "RosterAppInfo.h"
18 
19 #if __GNUC__ >= 4
20 using __gnu_cxx::hash_set;
21 #endif
22 
23 
24 class EventQueue;
25 class TRoster;
26 
27 // Note: EventMaskWatcher is inherited public due to a gcc bug/C++ feature:
28 // Once cast into a Watcher dynamic_cast<>()ing it back into an
29 // EventMaskWatcher fails otherwise.
30 class ShutdownProcess : public BLooper, public EventMaskWatcher {
31 public:
32 								ShutdownProcess(TRoster* roster,
33 									EventQueue* eventQueue);
34 	virtual						~ShutdownProcess();
35 
36 			status_t			Init(BMessage* request);
37 
38 	virtual	void				MessageReceived(BMessage* message);
39 
40 	static	void				SendReply(BMessage* request, status_t error);
41 
42 private:
43 			void				_SendReply(status_t error);
44 
45 			void				_NegativeQuitRequestReply(thread_id thread);
46 
47 			void				_PrepareShutdownMessage(BMessage& message) const;
48 			status_t			_ShutDown();
49 
50 			status_t			_PushEvent(uint32 eventType, team_id team,
51 									int32 phase);
52 			status_t			_GetNextEvent(uint32& eventType, team_id& team,
53 									int32& phase, bool block);
54 
55 			void				_SetPhase(int32 phase);
56 			void				_ScheduleTimeoutEvent(bigtime_t timeout,
57 									team_id team = -1);
58 
59 			bool				_LockAppLists();
60 			void				_UnlockAppLists();
61 
62 			void				_InitShutdownWindow();
63 			void				_SetShowShutdownWindow(bool show);
64 			void				_AddShutdownWindowApps(AppInfoList& infos);
65 			void				_RemoveShutdownWindowApp(team_id team);
66 			void				_SetShutdownWindowCurrentApp(team_id team);
67 			void				_SetShutdownWindowText(const char* text);
68 			void				_SetShutdownWindowCancelButtonEnabled(
69 									bool enabled);
70 			void				_SetShutdownWindowKillButtonEnabled(
71 									bool enabled);
72 			void				_SetShutdownWindowWaitForShutdown();
73 			void				_SetShutdownWindowWaitForAbortedOK();
74 
75 	static	status_t			_WorkerEntry(void* data);
76 			status_t			_Worker();
77 
78 			void				_WorkerDoShutdown();
79 			bool				_WaitForApp(team_id team, AppInfoList* list,
80 									bool systemApps);
81 			void				_QuitApps(AppInfoList& list, bool systemApps);
82 			void				_QuitBackgroundApps();
83 			void				_WaitForBackgroundApps();
84 			void				_KillBackgroundApps();
85 			void				_QuitNonApps();
86 			void				_QuitBlockingApp(AppInfoList& list, team_id team,
87 									const char* appName, bool cancelAllowed);
88 			void				_DisplayAbortingApp(team_id team);
89 			void				_WaitForDebuggedTeams();
90 
91 private:
92 	class TimeoutEvent;
93 	class InternalEvent;
94 	struct InternalEventList;
95 	class QuitRequestReplyHandler;
96 	class ShutdownWindow;
97 
98 	friend class QuitRequestReplyHandler;
99 
100 			BLocker				fWorkerLock;
101 									// protects fields shared by looper
102 									// and worker
103 			BMessage*			fRequest;
104 			TRoster*			fRoster;
105 			EventQueue*			fEventQueue;
106 			hash_set<team_id>	fVitalSystemApps;
107 			AppInfoList			fSystemApps;
108 			AppInfoList			fUserApps;
109 			AppInfoList			fBackgroundApps;
110 			hash_set<team_id>	fDebuggedTeams;
111 			TimeoutEvent*		fTimeoutEvent;
112 			InternalEventList*	fInternalEvents;
113 			sem_id				fInternalEventSemaphore;
114 			QuitRequestReplyHandler* fQuitRequestReplyHandler;
115 			thread_id			fWorker;
116 			int32				fCurrentPhase;
117 			status_t			fShutdownError;
118 			bool				fHasGUI;
119 			bool				fReboot;
120 			bool				fRequestReplySent;
121 			ShutdownWindow*		fWindow;
122 };
123 
124 #endif	// SHUTDOWN_PROCESS_H
125