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