%PDF- %PDF-
| Direktori : /backups/router/usr/local/include/kea/asiolink/ |
| Current File : //backups/router/usr/local/include/kea/asiolink/io_service.h |
// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef ASIOLINK_IO_SERVICE_H
#define ASIOLINK_IO_SERVICE_H
#include <boost/version.hpp>
#include <boost/shared_ptr.hpp>
#include <functional>
#include <list>
namespace boost {
namespace asio {
#if BOOST_VERSION < 106600
class io_service;
#else
class io_context;
typedef io_context io_service;
#endif
}
}
namespace isc {
namespace asiolink {
class IOServiceImpl;
class IOService;
/// @brief Defines a smart pointer to an IOService instance.
typedef boost::shared_ptr<IOService> IOServicePtr;
/// @brief The @ref IOService class is a wrapper for the ASIO @c io_service
/// class.
class IOService {
/// @brief Constructors and Destructor.
///
/// @note The copy constructor and the assignment operator are
/// intentionally defined as private, making this class non-copyable.
//@{
private:
IOService(const IOService& source);
IOService& operator=(const IOService& source);
public:
/// @brief The constructor.
IOService();
/// @brief The destructor.
~IOService();
//@}
/// @brief Start the underlying event loop.
///
/// This method does not return control to the caller until
/// the @ref stop() or @ref stopWork() method is called via some handler.
void run();
/// @brief Run the underlying event loop for a single event.
///
/// This method return control to the caller as soon as the
/// first handler has completed. (If no handlers are ready when
/// it is run, it will block until one is.)
///
/// @return The number of handlers that were executed.
size_t runOne();
/// @brief Run the underlying event loop for a ready events.
///
/// This method executes handlers for all ready events and returns.
/// It will return immediately if there are no ready events.
///
/// @return The number of handlers that were executed.
size_t poll();
/// @brief Run the underlying event loop for a ready events.
///
/// This method executes handlers for all ready events and returns.
/// It will return immediately if there are no ready events.
///
/// @return The number of handlers that were executed.
size_t pollOne();
/// @brief Stop the underlying event loop.
///
/// This will return the control to the caller of the @ref run() method.
void stop();
/// @brief Indicates if the IOService has been stopped.
///
/// @return true if the IOService has been stopped, false otherwise.
bool stopped() const;
/// @brief Restarts the IOService in preparation for a subsequent @ref run() invocation.
void restart();
/// @brief Removes IO service work object to let it finish running
/// when all handlers have been invoked.
void stopWork();
/// @brief Return the native @c io_service object used in this wrapper.
///
/// This is a short term work around to support other Kea modules
/// that share the same @c io_service with the authoritative server.
/// It will eventually be removed once the wrapper interface is
/// generalized.
///
/// @return The internal io_service object.
boost::asio::io_service& getInternalIOService();
/// @brief Post a callback to the end of the queue.
///
/// Requests the callback be called sometime later. It is not guaranteed
/// by the underlying asio, but it can reasonably be expected the callback
/// is put to the end of the callback queue. It is not called from within
/// this function.
///
/// It may be used to implement "background" work, for example (doing stuff
/// by small bits that are called from time to time).
void post(const std::function<void ()>& callback);
/// @brief Stop and poll to handle all registered events.
///
/// @param ignore_errors Flag which indicates if errors should be ignored.
void stopAndPoll(bool ignore_errors = true);
private:
/// @brief The implementation.
boost::shared_ptr<IOServiceImpl> io_impl_;
};
} // namespace asiolink
} // namespace isc
#endif // ASIOLINK_IO_SERVICE_H