Skip to content
Snippets Groups Projects
Commit 4b552b68 authored by Steven Murray's avatar Steven Murray
Browse files

Removed dead mediachanger/reactor directory

parent 70e4486c
No related branches found
No related tags found
No related merge requests found
......@@ -15,7 +15,6 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
cmake_minimum_required (VERSION 2.6)
add_subdirectory(reactor)
add_subdirectory(castorrmc)
find_package(openssl REQUIRED)
find_package(Protobuf3 REQUIRED)
......
# This file is part of the Castor project.
# See http://castor.web.cern.ch/castor
#
# Copyright (C) 2003 CERN
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
# @author Castor Dev team, castor-dev@cern.ch
#
cmake_minimum_required (VERSION 2.6)
################################################################################
# Rules to build the reactor code that is common to both rmcd and tapeserverd
################################################################################
set (REACTOR_SRC_FILES
ZMQPollEventHandler.cpp
ZMQReactor.cpp)
add_library (ctareactor ${REACTOR_SRC_FILES})
set_target_properties (ctareactor PROPERTIES
COMPILE_FLAGS -I/usr/include/CDK
COMPILE_DEFINITIONS LINUX)
target_link_libraries (ctareactor ctacommon ctamediachanger zmq)
/******************************************************************************
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
*
* Copyright (C) 2003 CERN
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* @author Castor Dev team, castor-dev@cern.ch
*****************************************************************************/
#include "ZMQPollEventHandler.hpp"
//------------------------------------------------------------------------------
// destructor
//------------------------------------------------------------------------------
cta::mediachanger::reactor::ZMQPollEventHandler::~ZMQPollEventHandler() {
}
/******************************************************************************
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
*
* Copyright (C) 2003 CERN
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* @author Castor Dev team, castor-dev@cern.ch
*****************************************************************************/
#pragma once
#include "common/exception/Exception.hpp"
#include <zmq.h>
namespace cta {
namespace mediachanger {
namespace reactor {
/**
* Handles the events that occur on a poll() file descriptor.
*
* This class is part of an implementation of the Reactor architecture pattern
* described in the following book:
*
* Pattern-Oriented Software Architecture Volume 2
* Patterns for Concurrent and Networked Objects
* Authors: Schmidt, Stal, Rohnert and Buschmann
* Publication date: 2000
* ISBN 0-471-60695-2
*/
class ZMQPollEventHandler {
public:
/**
* Destructor.
*/
virtual ~ZMQPollEventHandler() = 0;
/**
* Returns the human-readable name this event handler.
*/
virtual std::string getName() const = 0;
/**
* Fills the specified poll file-descriptor ready to be used in a call to
* poll().
*/
virtual void fillPollFd(zmq_pollitem_t &pollitem) =0;
/**
* Handles the specified event.
*
* @param fd The poll file-descriptor describing the event.
* @return true if the event handler should be removed from and deleted by
* the reactor.
*/
virtual bool handleEvent(const zmq_pollitem_t &fd)=0;
}; // class ZMQPollEventHandler
} // namespace reactor
} // namespace tape
} // namespace cta
/******************************************************************************
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
*
* Copyright (C) 2003 CERN
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* @author Castor Dev team, castor-dev@cern.ch
*****************************************************************************/
#include "common/log/log.hpp"
#include "ZMQReactor.hpp"
#include "ZMQPollEventHandler.hpp"
#include "common/utils/utils.hpp"
#include "common/log/SyslogLogger.hpp"
#include <algorithm>
namespace{
bool operator==(const zmq_pollitem_t& a,const zmq_pollitem_t& b){
if( (a.fd==b.fd && a.fd!= -1 && b.fd != -1) ||
(a.socket==b.socket && a.socket!=NULL && b.socket != NULL) ){
return true;
}
return false;
}
}
//------------------------------------------------------------------------------
// constructor
//------------------------------------------------------------------------------
cta::mediachanger::reactor::ZMQReactor::ZMQReactor(cta::log::Logger &l):m_log(l) {
}
//------------------------------------------------------------------------------
// destructor
//------------------------------------------------------------------------------
cta::mediachanger::reactor::ZMQReactor::~ZMQReactor() {
clear();
}
//------------------------------------------------------------------------------
// clear
//------------------------------------------------------------------------------
void cta::mediachanger::reactor::ZMQReactor::clear() {
for(HandlerMap::iterator it=m_handlers.begin();it!=m_handlers.end();++it){
delete it->second;
}
m_handlers.clear();
}
//------------------------------------------------------------------------------
// registerHandler
//------------------------------------------------------------------------------
void cta::mediachanger::reactor::ZMQReactor::registerHandler(
ZMQPollEventHandler *const handler) {
zmq_pollitem_t item;
handler->fillPollFd(item);
std::ostringstream socketInHex;
socketInHex << std::hex << item.socket;
std::list<log::Param> params = {log::Param("fd", item.fd),
log::Param("socket", socketInHex.str())};
//log::write(LOG_DEBUG, "ZMQReactor registering a new handler", params);
m_log(LOG_DEBUG, "ZMQReactor registering a new handler", params);
checkDoubleRegistration(item);
m_handlers.push_back(std::make_pair(item,handler));
}
//------------------------------------------------------------------------------
// checkDoubleRegistration
//------------------------------------------------------------------------------
void cta::mediachanger::reactor::ZMQReactor::checkDoubleRegistration(
const zmq_pollitem_t &item) const {
for(HandlerMap::const_iterator it=m_handlers.begin(); it!=m_handlers.end();
++it) {
const std::pair<zmq_pollitem_t, ZMQPollEventHandler*> &maplet = *it;
if(item == maplet.first) {
cta::exception::Exception ex;
ex.getMessage() << "ZMQReactor detected a double registration: fd=" <<
item.fd << " socket=" << std::hex << item.socket;
throw ex;
}
}
}
//------------------------------------------------------------------------------
// handleEvents
//------------------------------------------------------------------------------
void cta::mediachanger::reactor::ZMQReactor::handleEvents(const int timeout) {
//it should not bring any copy, thanks to NRVO
std::vector<zmq_pollitem_t> pollFds=buildPollFds();
// Please note that we are relying on the fact that the file descriptors of
// the vector are stored contiguously
const int pollRc = zmq_poll(&pollFds[0], pollFds.size(), timeout);
if(0 <= pollRc){
for(std::vector<zmq_pollitem_t>::const_iterator it=pollFds.begin();
it!=pollFds.end(); ++it) {
const zmq_pollitem_t &pollFd = *it;
if(0 != pollFd.revents) {
handleEvent(pollFd);
}
}
} else if(0 > pollRc) {
const std::string message = utils::errnoToString(errno);
std::list<log::Param> params = {log::Param("message", message)};
m_log(LOG_ERR, "Failed to handle I/O event: zmq_poll() failed", params);
}
}
//------------------------------------------------------------------------------
// handleEvent
//------------------------------------------------------------------------------
void cta::mediachanger::reactor::ZMQReactor::handleEvent(
const zmq_pollitem_t &pollFd) {
// Find and dispatch the appropriate handler if there is a pending event
if(pollFd.revents & ZMQ_POLLIN) {
HandlerMap::iterator handlerItor = findHandler(pollFd);
if(handlerItor != m_handlers.end()) {
ZMQPollEventHandler *const handler = handlerItor->second;
const bool removeAndDeleteHandler = handler->handleEvent(pollFd);
if(removeAndDeleteHandler) {
m_handlers.erase(handlerItor);
delete(handler);
}
}else {
std::list<log::Param> params;
params.push_back(log::Param("fd",pollFd.fd));
params.push_back(log::Param("socket",pollFd.socket));
m_log(LOG_ERR, "Event on some poll, but no handler to match it", params);
}
}
}
//------------------------------------------------------------------------------
// findHandler
//------------------------------------------------------------------------------
cta::mediachanger::reactor::ZMQReactor::HandlerMap::iterator
cta::mediachanger::reactor::ZMQReactor::findHandler(const zmq_pollitem_t& pollfd) {
for(HandlerMap::iterator it=m_handlers.begin();it!=m_handlers.end();++it){
// Use overloaded == to compare zmq_pollitem_t references
if(pollfd==it->first){
return it;
}
}
return m_handlers.end();
}
//------------------------------------------------------------------------------
// buildPollFds
//------------------------------------------------------------------------------
std::vector<zmq_pollitem_t> cta::mediachanger::reactor::ZMQReactor::buildPollFds()
const {
std::vector<zmq_pollitem_t> pollFds;
pollFds.reserve(m_handlers.size());
for(HandlerMap::const_iterator it=m_handlers.begin();it!=m_handlers.end();
++it) {
ZMQPollEventHandler *const handler = it->second;
zmq_pollitem_t pollFd;
handler->fillPollFd(pollFd);
pollFds.push_back(pollFd);
}
return pollFds;
}
/******************************************************************************
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
*
* Copyright (C) 2003 CERN
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* @author Castor Dev team, castor-dev@cern.ch
*****************************************************************************/
#pragma once
#include "ZMQPollEventHandler.hpp"
#include "ZMQReactor.hpp"
#include "common/log/log.hpp"
#include <utility>
#include <vector>
namespace cta {
namespace mediachanger {
namespace reactor {
/**
* This reactor wraps the zmq_poll() function.
*
* This class is part of an implementation of the Reactor architecture pattern
* described in the following book:
*
* Pattern-Oriented Software Architecture Volume 2
* Patterns for Concurrent and Networked Objects
* Authors: Schmidt, Stal, Rohnert and Buschmann
* Publication date: 2000
* ISBN 0-471-60695-2
*/
class ZMQReactor {
public:
/**
* Constructor.
*/
ZMQReactor(cta::log::Logger &);
/**
* Destructor.
*/
virtual ~ZMQReactor();
/**
* Removes and deletes all of the event handlers registered with the reactor.
*/
virtual void clear();
/**
* Registers the specified handler.
*
* Please note that the reactor takes ownership of the handler and will
* delete it as appropriate.
*
* @param handler The handler to be registered. Please note that the handler
* MUST be allocated on the heap because the reactor will own the handler
* and therefore delete it as needed.
*/
virtual void registerHandler(ZMQPollEventHandler *const handler);
/**
* Handles any pending events.
*
* @param timeout Timeout in milliseconds.
*/
virtual void handleEvents(const int timeout);
private:
log::Logger &m_log;
/**
* Type used to map zmq_pollitem_t to event handler.
*/
typedef std::vector<std::pair<zmq_pollitem_t, ZMQPollEventHandler*> >
HandlerMap;
/**
* Throws a cator::exception::Exception if a handler has already been
* registered for the specified poll item.
*
* @prama item The poll item.
*/
void checkDoubleRegistration(const zmq_pollitem_t &item) const;
/**
* Builds the vector of file descriptors to be passed to poll().
*
* Please note that the return type is an std::vector because we can assume
* that its elements are stored contiguously in memory. The address of the
* first element is going to be passed to zmq_poll().
*
* @return The vector of file descriptors.
*/
std::vector<zmq_pollitem_t> buildPollFds() const;
/**
* Returns the event handler associated with the specified zmq_pollitem_t.
*/
HandlerMap::iterator findHandler(const zmq_pollitem_t&);
/**
* Handles the specified ZMQ I/O event.
*
* @param pollFd The file-descriptor representing the I/O event.
*/
void handleEvent(const zmq_pollitem_t &pollFd);
/**
* Removes the specified handler from the reactor. This method effectively
* does the opposite of registerHandler().
*
* @param handler The handler to be removed.
*/
void removeHandler(ZMQPollEventHandler *const handler);
/**
* Map of file descriptor to registered event handler.
*/
HandlerMap m_handlers;
}; // class ZMQReactor
} // namespace reactor
} // namespace mediachanger
} // namespace cta
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment