1/*
2 * Copyright 2005-2016, 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
17class MessageLooper : public BLocker {
18public:
19								MessageLooper(const char* name);
20	virtual						~MessageLooper();
21
22	virtual	status_t			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
31									{ return fDeathSemaphore; }
32
33	virtual	port_id				MessagePort() const = 0;
34
35	static	status_t			WaitForQuit(sem_id semaphore,
36									bigtime_t timeout = B_INFINITE_TIMEOUT);
37
38private:
39	virtual	void				_PrepareQuit();
40	virtual	void				_GetLooperName(char* name, size_t length);
41	virtual	void				_DispatchMessage(int32 code,
42									BPrivate::LinkReceiver& link);
43	virtual	void				_MessageLooper();
44
45protected:
46	static	int32				_message_thread(void*_looper);
47
48protected:
49			const char*			fName;
50			thread_id			fThread;
51			BPrivate::PortLink	fLink;
52			bool				fQuitting;
53			sem_id				fDeathSemaphore;
54};
55
56
57static const int32 kMsgQuitLooper = 'quit';
58
59
60#endif	/* MESSAGE_LOOPER_H */
61