// Copyright (C) 2003 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #ifndef DLIB_LINKER_KERNEl_1_ #define DLIB_LINKER_KERNEl_1_ #include "linker_kernel_abstract.h" #include "../threads.h" #include "../sockets.h" #include "../algs.h" namespace dlib { class linker { /*! INITIAL VALUE running == false A == 0 B == 0 running_mutex == a mutex running_signaler == a signaler associated with running_mutex cons_mutex == a mutex service_connection_running == false service_connection_running_mutex == a mutex service_connection_running_signaler == a signaler associated with service_connection_running_mutex service_connection_error == false service_connection_error_mutex == a mutex CONVENTION running == is_running() running_mutex == a mutex for running running_signaler == a signaler for signaling when running becomes false and is associated with running_mutex cons_mutex == a mutex for A and B service_connection_running == true when service_connection() is running or is about to run else false service_connection_running_mutex == a mutex for service_connection_running service_connection_running_signaler == a signaler associated with service_connection_running_mutex if (running) then A == address of a from link() B == address of b from link() else A == 0 B == 0 service_connection_error == service_connection uses this bool to indicate if it terminated due to an error or not service_connection_error_mutex == a mutex for service_connection_error !*/ public: // These two typedefs are here for backwards compatibility with previous // versions of dlib. typedef linker kernel_1a; typedef linker kernel_1a_c; linker( ); linker ( connection& a, connection& b ); virtual ~linker( ); void clear( ); bool is_running( ) const; void link ( connection& a, connection& b ); private: static void service_connection ( void* param ); /*! requires param == pointer to a linker object ensures waits for data from b and forwards it to a and if (b closes normally or is shutdown()) service_connection ends and if (b closes normally) then a.shutdown_outgoing() is called and if (a or b returns an error) then a and b are shutdown() !*/ // data members bool running; mutex running_mutex; signaler running_signaler; connection* A; connection* B; mutex cons_mutex; bool service_connection_running; mutex service_connection_running_mutex; signaler service_connection_running_signaler; bool service_connection_error; mutex service_connection_error_mutex; // restricted functions linker(linker&); // copy constructor linker& operator=(linker&); // assignment operator }; } #ifdef NO_MAKEFILE #include "linker_kernel_1.cpp" #endif #endif // DLIB_LINKER_KERNEl_1_