xref: /haiku/src/servers/app/MessageLooper.h (revision fce4895d1884da5ae6fb299d23c735c598e690b1)
1 /*
2  * Copyright 2005, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Axel Dörfler, axeld@pinc-software.de
7  */
8 #ifndef MESSAGE_LOOPER_H
9 #define MESSAGE_LOOPER_H
10 
11 
12 #include <PortLink.h>
13 #include <Locker.h>
14 #include <OS.h>
15 
16 
17 class MessageLooper : public BLocker {
18 	public:
19 		MessageLooper(const char* name);
20 		virtual ~MessageLooper();
21 
22 		virtual	bool	Run();
23 		virtual	void	Quit();
24 
25 		status_t		PostMessage(int32 code,
26 							bigtime_t timeout = B_INFINITE_TIMEOUT);
27 
28 		thread_id		Thread() const { return fThread; }
29 		bool			IsQuitting() const { return fQuitting; }
30 		sem_id			DeathSemaphore() const { return fDeathSemaphore; }
31 
32 		virtual port_id	MessagePort() const = 0;
33 
34 		static status_t	WaitForQuit(sem_id semaphore,
35 							bigtime_t timeout = B_INFINITE_TIMEOUT);
36 
37 	private:
38 		virtual void	_PrepareQuit();
39 		virtual void	_GetLooperName(char* name, size_t length);
40 		virtual void	_DispatchMessage(int32 code, BPrivate::LinkReceiver &link);
41 		virtual void	_MessageLooper();
42 
43 	protected:
44 		static int32	_message_thread(void *_looper);
45 
46 	protected:
47 		thread_id		fThread;
48 		BPrivate::PortLink fLink;
49 		bool			fQuitting;
50 		sem_id			fDeathSemaphore;
51 };
52 
53 static const int32 kMsgQuitLooper = 'quit';
54 
55 #endif	/* MESSAGE_LOOPER_H */
56