namespace SecurityManager {
struct GenericEvent {
+ GenericEvent() = default;
+ GenericEvent(const GenericEvent &) = delete;
+ GenericEvent(GenericEvent &&) = default;
+
+ GenericEvent &operator=(const GenericEvent &) = delete;
+ GenericEvent &operator=(GenericEvent &&) = default;
virtual ~GenericEvent(){}
};
}
virtual ServiceDescriptionVector GetServiceDescription() = 0;
- virtual void Event(const AcceptEvent &event) = 0;
- virtual void Event(const WriteEvent &event) = 0;
- virtual void Event(const ReadEvent &event) = 0;
- virtual void Event(const CloseEvent &event) = 0;
+ virtual void Event(AcceptEvent &&event) = 0;
+ virtual void Event(WriteEvent &&event) = 0;
+ virtual void Event(ReadEvent &&event) = 0;
+ virtual void Event(CloseEvent &&event) = 0;
virtual void Start() {};
virtual void Stop() {};
void EventInternal##eventType(const eventType &event)
#define DECLARE_THREAD_EVENT(eventType, methodName) \
- void Event(const eventType &event) { \
+ void Event(eventType &&event) { \
SecurityManager::ServiceThread<ParentClassName>:: \
- Event(event, \
+ Event(std::move(event), \
this, \
&ParentClassName::methodName); \
}
}
template <class T>
- void Event(const T &event,
+ void Event(T &&event,
Service *servicePtr,
- void (Service::*serviceFunction)(const T &))
+ void (Service::*serviceFunction)(T &&))
{
EventDescription description;
description.serviceFunctionPtr =
reinterpret_cast<void (Service::*)(void*)>(serviceFunction);
description.servicePtr = servicePtr;
description.eventFunctionPtr = &ServiceThread::EventCall<T>;
- description.eventPtr = new T(event);
+ description.eventPtr = new T(std::move(event));
{
std::lock_guard<std::mutex> lock(m_eventQueueMutex);
m_eventQueue.push(description);
struct EventDescription {
void (Service::*serviceFunctionPtr)(void *);
Service *servicePtr;
- void (ServiceThread::*eventFunctionPtr)(const EventDescription &event);
+ void (ServiceThread::*eventFunctionPtr)(EventDescription &event);
GenericEvent* eventPtr;
};
template <class T>
- void EventCall(const EventDescription &desc) {
- auto fun = reinterpret_cast<void (Service::*)(const T&)>(desc.serviceFunctionPtr);
- const T& eventLocale = *(static_cast<T*>(desc.eventPtr));
- (desc.servicePtr->*fun)(eventLocale);
+ void EventCall(EventDescription &desc) {
+ auto fun = reinterpret_cast<void (Service::*)(T&&)>(desc.serviceFunctionPtr);
+ T& eventLocale = *(static_cast<T*>(desc.eventPtr));
+ (desc.servicePtr->*fun)(std::move(eventLocale));
}
static void ThreadLoopStatic(ServiceThread *ptr) {
ServiceDescriptionVector GetServiceDescription() {
return ServiceDescriptionVector();
}
- void Event(const AcceptEvent &event) { (void)event; }
- void Event(const WriteEvent &event) { (void)event; }
- void Event(const ReadEvent &event) { (void)event; }
- void Event(const CloseEvent &event) { (void)event; }
+ void Event(AcceptEvent &&) { }
+ void Event(WriteEvent &&) { }
+ void Event(ReadEvent &&) { }
+ void Event(CloseEvent &&) { }
};
struct SignalService : public GenericSocketService {
return ServiceDescriptionVector();
}
- void Event(const AcceptEvent &event) { (void)event; } // not supported
- void Event(const WriteEvent &event) { (void)event; } // not supported
- void Event(const CloseEvent &event) { (void)event; } // not supported
+ void Event(AcceptEvent &&) { } // not supported
+ void Event(WriteEvent &&) { } // not supported
+ void Event(CloseEvent &&) { } // not supported
- void Event(const ReadEvent &event) {
+ void Event(ReadEvent &&event) {
LogDebug("Get signal information");
if (sizeof(struct signalfd_siginfo) != event.rawBuffer.size()) {
ConnectionID{client, desc.counter},
desc.interfaceID,
Credentials::getCredentialsFromSocket(client));
- desc.service->Event(event);
+ desc.service->Event(std::move(event));
}
void SocketManager::ReadyForRead(int sock) {
CloseSocket(sock);
} else if (size >= 0) {
event.rawBuffer.resize(size);
- desc.service->Event(event);
+ desc.service->Event(std::move(event));
} else if (size == -1) {
int err = errno;
switch (err) {
event.size = result;
event.left = desc.sendMsgDataQueue.size();
- desc.service->Event(event);
+ desc.service->Event(std::move(event));
}
void SocketManager::ReadyForWriteBuffer(int sock) {
event.size = result;
event.left = desc.rawBuffer.size();
- desc.service->Event(event);
+ desc.service->Event(std::move(event));
}
void SocketManager::ReadyForWrite(int sock) {
desc.sendMsgDataQueue.pop();
if (service)
- service->Event(event);
+ service->Event(std::move(event));
else
LogError("Critical! Service is NULL! This should never happend!");
{
}
-void BaseService::accept(const AcceptEvent &event)
+void BaseService::accept(AcceptEvent &&event)
{
LogDebug("Accept event. ConnectionID.sock: " << event.connectionID.sock <<
" ConnectionID.counter: " << event.connectionID.counter <<
m_connectionInfoMap.emplace(
std::make_pair(
event.connectionID.counter,
- ConnectionInfo(event.interfaceID, event.creds)));
+ ConnectionInfo(event.interfaceID, std::move(event.creds))));
}
-void BaseService::write(const WriteEvent &event)
+void BaseService::write(WriteEvent &&event)
{
LogDebug("WriteEvent. ConnectionID: " << event.connectionID.sock <<
" Size: " << event.size <<
m_serviceManager->Close(event.connectionID);
}
-void BaseService::process(const ReadEvent &event)
+void BaseService::process(ReadEvent &&event)
{
LogDebug("Read event for counter: " << event.connectionID.counter);
auto &info = m_connectionInfoMap.at(event.connectionID.counter);
while (processOne(event.connectionID, info.buffer, info.interfaceID));
}
-void BaseService::close(const CloseEvent &event)
+void BaseService::close(CloseEvent &&event)
{
LogDebug("CloseEvent. ConnectionID: " << event.connectionID.sock);
m_connectionInfoMap.erase(event.connectionID.counter);
DECLARE_THREAD_EVENT(ReadEvent, process)
DECLARE_THREAD_EVENT(CloseEvent, close)
- void accept(const AcceptEvent &event);
- void write(const WriteEvent &event);
- void process(const ReadEvent &event);
- void close(const CloseEvent &event);
+ void accept(AcceptEvent &&event);
+ void write(WriteEvent &&event);
+ void process(ReadEvent &&event);
+ void close(CloseEvent &&event);
void Start();
void Stop();