diff --git a/src/common.h b/src/common.h index c6002339c2e5a181e5ee485e36256c177201d63a..be84fcab098d6ecdc70e0bc88fd951bfc31408af 100644 --- a/src/common.h +++ b/src/common.h @@ -10,6 +10,11 @@ typedef unsigned int uint; #define PROJECT_NAME "CuteDNS" // Project name #define PROJECT_VER 0x000001 // 0xMMIIRR (MAJOR,MINOR,REVISION) +/* Server. */ +#define SERVER_MGR_COUNT 2 // TCP + UDP +#define DEFAULT_THR_COUNT 2 // Default thread count for socket manager +#define DEFAULT_PORT 53531 // Default port + /* Common includes. */ diff --git a/src/server/server.c b/src/server/server.c index 2a2fe197d80c008c5e1da5c37c57ac801d18ad7c..b79b2314140653735f759528fe46f68fcec42475 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -8,11 +8,6 @@ /*----------------------------------------------------------------------------*/ -static const unsigned short DEFAULT_PORT = 53531; -static const int DEFAULT_THR_COUNT = 3; - -/*----------------------------------------------------------------------------*/ - cute_server *cute_create() { debug_server("Creating Server structure..\n"); @@ -43,12 +38,16 @@ cute_server *cute_create() debug_server("Done\n\n"); debug_server("Creating Socket Manager structure..\n"); + // Estimate number of threads/manager + long thr_count = sm_estimate_threads(); + debug_server("Estimated number of threads per manager: %ld\n", thr_count); + // Create socket handlers - server->manager[UDP] = sm_create(server->nameserver, &udp_master, &udp_worker, DEFAULT_THR_COUNT); - server->manager[TCP] = sm_create(server->nameserver, &tcp_master, &tcp_worker, 2*DEFAULT_THR_COUNT); + server->manager[UDP] = sm_create(server->nameserver, &udp_master, &udp_worker, thr_count); + server->manager[TCP] = sm_create(server->nameserver, &tcp_master, &tcp_worker, thr_count); // Check socket handlers - for(int i = 0; i < 2; i++) { + for(int i = 0; i < SERVER_MGR_COUNT; i++) { if (server->manager[i] == NULL ) { if(i == 1) { @@ -130,7 +129,7 @@ int cute_wait(cute_server *server) void cute_stop( cute_server *server ) { // Notify servers to stop - for(int i = 0; i < 2; i++) { + for(int i = 0; i < SERVER_MGR_COUNT; i++) { sm_stop(server->manager[i]); } } diff --git a/src/server/server.h b/src/server/server.h index cd4a12bbf47bb44622c370caa7ea5fe1943e3557..f0773b39676c9548a540c58fc78e57703546eba9 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -27,13 +27,17 @@ typedef struct cute_server { /*! @brief Reference to the socket manager structures. */ - sm_manager* manager[2]; // TCP + UDP + sm_manager* manager[SERVER_MGR_COUNT]; /*! @brief Reference to the name server structure. */ ns_nameserver *nameserver; /*! @brief Reference to the zone database structure. */ zdb_database *zone_db; + + /*! @brief @todo Server should have some state tracking. + uint state; + */ } cute_server; /*----------------------------------------------------------------------------*/ diff --git a/src/server/socket-manager.c b/src/server/socket-manager.c index 20c46103def7cb1c1c91fc9eea7e2066bd42c50d..ec21bb1fb7f63d5522daca065092a2325b6e4683 100644 --- a/src/server/socket-manager.c +++ b/src/server/socket-manager.c @@ -354,6 +354,17 @@ void sm_destroy( sm_manager **manager ) *manager = NULL; } +long sm_estimate_threads() +{ +#ifdef _SC_NPROCESSORS_ONLN + long ret = sysconf(_SC_NPROCESSORS_ONLN); + if(ret >= 1) + return ret + 1; +#endif + + return DEFAULT_THR_COUNT; +} + /*----------------------------------------------------------------------------*/ int sm_remove_event( int epfd, int socket ) diff --git a/src/server/socket-manager.h b/src/server/socket-manager.h index 858039e183ac652a7abbcde3083288ee0eb58677..f1f539279dd885fd9edd37bbae7c9d9237d8dc03 100644 --- a/src/server/socket-manager.h +++ b/src/server/socket-manager.h @@ -117,6 +117,13 @@ void sm_stop( sm_manager *manager ); */ void sm_destroy( sm_manager **manager ); +/** Return optimal number of threads for instance. + * It is estimated as NUM_CPUs + 1. + * Fallback is DEFAULT_THR_COUNT (\see common.h). + * \return number of threads + */ +long sm_estimate_threads(); + /* APIs for extending Socket Manager. * \todo Temporary APIs. */