xref: /haiku/src/servers/app/MessageLooper.h (revision d3d8b26997fac34a84981e6d2b649521de2cc45a)
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, bigtime_t timeout = B_INFINITE_TIMEOUT);
26 		thread_id		Thread() const { return fThread; }
27 		bool			IsQuitting() const { return fQuitting; }
28 		sem_id			DeathSemaphore() const { return fDeathSemaphore; }
29 
30 		virtual port_id	MessagePort() const = 0;
31 
32 		static status_t	WaitForQuit(sem_id semaphore,
33 							bigtime_t timeout = B_INFINITE_TIMEOUT);
34 
35 	private:
36 		virtual void	_PrepareQuit();
37 		virtual void	_GetLooperName(char* name, size_t length);
38 		virtual void	_DispatchMessage(int32 code, BPrivate::LinkReceiver &link);
39 		virtual void	_MessageLooper();
40 
41 	protected:
42 		static int32	_message_thread(void *_looper);
43 
44 	protected:
45 		thread_id		fThread;
46 		BPrivate::PortLink fLink;
47 		bool			fQuitting;
48 		sem_id			fDeathSemaphore;
49 };
50 
51 static const int32 kMsgQuitLooper = 'quit';
52 
53 #endif	/* MESSAGE_LOOPER_H */
54