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:
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user