2420. [func] Add new command line option '-S' for named to specify

the max number of sockets. [RT #18493]
			Use caution: this option may not work for some
			operating systems without rebuilding named.
This commit is contained in:
Tatuya JINMEI 神明達哉
2008-08-20 23:57:59 +00:00
parent 0cb666ecb4
commit 13d9b8ce94
7 changed files with 90 additions and 17 deletions

View File

@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: socket.h,v 1.82 2008/08/20 06:16:05 marka Exp $ */
/* $Id: socket.h,v 1.83 2008/08/20 23:57:59 jinmei Exp $ */
#ifndef ISC_SOCKET_H
#define ISC_SOCKET_H 1
@@ -753,8 +753,15 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
isc_result_t
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp);
isc_result_t
isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
unsigned int maxsocks);
/*%<
* Create a socket manager.
* Create a socket manager. If "maxsocks" is non-zero, it specifies the
* maximum number of sockets that the created manager should handle.
* isc_socketmgr_create() is equivalent of isc_socketmgr_create2() with
* "maxsocks" being zero.
*
* Notes:
*
@@ -775,6 +782,7 @@ isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp);
*\li #ISC_R_SUCCESS
*\li #ISC_R_NOMEMORY
*\li #ISC_R_UNEXPECTED
*\li #ISC_R_NOTIMPLEMENTED
*/
isc_result_t

View File

@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: socket.c,v 1.300 2008/08/20 06:16:05 marka Exp $ */
/* $Id: socket.c,v 1.301 2008/08/20 23:57:59 jinmei Exp $ */
/*! \file */
@@ -140,16 +140,14 @@ struct isc_socketwait {
#ifdef USE_SELECT
/*%
* Mac OS X needs a special definition to support larger values in select()
* Mac OS X needs a special definition to support larger values in select().
* We always define this because a larger value can be specified run-time.
*/
#if ISC_SOCKET_MAXSOCKETS > FD_SETSIZE
#ifdef __APPLE__
#define _DARWIN_UNLIMITED_SELECT
#endif /* __APPLE__ */
#endif /* ISC_SOCKET_MAXSOCKETS > FD_SETSIZE */
#endif /* USE_SELECT */
/*%
* Size of per-FD lock buckets.
*/
@@ -3475,6 +3473,13 @@ cleanup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
isc_result_t
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
return (isc_socketmgr_create2(mctx, managerp, 0));
}
isc_result_t
isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
unsigned int maxsocks)
{
int i;
isc_socketmgr_t *manager;
#ifdef ISC_PLATFORM_USETHREADS
@@ -3486,19 +3491,26 @@ isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
#ifndef ISC_PLATFORM_USETHREADS
if (socketmgr != NULL) {
/* Don't allow maxsocks to be updated */
if (maxsocks > 0 && socketmgr->maxsocks != maxsocks)
return (ISC_R_EXISTS);
socketmgr->refs++;
*managerp = socketmgr;
return (ISC_R_SUCCESS);
}
#endif /* ISC_PLATFORM_USETHREADS */
if (maxsocks == 0)
maxsocks = ISC_SOCKET_MAXSOCKETS;
manager = isc_mem_get(mctx, sizeof(*manager));
if (manager == NULL)
return (ISC_R_NOMEMORY);
/* zero-clear so that necessary cleanup on failure will be easy */
memset(manager, 0, sizeof(*manager));
manager->maxsocks = ISC_SOCKET_MAXSOCKETS;
manager->maxsocks = maxsocks;
manager->fds = isc_mem_get(mctx,
manager->maxsocks * sizeof(isc_socket_t *));
if (manager->fds == NULL) {

View File

@@ -420,6 +420,7 @@ isc_socket_sendtov
isc_socket_sendv
isc_socket_setname
isc_socketmgr_create
isc_socketmgr_create2
isc_socketmgr_destroy
isc_socketmgr_getmaxsockets
isc_stdio_close

View File

@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: socket.c,v 1.65 2008/08/20 06:16:05 marka Exp $ */
/* $Id: socket.c,v 1.66 2008/08/20 23:57:59 jinmei Exp $ */
/* This code has been rewritten to take advantage of Windows Sockets
* I/O Completion Ports and Events. I/O Completion Ports is ONLY
@@ -2906,12 +2906,22 @@ event_wait(void *uap) {
*/
isc_result_t
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
return (isc_socketmgr_create2(mctx, managerp, maxsocks));
}
isc_result_t
isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
unsigned int maxsocks)
{
isc_socketmgr_t *manager;
events_thread_t *evthread = NULL;
isc_result_t result;
REQUIRE(managerp != NULL && *managerp == NULL);
if (maxsocks != 0)
return (ISC_R_NOTIMPLEMENTED);
manager = isc_mem_get(mctx, sizeof(*manager));
if (manager == NULL)
return (ISC_R_NOMEMORY);