Home | History | Annotate | Download | only in execserver
      1 #ifndef _XSEXECUTIONSERVER_HPP
      2 #define _XSEXECUTIONSERVER_HPP
      3 /*-------------------------------------------------------------------------
      4  * drawElements Quality Program Execution Server
      5  * ---------------------------------------------
      6  *
      7  * Copyright 2014 The Android Open Source Project
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  *//*!
     22  * \file
     23  * \brief Test Execution Server.
     24  *//*--------------------------------------------------------------------*/
     25 
     26 #include "xsDefs.hpp"
     27 #include "xsTcpServer.hpp"
     28 #include "xsTestDriver.hpp"
     29 #include "xsProtocol.hpp"
     30 #include "xsTestProcess.hpp"
     31 
     32 #include <vector>
     33 
     34 namespace xs
     35 {
     36 
     37 class ExecutionServer : public TcpServer
     38 {
     39 public:
     40 	enum RunMode
     41 	{
     42 		RUNMODE_SINGLE_EXEC	= 0,
     43 		RUNMODE_FOREVER,
     44 
     45 		RUNMODE_LAST
     46 	};
     47 
     48 							ExecutionServer			(xs::TestProcess* testProcess, deSocketFamily family, int port, RunMode runMode);
     49 							~ExecutionServer		(void);
     50 
     51 	ConnectionHandler*		createHandler			(de::Socket* socket, const de::SocketAddress& clientAddress);
     52 
     53 	TestDriver*				acquireTestDriver		(void);
     54 	void					releaseTestDriver		(TestDriver* driver);
     55 
     56 	void					connectionDone			(ConnectionHandler* handler);
     57 
     58 private:
     59 	TestDriver				m_testDriver;
     60 	de::Mutex				m_testDriverLock;
     61 	RunMode					m_runMode;
     62 };
     63 
     64 class MessageBuilder
     65 {
     66 public:
     67 							MessageBuilder		(void) { clear(); }
     68 							~MessageBuilder		(void) {}
     69 
     70 	void					read				(ByteBuffer& buffer);
     71 	void					clear				(void);
     72 
     73 	bool					isComplete			(void) const;
     74 	MessageType				getMessageType		(void) const	{ return m_messageType;	}
     75 	size_t					getMessageSize		(void) const	{ return m_messageSize; }
     76 	const deUint8*			getMessageData		(void) const;
     77 	size_t					getMessageDataSize	(void) const;
     78 
     79 private:
     80 	std::vector<deUint8>	m_buffer;
     81 	MessageType				m_messageType;
     82 	size_t					m_messageSize;
     83 };
     84 
     85 class ExecutionRequestHandler : public ConnectionHandler
     86 {
     87 public:
     88 								ExecutionRequestHandler			(ExecutionServer* server, de::Socket* socket);
     89 								~ExecutionRequestHandler		(void);
     90 
     91 protected:
     92 	void						handle							(void);
     93 
     94 private:
     95 								ExecutionRequestHandler			(const ExecutionRequestHandler& handler);
     96 	ExecutionRequestHandler&	operator=						(const ExecutionRequestHandler& handler);
     97 
     98 	void						processSession					(void);
     99 	void						processMessage					(MessageType type, const deUint8* data, size_t dataSize);
    100 
    101 	inline TestDriver*			getTestDriver					(void) { if (!m_testDriver) acquireTestDriver(); return m_testDriver; }
    102 	void						acquireTestDriver				(void);
    103 
    104 	void						initKeepAlives					(void);
    105 	void						keepAliveReceived				(void);
    106 	void						pollKeepAlives					(void);
    107 
    108 	bool						receive							(void);
    109 	bool						send							(void);
    110 
    111 	ExecutionServer*			m_execServer;
    112 	TestDriver*					m_testDriver;
    113 
    114 	ByteBuffer					m_bufferIn;
    115 	ByteBuffer					m_bufferOut;
    116 
    117 	bool						m_run;
    118 	MessageBuilder				m_msgBuilder;
    119 
    120 	// \todo [2011-09-30 pyry] Move to some watchdog class instead.
    121 	deUint64					m_lastKeepAliveSent;
    122 	deUint64					m_lastKeepAliveReceived;
    123 
    124 	std::vector<deUint8>		m_sendRecvTmpBuf;
    125 };
    126 
    127 } // xs
    128 
    129 #endif // _XSEXECUTIONSERVER_HPP
    130