Commit 71836bf8 authored by Davis King's avatar Davis King

Converted server tools into regular classes so you don't have to

say ::kernel or anything to instantiate them.  Still need to
move their method implementations into cpp files.
parent 233cd646
...@@ -4,59 +4,9 @@ ...@@ -4,59 +4,9 @@
#define DLIB_SERVEr_ #define DLIB_SERVEr_
#include "server/server_kernel_1.h" #include "server/server_kernel_1.h"
#include "server/server_kernel_c.h"
#include "server/server_iostream_1.h" #include "server/server_iostream_1.h"
#include "server/server_http_1.h" #include "server/server_http_1.h"
#include "set.h"
#include "algs.h"
#include "sockstreambuf.h"
#include "map.h"
#include "queue.h"
#include <string>
namespace dlib
{
class server
{
server() {}
typedef set<connection*>::kernel_1a set_of_cons_1a;
typedef sockstreambuf::kernel_1a ssbuf1a;
typedef sockstreambuf::kernel_2a ssbuf2a;
typedef map<uint64,connection*,memory_manager<char>::kernel_2a>::kernel_1b id_map;
public:
//----------- kernels ---------------
// kernel_1a
typedef server_kernel_1<set_of_cons_1a>
kernel_1a;
typedef server_kernel_c<kernel_1a>
kernel_1a_c;
// iostream_1a
typedef server_iostream_1<kernel_1a,ssbuf2a,id_map>
iostream_1a;
typedef server_iostream_1<kernel_1a_c,ssbuf2a,id_map>
iostream_1a_c;
// http_1a
typedef server_http_1<iostream_1a>
http_1a;
typedef server_http_1<iostream_1a_c>
http_1a_c;
};
}
#endif // DLIB_SERVEr_ #endif // DLIB_SERVEr_
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <string> #include <string>
#include "../logger.h" #include "../logger.h"
#include "../string.h" #include "../string.h"
#include "server_iostream_1.h"
#ifdef __INTEL_COMPILER #ifdef __INTEL_COMPILER
// ignore the bogus warning about hiding on_connect() // ignore the bogus warning about hiding on_connect()
...@@ -491,10 +492,7 @@ namespace dlib ...@@ -491,10 +492,7 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < class server_http : public server_iostream
typename server_base
>
class server_http_1 : public server_base
{ {
/*! /*!
...@@ -505,7 +503,7 @@ namespace dlib ...@@ -505,7 +503,7 @@ namespace dlib
public: public:
server_http_1() server_http()
{ {
max_content_length = 10*1024*1024; // 10MB max_content_length = 10*1024*1024; // 10MB
} }
...@@ -570,10 +568,7 @@ namespace dlib ...@@ -570,10 +568,7 @@ namespace dlib
const static logger dlog; const static logger dlog;
}; };
template < const logger server_http::dlog("dlib.server");
typename server_base
>
const logger server_http_1<server_base>::dlog("dlib.server");
} }
#endif // DLIB_SERVER_HTTp_1_ #endif // DLIB_SERVER_HTTp_1_
......
...@@ -7,27 +7,18 @@ ...@@ -7,27 +7,18 @@
#include "server_iostream_abstract.h" #include "server_iostream_abstract.h"
#include "../logger.h" #include "../logger.h"
#include "../uintn.h" #include "../uintn.h"
#include "server_kernel_1.h"
#include "../sockstreambuf.h"
#include "../map.h"
namespace dlib namespace dlib
{ {
template < class server_iostream : public server
typename server_base,
typename ssbuf,
typename id_map
>
class server_iostream_1 : public server_base
{ {
/*! /*!
REQUIREMENTS ON ssbuf
- must be an implementation of dlib/sockstreambuf/sockstreambuf_kernel_abstract.h
REQUIREMENTS ON id_map
- must be an implementation of dlib/map/map_kernel_abstract.h and domain must
be set to uint64 and range must be set to connection*
INITIAL VALUE INITIAL VALUE
- next_id == 0 - next_id == 0
- con_map.size() == 0 - con_map.size() == 0
...@@ -39,16 +30,19 @@ namespace dlib ...@@ -39,16 +30,19 @@ namespace dlib
- m == the mutex that protects the members of this object - m == the mutex that protects the members of this object
!*/ !*/
typedef sockstreambuf::kernel_2a ssbuf;
typedef map<uint64,connection*,memory_manager<char>::kernel_2a>::kernel_1b id_map;
public: public:
server_iostream_1( server_iostream(
) : ) :
next_id(0) next_id(0)
{} {}
~server_iostream_1( ~server_iostream(
) )
{ {
server_base::clear(); server::clear();
} }
protected: protected:
...@@ -149,12 +143,7 @@ namespace dlib ...@@ -149,12 +143,7 @@ namespace dlib
}; };
template < const logger server_iostream::dlog("dlib.server");
typename server_base,
typename ssbuf,
typename id_map
>
const logger server_iostream_1<server_base,ssbuf,id_map>::dlog("dlib.server");
} }
......
...@@ -5,11 +5,11 @@ ...@@ -5,11 +5,11 @@
#include "server_kernel_abstract.h" #include "server_kernel_abstract.h"
// non-templatable dependencies
#include "../threads.h" #include "../threads.h"
#include "../sockets.h" #include "../sockets.h"
#include <string> #include <string>
#include "../algs.h" #include "../algs.h"
#include "../set.h"
#include "../logger.h" #include "../logger.h"
#include "../smart_pointers.h" #include "../smart_pointers.h"
...@@ -17,19 +17,17 @@ ...@@ -17,19 +17,17 @@
namespace dlib namespace dlib
{ {
// These forward declarations are here so we can use them in the typedefs in the server
// class. The reason for this is for backwards compatibility with previous versions of
// dlib.
class server_http;
class server_iostream;
template < class server
typename set_of_connections
>
class server_kernel_1
{ {
/*!
REQUIREMENTS ON set_of_connections
implements set/set_kernel_abstract.h or hash_set/hash_set_kernel_abstract.h
and is a set/hash_set of dlib::connection*
/*!
INITIAL VALUE INITIAL VALUE
listening_port == 0 listening_port == 0
listening_ip == "" listening_ip == ""
...@@ -80,19 +78,20 @@ namespace dlib ...@@ -80,19 +78,20 @@ namespace dlib
!*/ !*/
typedef set<connection*>::kernel_1a set_of_connections;
// this structure is used to pass parameters to new threads // this structure is used to pass parameters to new threads
struct param struct param
{ {
param ( param (
server_kernel_1<set_of_connections>& server_, server& server_,
connection& new_connection_ connection& new_connection_
) : ) :
server(server_), the_server(server_),
new_connection(new_connection_) new_connection(new_connection_)
{} {}
server_kernel_1<set_of_connections>& server; server& the_server;
connection& new_connection; connection& new_connection;
}; };
...@@ -100,10 +99,18 @@ namespace dlib ...@@ -100,10 +99,18 @@ namespace dlib
public: public:
server_kernel_1( // These typedefs are here for backward compatibility with previous versions of dlib
typedef server kernel_1a;
typedef server kernel_1a_c;
typedef server_iostream iostream_1a;
typedef server_iostream iostream_1a_c;
typedef server_http http_1a;
typedef server_http http_1a_c;
server(
); );
virtual ~server_kernel_1( virtual ~server(
); );
void clear( void clear(
...@@ -144,6 +151,9 @@ namespace dlib ...@@ -144,6 +151,9 @@ namespace dlib
void start_async_helper ( void start_async_helper (
); );
void start_accepting_connections (
);
void open_listening_socket ( void open_listening_socket (
); );
...@@ -193,9 +203,9 @@ namespace dlib ...@@ -193,9 +203,9 @@ namespace dlib
// restricted functions // restricted functions
server_kernel_1(server_kernel_1<set_of_connections>&); server(server&);
server_kernel_1<set_of_connections>& operator= ( server& operator= (
server_kernel_1<set_of_connections>& server&
); );
}; };
...@@ -205,11 +215,8 @@ namespace dlib ...@@ -205,11 +215,8 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < server::
typename set_of_connections server (
>
server_kernel_1<set_of_connections>::
server_kernel_1 (
) : ) :
listening_port(0), listening_port(0),
running(false), running(false),
...@@ -224,11 +231,8 @@ namespace dlib ...@@ -224,11 +231,8 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < server::
typename set_of_connections ~server (
>
server_kernel_1<set_of_connections>::
~server_kernel_1 (
) )
{ {
clear(); clear();
...@@ -236,10 +240,7 @@ namespace dlib ...@@ -236,10 +240,7 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < int server::
typename set_of_connections
>
int server_kernel_1<set_of_connections>::
get_max_connections ( get_max_connections (
) const ) const
{ {
...@@ -251,14 +252,19 @@ namespace dlib ...@@ -251,14 +252,19 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < void server::
typename set_of_connections
>
void server_kernel_1<set_of_connections>::
set_max_connections ( set_max_connections (
int max int max
) )
{ {
// make sure requires clause is not broken
DLIB_CASSERT(
max >= 0 ,
"\tvoid server::set_max_connections"
<< "\n\tmax == " << max
<< "\n\tthis: " << this
);
max_connections_mutex.lock(); max_connections_mutex.lock();
max_connections = max; max_connections = max;
max_connections_mutex.unlock(); max_connections_mutex.unlock();
...@@ -266,10 +272,7 @@ namespace dlib ...@@ -266,10 +272,7 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < void server::
typename set_of_connections
>
void server_kernel_1<set_of_connections>::
clear ( clear (
) )
{ {
...@@ -331,16 +334,13 @@ namespace dlib ...@@ -331,16 +334,13 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < void server::
typename set_of_connections
>
void server_kernel_1<set_of_connections>::
start_async_helper ( start_async_helper (
) )
{ {
try try
{ {
start(); start_accepting_connections();
} }
catch (std::exception& e) catch (std::exception& e)
{ {
...@@ -350,10 +350,7 @@ namespace dlib ...@@ -350,10 +350,7 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < void server::
typename set_of_connections
>
void server_kernel_1<set_of_connections>::
start_async ( start_async (
) )
{ {
...@@ -368,16 +365,13 @@ namespace dlib ...@@ -368,16 +365,13 @@ namespace dlib
open_listening_socket(); open_listening_socket();
member_function_pointer<>::kernel_1a mfp; member_function_pointer<>::kernel_1a mfp;
mfp.set(*this,&server_kernel_1::start_async_helper); mfp.set(*this,&server::start_async_helper);
async_start_thread.reset(new thread_function(mfp)); async_start_thread.reset(new thread_function(mfp));
} }
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < void server::
typename set_of_connections
>
void server_kernel_1<set_of_connections>::
open_listening_socket ( open_listening_socket (
) )
{ {
...@@ -406,13 +400,13 @@ namespace dlib ...@@ -406,13 +400,13 @@ namespace dlib
{ {
throw dlib::socket_error( throw dlib::socket_error(
EPORT_IN_USE, EPORT_IN_USE,
"error occurred in server_kernel_1::start()\nport already in use" "error occurred in server::start()\nport already in use"
); );
} }
else if (status == OTHER_ERROR) else if (status == OTHER_ERROR)
{ {
throw dlib::socket_error( throw dlib::socket_error(
"error occurred in server_kernel_1::start()\nunable to create listener" "error occurred in server::start()\nunable to create listener"
); );
} }
} }
...@@ -424,12 +418,27 @@ namespace dlib ...@@ -424,12 +418,27 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < void server::
typename set_of_connections
>
void server_kernel_1<set_of_connections>::
start ( start (
) )
{
// make sure requires clause is not broken
DLIB_CASSERT(
this->is_running() == false,
"\tvoid server::start"
<< "\n\tis_running() == " << this->is_running()
<< "\n\tthis: " << this
);
start_accepting_connections();
}
// ----------------------------------------------------------------------------------------
void server::
start_accepting_connections (
)
{ {
open_listening_socket(); open_listening_socket();
...@@ -565,7 +574,7 @@ namespace dlib ...@@ -565,7 +574,7 @@ namespace dlib
// throw the exception // throw the exception
throw dlib::thread_error( throw dlib::thread_error(
ECREATE_THREAD, ECREATE_THREAD,
"error occurred in server_kernel_1::start()\nunable to start thread" "error occurred in server::start()\nunable to start thread"
); );
} }
// if we made the new thread then update thread_count // if we made the new thread then update thread_count
...@@ -630,17 +639,14 @@ namespace dlib ...@@ -630,17 +639,14 @@ namespace dlib
// throw the exception // throw the exception
throw dlib::socket_error( throw dlib::socket_error(
"error occurred in server_kernel_1::start()\nlistening socket returned error" "error occurred in server::start()\nlistening socket returned error"
); );
} }
} }
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < bool server::
typename set_of_connections
>
bool server_kernel_1<set_of_connections>::
is_running ( is_running (
) const ) const
{ {
...@@ -652,10 +658,7 @@ namespace dlib ...@@ -652,10 +658,7 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < const std::string server::
typename set_of_connections
>
const std::string server_kernel_1<set_of_connections>::
get_listening_ip ( get_listening_ip (
) const ) const
{ {
...@@ -667,10 +670,7 @@ namespace dlib ...@@ -667,10 +670,7 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < int server::
typename set_of_connections
>
int server_kernel_1<set_of_connections>::
get_listening_port ( get_listening_port (
) const ) const
{ {
...@@ -682,14 +682,21 @@ namespace dlib ...@@ -682,14 +682,21 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < void server::
typename set_of_connections
>
void server_kernel_1<set_of_connections>::
set_listening_port ( set_listening_port (
int port int port
) )
{ {
// make sure requires clause is not broken
DLIB_CASSERT(
( port >= 0 &&
this->is_running() == false ),
"\tvoid server::set_listening_port"
<< "\n\tport == " << port
<< "\n\tis_running() == " << this->is_running()
<< "\n\tthis: " << this
);
listening_port_mutex.lock(); listening_port_mutex.lock();
listening_port = port; listening_port = port;
listening_port_mutex.unlock(); listening_port_mutex.unlock();
...@@ -697,14 +704,21 @@ namespace dlib ...@@ -697,14 +704,21 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < void server::
typename set_of_connections
>
void server_kernel_1<set_of_connections>::
set_listening_ip ( set_listening_ip (
const std::string& ip const std::string& ip
) )
{ {
// make sure requires clause is not broken
DLIB_CASSERT(
( ( is_ip_address(ip) || ip == "" ) &&
this->is_running() == false ),
"\tvoid server::set_listening_ip"
<< "\n\tip == " << ip
<< "\n\tis_running() == " << this->is_running()
<< "\n\tthis: " << this
);
listening_ip_mutex.lock(); listening_ip_mutex.lock();
listening_ip = ip; listening_ip = ip;
listening_ip_mutex.unlock(); listening_ip_mutex.unlock();
...@@ -716,15 +730,9 @@ namespace dlib ...@@ -716,15 +730,9 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < const logger server::sdlog("dlib.server");
typename soc
>
const logger server_kernel_1<soc>::sdlog("dlib.server");
template < void server::
typename soc
>
void server_kernel_1<soc>::
service_connection( service_connection(
void* item void* item
) )
...@@ -732,25 +740,25 @@ namespace dlib ...@@ -732,25 +740,25 @@ namespace dlib
param& p = *static_cast<param*>(item); param& p = *static_cast<param*>(item);
p.server.on_connect(p.new_connection); p.the_server.on_connect(p.new_connection);
// remove this connection from cons and close it // remove this connection from cons and close it
p.server.cons_mutex.lock(); p.the_server.cons_mutex.lock();
connection* temp; connection* temp;
if (p.server.cons.is_member(&p.new_connection)) if (p.the_server.cons.is_member(&p.new_connection))
p.server.cons.remove(&p.new_connection,temp); p.the_server.cons.remove(&p.new_connection,temp);
try{ close_gracefully(&p.new_connection); } try{ close_gracefully(&p.new_connection); }
catch (...) { sdlog << LERROR << "close_gracefully() threw"; } catch (...) { sdlog << LERROR << "close_gracefully() threw"; }
p.server.cons_mutex.unlock(); p.the_server.cons_mutex.unlock();
// decrement the thread count and signal if it is now zero // decrement the thread count and signal if it is now zero
p.server.thread_count_mutex.lock(); p.the_server.thread_count_mutex.lock();
--p.server.thread_count; --p.the_server.thread_count;
p.server.thread_count_signaler.broadcast(); p.the_server.thread_count_signaler.broadcast();
if (p.server.thread_count == 0) if (p.the_server.thread_count == 0)
p.server.thread_count_zero.broadcast(); p.the_server.thread_count_zero.broadcast();
p.server.thread_count_mutex.unlock(); p.the_server.thread_count_mutex.unlock();
delete &p; delete &p;
......
// Copyright (C) 2003 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_SERVER_KERNEl_C_
#define DLIB_SERVER_KERNEl_C_
#include "server_kernel_abstract.h"
#include "../algs.h"
#include "../assert.h"
#include "../sockets.h"
#include <string>
#include <sstream>
namespace dlib
{
template <
typename server_base
>
class server_kernel_c : public server_base
{
public:
void start (
);
void set_listening_port (
int port
);
void set_listening_ip (
const std::string& ip
);
void set_max_connections (
int max
);
private:
};
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// member function definitions
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
template <
typename server_base
>
void server_kernel_c<server_base>::
start (
)
{
// make sure requires clause is not broken
DLIB_CASSERT(
this->is_running() == false,
"\tvoid server::start"
<< "\n\tis_running() == " << this->is_running()
<< "\n\tthis: " << this
);
// call the real function
server_base::start();
}
// ----------------------------------------------------------------------------------------
template <
typename server_base
>
void server_kernel_c<server_base>::
set_max_connections (
int max
)
{
// make sure requires clause is not broken
DLIB_CASSERT(
max >= 0 ,
"\tvoid server::set_max_connections"
<< "\n\tmax == " << max
<< "\n\tthis: " << this
);
// call the real function
server_base::set_max_connections(max);
}
// ----------------------------------------------------------------------------------------
template <
typename server_base
>
void server_kernel_c<server_base>::
set_listening_port (
int port
)
{
// make sure requires clause is not broken
DLIB_CASSERT(
( port >= 0 &&
this->is_running() == false ),
"\tvoid server::set_listening_port"
<< "\n\tport == " << port
<< "\n\tis_running() == " << this->is_running()
<< "\n\tthis: " << this
);
// call the real function
server_base::set_listening_port(port);
}
// ----------------------------------------------------------------------------------------
template <
typename server_base
>
void server_kernel_c<server_base>::
set_listening_ip (
const std::string& ip
)
{
// make sure requires clause is not broken
DLIB_CASSERT(
( ( is_ip_address(ip) || ip == "" ) &&
this->is_running() == false ),
"\tvoid server::set_listening_ip"
<< "\n\tip == " << ip
<< "\n\tis_running() == " << this->is_running()
<< "\n\tthis: " << this
);
// call the real function
server_base::set_listening_ip(ip);
}
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_SERVER_KERNEl_C_
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment