Home | History | Annotate | Download | only in detail
      1 //
      2 // detail/handler_tracking.hpp
      3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~
      4 //
      5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
      6 //
      7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
      8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
      9 //
     10 
     11 #ifndef ASIO_DETAIL_HANDLER_TRACKING_HPP
     12 #define ASIO_DETAIL_HANDLER_TRACKING_HPP
     13 
     14 
     15 #include "asio/detail/config.hpp"
     16 
     17 #if defined(ASIO_ENABLE_HANDLER_TRACKING)
     18 # include "asio/error_code.hpp"
     19 # include "asio/detail/cstdint.hpp"
     20 # include "asio/detail/static_mutex.hpp"
     21 # include "asio/detail/tss_ptr.hpp"
     22 #endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
     23 
     24 #include "asio/detail/push_options.hpp"
     25 
     26 namespace asio {
     27 namespace detail {
     28 
     29 #if defined(ASIO_ENABLE_HANDLER_TRACKING)
     30 
     31 class handler_tracking
     32 {
     33 public:
     34   class completion;
     35 
     36   // Base class for objects containing tracked handlers.
     37   class tracked_handler
     38   {
     39   private:
     40     // Only the handler_tracking class will have access to the id.
     41     friend class handler_tracking;
     42     friend class completion;
     43     uint64_t id_;
     44 
     45   protected:
     46     // Constructor initialises with no id.
     47     tracked_handler() : id_(0) {}
     48 
     49     // Prevent deletion through this type.
     50     ~tracked_handler() {}
     51   };
     52 
     53   // Initialise the tracking system.
     54   ASIO_DECL static void init();
     55 
     56   // Record the creation of a tracked handler.
     57   ASIO_DECL static void creation(tracked_handler* h,
     58       const char* object_type, void* object, const char* op_name);
     59 
     60   class completion
     61   {
     62   public:
     63     // Constructor records that handler is to be invoked with no arguments.
     64     ASIO_DECL explicit completion(tracked_handler* h);
     65 
     66     // Destructor records only when an exception is thrown from the handler, or
     67     // if the memory is being freed without the handler having been invoked.
     68     ASIO_DECL ~completion();
     69 
     70     // Records that handler is to be invoked with no arguments.
     71     ASIO_DECL void invocation_begin();
     72 
     73     // Records that handler is to be invoked with one arguments.
     74     ASIO_DECL void invocation_begin(const asio::error_code& ec);
     75 
     76     // Constructor records that handler is to be invoked with two arguments.
     77     ASIO_DECL void invocation_begin(
     78         const asio::error_code& ec, std::size_t bytes_transferred);
     79 
     80     // Constructor records that handler is to be invoked with two arguments.
     81     ASIO_DECL void invocation_begin(
     82         const asio::error_code& ec, int signal_number);
     83 
     84     // Constructor records that handler is to be invoked with two arguments.
     85     ASIO_DECL void invocation_begin(
     86         const asio::error_code& ec, const char* arg);
     87 
     88     // Record that handler invocation has ended.
     89     ASIO_DECL void invocation_end();
     90 
     91   private:
     92     friend class handler_tracking;
     93     uint64_t id_;
     94     bool invoked_;
     95     completion* next_;
     96   };
     97 
     98   // Record an operation that affects pending handlers.
     99   ASIO_DECL static void operation(const char* object_type,
    100       void* object, const char* op_name);
    101 
    102   // Write a line of output.
    103   ASIO_DECL static void write_line(const char* format, ...);
    104 
    105 private:
    106   struct tracking_state;
    107   ASIO_DECL static tracking_state* get_state();
    108 };
    109 
    110 # define ASIO_INHERIT_TRACKED_HANDLER    : public asio::detail::handler_tracking::tracked_handler
    111 
    112 # define ASIO_ALSO_INHERIT_TRACKED_HANDLER    , public asio::detail::handler_tracking::tracked_handler
    113 
    114 # define ASIO_HANDLER_TRACKING_INIT    asio::detail::handler_tracking::init()
    115 
    116 # define ASIO_HANDLER_CREATION(args)    asio::detail::handler_tracking::creation args
    117 
    118 # define ASIO_HANDLER_COMPLETION(args)    asio::detail::handler_tracking::completion tracked_completion args
    119 
    120 # define ASIO_HANDLER_INVOCATION_BEGIN(args)    tracked_completion.invocation_begin args
    121 
    122 # define ASIO_HANDLER_INVOCATION_END    tracked_completion.invocation_end()
    123 
    124 # define ASIO_HANDLER_OPERATION(args)    asio::detail::handler_tracking::operation args
    125 
    126 #else // defined(ASIO_ENABLE_HANDLER_TRACKING)
    127 
    128 # define ASIO_INHERIT_TRACKED_HANDLER
    129 # define ASIO_ALSO_INHERIT_TRACKED_HANDLER
    130 # define ASIO_HANDLER_TRACKING_INIT (void)0
    131 # define ASIO_HANDLER_CREATION(args) (void)0
    132 # define ASIO_HANDLER_COMPLETION(args) (void)0
    133 # define ASIO_HANDLER_INVOCATION_BEGIN(args) (void)0
    134 # define ASIO_HANDLER_INVOCATION_END (void)0
    135 # define ASIO_HANDLER_OPERATION(args) (void)0
    136 
    137 #endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
    138 
    139 } // namespace detail
    140 } // namespace asio
    141 
    142 #include "asio/detail/pop_options.hpp"
    143 
    144 # include "asio/detail/impl/handler_tracking.ipp"
    145 
    146 #endif // ASIO_DETAIL_HANDLER_TRACKING_HPP
    147