You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sems/apps/xmlrpc2di/MultithreadXmlRpcServer.h

79 lines
1.7 KiB

/**
* Written by Jae An (jae_young_an@yahoo.com)
* http://sourceforge.net/forum/forum.php?thread_id=910224&forum_id=240495
*
* adapted for SEMS by Stefan Sayer stefan.sayer at iptego.com
*/
#ifndef _MULTI_THREAD_XMLRPCSERVER_H_
#define _MULTI_THREAD_XMLRPCSERVER_H_
#include <AmThread.h>
#include "XmlRpcServer.h"
#include "XmlRpcDispatch.h"
#include "AmEventQueue.h"
#include <queue>
#include <vector>
namespace XmlRpc {
class MultithreadXmlRpcServer;
class WorkerThread
: public AmThread,
public AmEventQueueInterface
{
MultithreadXmlRpcServer* chief;
AmCondition<bool> runcond;
AmCondition<bool> running;
public:
WorkerThread(MultithreadXmlRpcServer* chief);
void addXmlRpcSource(XmlRpcSource* source,unsigned eventMask); // call this method to make it run
void wakeup();
void run();
void on_stop();
void postEvent(AmEvent* ev);
private:
XmlRpcDispatch dispatcher;
};
#define MAX_THREAD_SIZE 8
//! Multi-threaded sever class to handle XML RPC requests
class MultithreadXmlRpcServer
: public XmlRpcServer {
public:
//! Create a server object.
MultithreadXmlRpcServer();
//! Destructor.
virtual ~MultithreadXmlRpcServer();
/* report back from work */
void reportBack(WorkerThread* thr);
void createThreads(unsigned int n);
protected:
//! Accept a client connection request
virtual void acceptConnection();
private:
AmMutex waiting_mut;
std::queue<WorkerThread*> waiting;
AmCondition<bool> have_waiting;
std::vector<WorkerThread*> workers;
WorkerThread* getIdleThread();
};
} // namespace XmlRpc
#endif