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:
MessageBuilder(void)67 							MessageBuilder		(void) { clear(); }
~MessageBuilder(void)68 							~MessageBuilder		(void) {}
69 
70 	void					read				(ByteBuffer& buffer);
71 	void					clear				(void);
72 
73 	bool					isComplete			(void) const;
getMessageType(void) const74 	MessageType				getMessageType		(void) const	{ return m_messageType;	}
getMessageSize(void) const75 	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 
getTestDriver(void)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