do_accept();
}
+void dcm_server::start_timer()
+{
+ LOGD("Number of active connections: " << fSessionCounter);
+ if(fSessionCounter > 0)
+ return;
+
+ LOGD("No active connections, server will be closed after few seconds");
+ fTimer.expires_from_now(boost::posix_time::seconds(10));
+ /* operation_aborted error is returned whenever we cancel the timer or we reset the timer using expires_from_now function */
+ fTimer.async_wait([this](const boost::system::error_code &error) {
+ if(error != boost::asio::error::operation_aborted) {
+ LOGD("No active connections, server will be closed");
+ fService.stop();
+ }
+ });
+}
+
void dcm_server::do_accept()
{
auto self(this->shared_from_this());
std::shared_ptr<dcm_session> session;
try {
- session = std::make_shared<dcm_session>(fService, fTimer, shared_from_this(),
- fSoResolver, fCynaraInstance, fSessionCounter);
+ session = std::make_shared<dcm_session>(fService, shared_from_this(),
+ fSoResolver, fCynaraInstance);
} catch(std::bad_alloc& ex) {
LOGE("Out of memory when trying to allocate new session");
return;
}
LOGD("Start accepting connections");
- session->start_timer();
+ self->start_timer();
fAcceptor.async_accept(session->socket(),
[session, self](boost::system::error_code error_code)
{
if(!error_code) {
- LOGD("Accepted session");
+ self->fSessionCounter++;
+ LOGD("Accepted session, number of active connections: " << self->fSessionCounter);
+ self->fTimer.cancel();
session->start();
+ self->fSessionCounter--;
} else {
LOGE("Can't accept new session " << error_code);
}
private:
void do_accept();
+ void start_timer();
private:
boost::asio::io_service& fService;
#include "log.h"
dcm_session::dcm_session(boost::asio::io_service& io_service,
- boost::asio::deadline_timer& timer,
const std::shared_ptr<dcm_server>& server,
std::shared_ptr<so_resolver> soResolver,
- cynara* cynaraInstance,
- unsigned int& sessionCounter) :
- fService(io_service),
- fTimer(timer),
+ cynara* cynaraInstance) :
fSocket(io_service),
fServer(server),
fSoResolver(soResolver),
- fCynaraInstance(cynaraInstance),
- fSessionCounter(sessionCounter)
+ fCynaraInstance(cynaraInstance)
{
LOGD("Create new session object " << this);
- fSessionCounter++;
}
dcm_session::~dcm_session()
LOGD("Accepted connection with socket " << fSocket.native_handle());
if(verify_privileges(handle)) {
- stop_timer();
do_receive();
} else {
LOGE("Client privilege check failure. Disconnect");
- start_timer();
}
}
-void dcm_session::start_timer()
-{
- fSessionCounter--;
- LOGD("Number of active connections: " << fSessionCounter);
-
- if(fSessionCounter == 0) {
- LOGD("No active connections, server will be closed after few seconds");
- fTimer.expires_from_now(boost::posix_time::seconds(10));
- /* operation_aborted error is returned whenever we cancel the timer or we reset the timer using expires_from_now function */
- fTimer.async_wait([this](const boost::system::error_code &error) {
- if(error != boost::asio::error::operation_aborted) {
- LOGD("No active connections, server will be closed");
- fService.stop();
- }
- });
- }
-}
-
-void dcm_session::stop_timer()
-{
- fSessionCounter++;
- LOGD("Number of active connections: " << fSessionCounter);
-
- fTimer.cancel();
- LOGD("Timer cancelled");
-}
-
void dcm_session::do_receive() noexcept
{
try {
} else {
LOGE("Client disconnected: " << error);
// Connection object will be released by shared ptr
- start_timer();
}
});
} catch(std::exception& ex) {
{
public:
dcm_session(boost::asio::io_service& io_service,
- boost::asio::deadline_timer& timer,
const std::shared_ptr<dcm_server>& server,
std::shared_ptr<so_resolver> soResolver,
- cynara* cynaraInstance,
- unsigned int& sessionCounter);
+ cynara* cynaraInstance);
~dcm_session();
void start();
- void start_timer();
- void stop_timer();
inline boost::asio::local::stream_protocol::socket& socket() {
return fSocket;
void handle_sign_request(const SignRequest& message);
private:
- boost::asio::io_service& fService;
- boost::asio::deadline_timer& fTimer;
boost::asio::local::stream_protocol::socket fSocket;
protobuf_async_message_serialization fSerializer;
protobuf_async_message_deserialization fDeserializer;
std::shared_ptr<so_resolver> fSoResolver;
uint64_t fCookie = 0;
cynara* fCynaraInstance;
- unsigned int& fSessionCounter;
};
#endif /* DCM_DAEMON_DCM_SESSION_H_ */