diff --git a/CHANGES b/CHANGES index e3ece8259c..9970ab3f88 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +2134. [func] Additional statistics support. [RT #16666] + 2133. [port] powerpc: Support both IBM and MacOS Power PC assembler syntaxes. [RT #16647] diff --git a/bin/named/.cvsignore b/bin/named/.cvsignore index 6b7b0aa1f9..5480fa5026 100644 --- a/bin/named/.cvsignore +++ b/bin/named/.cvsignore @@ -4,3 +4,4 @@ Makefile *.lo named lwresd +bind9.xsl.h diff --git a/bin/named/Makefile.in b/bin/named/Makefile.in index 1067516bcd..acff6bf014 100644 --- a/bin/named/Makefile.in +++ b/bin/named/Makefile.in @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.90 2006/12/22 01:59:43 marka Exp $ +# $Id: Makefile.in,v 1.91 2007/02/13 02:49:08 marka Exp $ srcdir = @srcdir@ VPATH = @srcdir@ @@ -133,7 +133,7 @@ clean distclean maintainer-clean:: rm -f ${TARGETS} ${OBJS} ${GENERATED} bind9.xsl.h: bind9.xsl convertxsl.pl - perl convertxsl.pl < ${srcdir}/bind9.xsl > bind9.xsl.h + ${PERL} convertxsl.pl < ${srcdir}/bind9.xsl > bind9.xsl.h server.@O@: bind9.xsl.h diff --git a/bin/named/bind9.xsl b/bin/named/bind9.xsl index 34a03cc163..21ae97c43c 100644 --- a/bin/named/bind9.xsl +++ b/bin/named/bind9.xsl @@ -15,7 +15,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - + -
+
- - - - - - + +
Zones for View
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Zones for View
NameClassSerialSuccessReferralNXRRSETNXDOMAINRecursionFailureDuplicateDropped
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + +
Network Status
ID NameClassSerial
TypeReferencesLocalAddressPeerAddressState
+ + + + + + + + + + + + + + + +
-
- +
+ + + + + + + + + + + + + + + + + + + + +
Task Manager Configuration
Thread-Model + +
Worker Threads + +
Default Quantum + +
Tasks Running + +
+
+ + + + + + + + + + + + + + + + + + + + +
Tasks
IDNameReferencesStateQuantum
+ + + + + + + + + +
+ diff --git a/bin/named/client.c b/bin/named/client.c index d0b93fb465..12cb7ad99d 100644 --- a/bin/named/client.c +++ b/bin/named/client.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: client.c,v 1.240 2006/12/04 01:52:45 marka Exp $ */ +/* $Id: client.c,v 1.241 2007/02/13 02:49:08 marka Exp $ */ #include @@ -2064,6 +2064,7 @@ client_newconn(isc_task_t *task, isc_event_t *event) { */ if (nevent->result == ISC_R_SUCCESS) { client->tcpsocket = nevent->newsocket; + isc_socket_setname(client->tcpsocket, "client-tcp", NULL); client->state = NS_CLIENTSTATE_READING; INSIST(client->recursionquota == NULL); diff --git a/bin/named/controlconf.c b/bin/named/controlconf.c index d8af88e0fe..b28ba2dc37 100644 --- a/bin/named/controlconf.c +++ b/bin/named/controlconf.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: controlconf.c,v 1.51 2006/12/07 04:46:27 marka Exp $ */ +/* $Id: controlconf.c,v 1.52 2007/02/13 02:49:08 marka Exp $ */ /*! \file */ @@ -603,6 +603,7 @@ control_newconn(isc_task_t *task, isc_event_t *event) { } sock = nevent->newsocket; + isc_socket_setname(sock, "control", NULL); (void)isc_socket_getpeername(sock, &peeraddr); if (listener->type == isc_sockettype_tcp && !address_ok(&peeraddr, listener->acl)) { @@ -1149,6 +1150,8 @@ add_listener(ns_controls_t *cp, controllistener_t **listenerp, result = isc_socket_create(ns_g_socketmgr, isc_sockaddr_pf(&listener->address), type, &listener->sock); + if (result == ISC_R_SUCCESS) + isc_socket_setname(listener->sock, "control", NULL); if (result == ISC_R_SUCCESS) result = isc_socket_bind(listener->sock, diff --git a/bin/named/interfacemgr.c b/bin/named/interfacemgr.c index 0c78645832..1c04f1d879 100644 --- a/bin/named/interfacemgr.c +++ b/bin/named/interfacemgr.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: interfacemgr.c,v 1.87 2007/02/06 00:01:23 marka Exp $ */ +/* $Id: interfacemgr.c,v 1.88 2007/02/13 02:49:08 marka Exp $ */ /*! \file */ @@ -304,6 +304,7 @@ ns_interface_accepttcp(ns_interface_t *ifp) { isc_result_totext(result)); goto tcp_socket_failure; } + isc_socket_setname(ifp->tcpsocket, "dispatcher", NULL); #ifndef ISC_ALLOW_MAPPED isc_socket_ipv6only(ifp->tcpsocket, ISC_TRUE); #endif diff --git a/bin/named/lwdclient.c b/bin/named/lwdclient.c index 039be5a990..066adc8583 100644 --- a/bin/named/lwdclient.c +++ b/bin/named/lwdclient.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: lwdclient.c,v 1.19 2005/04/29 00:22:27 marka Exp $ */ +/* $Id: lwdclient.c,v 1.20 2007/02/13 02:49:08 marka Exp $ */ /*! \file */ @@ -102,6 +102,7 @@ ns_lwdclientmgr_create(ns_lwreslistener_t *listener, unsigned int nclients, result = isc_task_create(taskmgr, 0, &cm->task); if (result != ISC_R_SUCCESS) goto errout; + isc_task_setname(cm->task, "lwdclient", NULL); /* * This MUST be last, since there is no way to cancel an onshutdown... diff --git a/bin/named/server.c b/bin/named/server.c index e45d51205c..6f8ae60a86 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.c,v 1.476 2007/02/02 02:18:05 marka Exp $ */ +/* $Id: server.c,v 1.477 2007/02/13 02:49:08 marka Exp $ */ /*! \file */ @@ -237,7 +237,7 @@ render_xsl(const char *url, const char *querystring, void *args, void **freecb_args); void -server_generatexml(ns_server_t *server, unsigned int *buflen, xmlChar **buf); +server_generatexml(ns_server_t *server, int *buflen, xmlChar **buf); #endif /* HAVE_LIBXML2 */ @@ -3663,11 +3663,13 @@ server_httpd_create(ns_server_t *server) task = NULL; result = isc_task_create(ns_g_taskmgr, 0, &task); INSIST(result == ISC_R_SUCCESS); + isc_task_setname(task, "httpd", NULL); sock = NULL; result = isc_socket_create(ns_g_socketmgr, PF_INET, isc_sockettype_tcp, &sock); INSIST(result == ISC_R_SUCCESS); + isc_socket_setname(sock, "httpd", NULL); result = isc_socket_bind(sock, &server->httpd_sockaddr); INSIST(result == ISC_R_SUCCESS); @@ -5259,7 +5261,7 @@ ns_smf_add_message(isc_buffer_t *text) { #define SPACES 3 void -server_generatexml(ns_server_t *server, unsigned int *buflen, xmlChar **buf) +server_generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { char boottime[sizeof "yyyy-mm-ddThh:mm:ssZ"]; char nowstr[sizeof "yyyy-mm-ddThh:mm:ssZ"]; @@ -5299,6 +5301,14 @@ server_generatexml(ns_server_t *server, unsigned int *buflen, xmlChar **buf) } TRY0(xmlTextWriterEndElement(writer)); /* views */ + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "socketmgr")); + isc_socketmgr_renderxml(ns_g_socketmgr, writer); + TRY0(xmlTextWriterEndElement(writer)); /* socketmgr */ + + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "taskmgr")); + isc_taskmgr_renderxml(ns_g_taskmgr, writer); + TRY0(xmlTextWriterEndElement(writer)); /* taskmgr */ + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "server")); xmlTextWriterStartElement(writer, ISC_XMLCHAR "boot-time"); xmlTextWriterWriteString(writer, ISC_XMLCHAR boottime); @@ -5318,6 +5328,10 @@ server_generatexml(ns_server_t *server, unsigned int *buflen, xmlChar **buf) xmlTextWriterEndElement(writer); /* counters */ xmlTextWriterEndElement(writer); /* server */ + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "memory")); + isc_mem_renderxml(server->mctx, writer); + TRY0(xmlTextWriterEndElement(writer)); /* memory */ + TRY0(xmlTextWriterEndElement(writer)); /* statistics */ TRY0(xmlTextWriterEndElement(writer)); /* bind */ TRY0(xmlTextWriterEndElement(writer)); /* isc */ @@ -5345,7 +5359,7 @@ render_index(const char *url, const char *querystring, void *arg, void **freecb_args) { unsigned char *msg; - unsigned int msglen; + int msglen; ns_server_t *server = arg; UNUSED(url); diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index 71dbb3f714..8e3e55912f 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dispatch.c,v 1.130 2007/02/07 05:40:50 marka Exp $ */ +/* $Id: dispatch.c,v 1.131 2007/02/13 02:49:08 marka Exp $ */ /*! \file */ @@ -1072,6 +1072,7 @@ create_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local, isc_sockettype_udp, &sock); if (result != ISC_R_SUCCESS) return (result); + isc_socket_setname(sock, "dispatcher", NULL); #ifndef ISC_ALLOW_MAPPED isc_socket_ipv6only(sock, ISC_TRUE); diff --git a/lib/dns/xfrin.c b/lib/dns/xfrin.c index 343f673db2..b02903535a 100644 --- a/lib/dns/xfrin.c +++ b/lib/dns/xfrin.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: xfrin.c,v 1.148 2006/12/18 23:58:13 marka Exp $ */ +/* $Id: xfrin.c,v 1.149 2007/02/13 02:49:08 marka Exp $ */ /*! \file */ @@ -856,6 +856,7 @@ xfrin_start(dns_xfrin_ctx_t *xfr) { isc_sockaddr_pf(&xfr->sourceaddr), isc_sockettype_tcp, &xfr->socket)); + isc_socket_setname(xfr->socket, "xfrin", NULL); #ifndef BROKEN_TCP_BIND_BEFORE_CONNECT CHECK(isc_socket_bind(xfr->socket, &xfr->sourceaddr)); #endif diff --git a/lib/isc/httpd.c b/lib/isc/httpd.c index a910c6e8ed..dd684304c6 100644 --- a/lib/isc/httpd.c +++ b/lib/isc/httpd.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: httpd.c,v 1.7 2006/12/22 04:20:52 marka Exp $ */ +/* $Id: httpd.c,v 1.8 2007/02/13 02:49:08 marka Exp $ */ /*! \file */ @@ -513,6 +513,7 @@ isc_httpd_accept(isc_task_t *task, isc_event_t *ev) ISC_LIST_APPEND(httpdmgr->running, httpd, link); ISC_HTTPD_SETRECV(httpd); httpd->sock = nev->newsocket; + isc_socket_setname(httpd->sock, "httpd", NULL); httpd->flags = 0; /* diff --git a/lib/isc/include/isc/mem.h b/lib/isc/include/isc/mem.h index c32a0d8863..52b970ea5c 100644 --- a/lib/isc/include/isc/mem.h +++ b/lib/isc/include/isc/mem.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: mem.h,v 1.69 2006/12/22 01:45:00 marka Exp $ */ +/* $Id: mem.h,v 1.70 2007/02/13 02:49:08 marka Exp $ */ #ifndef ISC_MEM_H #define ISC_MEM_H 1 @@ -28,6 +28,7 @@ #include #include #include +#include ISC_LANG_BEGINDECLS @@ -538,6 +539,11 @@ isc__mempool_get(isc_mempool_t * _ISC_MEM_FLARG); void isc__mempool_put(isc_mempool_t *, void * _ISC_MEM_FLARG); +#ifdef HAVE_LIBXML2 +void +isc_mem_renderxml(isc_mem_t *mgr, xmlTextWriterPtr writer); +#endif /* HAVE_LIBXML2 */ + ISC_LANG_ENDDECLS #endif /* ISC_MEM_H */ diff --git a/lib/isc/include/isc/socket.h b/lib/isc/include/isc/socket.h index c72ad49936..b998a06462 100644 --- a/lib/isc/include/isc/socket.h +++ b/lib/isc/include/isc/socket.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.h,v 1.70 2007/01/12 00:14:51 marka Exp $ */ +/* $Id: socket.h,v 1.71 2007/02/13 02:49:08 marka Exp $ */ #ifndef ISC_SOCKET_H #define ISC_SOCKET_H 1 @@ -64,6 +64,7 @@ #include #include #include +#include ISC_LANG_BEGINDECLS @@ -795,6 +796,33 @@ isc_socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm, * \li #ISC_R_FAILURE */ +void isc_socket_setname(isc_socket_t *socket, const char *name, void *tag); +/*%< + * Set the name and optional tag for a socket. This allows tracking of the + * owner or purpose for this socket, and is useful for tracing and statistics + * reporting. + */ + +const char *isc_socket_getname(isc_socket_t *socket); +/*%< + * Get the name associated with a socket, if any. + */ + +void *isc_socket_gettag(isc_socket_t *socket); +/*%< + * Get the tag associated with a socket, if any. + */ + +#ifdef HAVE_LIBXML2 + +void +isc_socketmgr_renderxml(isc_socketmgr_t *mgr, xmlTextWriterPtr writer); +/*%< + * Render internal statistics and other state into the XML document. + */ + +#endif /* HAVE_LIBXML2 */ + ISC_LANG_ENDDECLS #endif /* ISC_SOCKET_H */ diff --git a/lib/isc/include/isc/task.h b/lib/isc/include/isc/task.h index 46705c560b..903329fe14 100644 --- a/lib/isc/include/isc/task.h +++ b/lib/isc/include/isc/task.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: task.h,v 1.59 2007/01/12 00:14:51 marka Exp $ */ +/* $Id: task.h,v 1.60 2007/02/13 02:49:08 marka Exp $ */ #ifndef ISC_TASK_H #define ISC_TASK_H 1 @@ -84,6 +84,7 @@ #include #include #include +#include #define ISC_TASKEVENT_FIRSTEVENT (ISC_EVENTCLASS_TASK + 0) #define ISC_TASKEVENT_SHUTDOWN (ISC_EVENTCLASS_TASK + 1) @@ -611,6 +612,13 @@ isc_taskmgr_destroy(isc_taskmgr_t **managerp); * have been freed. */ +#ifdef HAVE_LIBXML2 + +void +isc_taskmgr_renderxml(isc_taskmgr_t *mgr, xmlTextWriterPtr writer); + +#endif + ISC_LANG_ENDDECLS #endif /* ISC_TASK_H */ diff --git a/lib/isc/mem.c b/lib/isc/mem.c index e0d34d47ef..f188aac631 100644 --- a/lib/isc/mem.c +++ b/lib/isc/mem.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: mem.c,v 1.128 2006/12/08 05:09:16 marka Exp $ */ +/* $Id: mem.c,v 1.129 2007/02/13 02:49:08 marka Exp $ */ /*! \file */ @@ -33,9 +33,9 @@ #include #include #include - #include #include +#include #define MCTXLOCK(m, l) if (((m)->flags & ISC_MEMFLAG_NOLOCK) == 0) LOCK(l) #define MCTXUNLOCK(m, l) if (((m)->flags & ISC_MEMFLAG_NOLOCK) == 0) UNLOCK(l) @@ -1952,3 +1952,118 @@ isc_mem_checkdestroyed(FILE *file) { } UNLOCK(&lock); } + +#ifdef HAVE_LIBXML2 + +void +isc_mem_renderxml(isc_mem_t *ctx, xmlTextWriterPtr writer) +{ + size_t i; + const struct stats *s; + const isc_mempool_t *pool; + + REQUIRE(VALID_CONTEXT(ctx)); + MCTXLOCK(ctx, &ctx->lock); + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"); + xmlTextWriterWriteFormatString(writer, "%d", ctx->references); + xmlTextWriterEndElement(writer); + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "buckets"); + for (i = 0; i <= ctx->max_size; i++) { + s = &ctx->stats[i]; + + if (s->totalgets == 0U && s->gets == 0U) + continue; + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "bucket"); + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "size"); + xmlTextWriterWriteFormatString(writer, "%d", i); + xmlTextWriterEndElement(writer); /* size */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "totalgets"); + xmlTextWriterWriteFormatString(writer, "%lu", s->totalgets); + xmlTextWriterEndElement(writer); /* totalgets */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "gets"); + xmlTextWriterWriteFormatString(writer, "%lu", s->gets); + xmlTextWriterEndElement(writer); /* gets */ + + if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0 && + (s->blocks != 0U || s->freefrags != 0U)) { + xmlTextWriterStartElement(writer, + ISC_XMLCHAR "blocks"); + xmlTextWriterWriteFormatString(writer, "%lu", + s->blocks); + xmlTextWriterEndElement(writer); /* blocks */ + + xmlTextWriterStartElement(writer, + ISC_XMLCHAR "freefrags"); + xmlTextWriterWriteFormatString(writer, "%lu", + s->freefrags); + xmlTextWriterEndElement(writer); /* freefrags */ + } + + xmlTextWriterEndElement(writer); /* bucket */ + } + xmlTextWriterEndElement(writer); /* buckets */ + + /* + * Note that since a pool can be locked now, these stats might be + * somewhat off if the pool is in active use at the time the stats + * are dumped. The link fields are protected by the isc_mem_t's + * lock, however, so walking this list and extracting integers from + * stats fields is always safe. + */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "pools"); + pool = ISC_LIST_HEAD(ctx->pools); + while (pool != NULL) { + xmlTextWriterStartElement(writer, ISC_XMLCHAR "pool"); + + xmlTextWriterWriteElement(writer, ISC_XMLCHAR "name", + ISC_XMLCHAR pool->name); + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "size"); + xmlTextWriterWriteFormatString(writer, "%d", pool->size); + xmlTextWriterEndElement(writer); /* size */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "maxalloc"); + xmlTextWriterWriteFormatString(writer, "%u", pool->maxalloc); + xmlTextWriterEndElement(writer); /* maxalloc */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "allocated"); + xmlTextWriterWriteFormatString(writer, "%u", pool->allocated); + xmlTextWriterEndElement(writer); /* allocated */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "freecount"); + xmlTextWriterWriteFormatString(writer, "%u", pool->freecount); + xmlTextWriterEndElement(writer); /* freecount */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "freemax"); + xmlTextWriterWriteFormatString(writer, "%u", pool->freemax); + xmlTextWriterEndElement(writer); /* freemax */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "fillcount"); + xmlTextWriterWriteFormatString(writer, "%u", pool->fillcount); + xmlTextWriterEndElement(writer); /* fillcount */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "gets"); + xmlTextWriterWriteFormatString(writer, "%u", pool->gets); + xmlTextWriterEndElement(writer); /* gets */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "locked"); + xmlTextWriterWriteFormatString(writer, "%s", + ((pool->lock == NULL) ? "No" : "Yes")); + xmlTextWriterEndElement(writer); /* locked */ + + xmlTextWriterEndElement(writer); /* pool */ + + pool = ISC_LIST_NEXT(pool, link); + } + xmlTextWriterEndElement(writer); /* pools */ + + MCTXUNLOCK(ctx, &ctx->lock); +} + +#endif /* HAVE_LIBXML2 */ diff --git a/lib/isc/task.c b/lib/isc/task.c index 0b69fa10e9..d5523dfe62 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: task.c,v 1.102 2007/01/12 00:14:51 marka Exp $ */ +/* $Id: task.c,v 1.103 2007/02/13 02:49:08 marka Exp $ */ /*! \file * \author Principal Author: Bob Halley @@ -38,6 +38,7 @@ #include #include #include +#include #ifndef ISC_PLATFORM_USETHREADS #include "task_p.h" @@ -67,6 +68,10 @@ typedef enum { task_state_done } task_state_t; +static const char *statenames[] = { + "idle", "ready", "running", "done", +}; + #define TASK_MAGIC ISC_MAGIC('T', 'A', 'S', 'K') #define VALID_TASK(t) ISC_MAGIC_VALID(t, TASK_MAGIC) @@ -1296,3 +1301,86 @@ isc_task_endexclusive(isc_task_t *task) { UNUSED(task); #endif } + +#ifdef HAVE_LIBXML2 + +void +isc_taskmgr_renderxml(isc_taskmgr_t *mgr, xmlTextWriterPtr writer) +{ + isc_task_t *task; + + LOCK(&mgr->lock); + + /* + * Write out the thread-model, and some details about each depending + * on which type is enabled. + */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "thread-model"); +#ifdef ISC_PLATFORM_USETHREADS + xmlTextWriterStartElement(writer, ISC_XMLCHAR "type"); + xmlTextWriterWriteString(writer, ISC_XMLCHAR "threaded"); + xmlTextWriterEndElement(writer); /* type */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "worker-threads"); + xmlTextWriterWriteFormatString(writer, "%d", mgr->workers); + xmlTextWriterEndElement(writer); /* worker-threads */ +#else /* ISC_PLATFORM_USETHREADS */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "type"); + xmlTextWriterWriteString(writer, ISC_XMLCHAR "non-threaded"); + xmlTextWriterEndElement(writer); /* type */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"); + xmlTextWriterWriteFormatString(writer, "%d", mgr->refs); + xmlTextWriterEndElement(writer); /* references */ +#endif /* ISC_PLATFORM_USETHREADS */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "default-quantum"); + xmlTextWriterWriteFormatString(writer, "%d", mgr->default_quantum); + xmlTextWriterEndElement(writer); /* default-quantum */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "tasks-running"); + xmlTextWriterWriteFormatString(writer, "%d", mgr->tasks_running); + xmlTextWriterEndElement(writer); /* tasks-running */ + + xmlTextWriterEndElement(writer); /* thread-model */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "tasks"); + task = ISC_LIST_HEAD(mgr->tasks); + while (task != NULL) { + LOCK(&task->lock); + xmlTextWriterStartElement(writer, ISC_XMLCHAR "task"); + + if (task->name[0] != 0) { + xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); + xmlTextWriterWriteFormatString(writer, "%s", + task->name); + xmlTextWriterEndElement(writer); /* name */ + } + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"); + xmlTextWriterWriteFormatString(writer, "%d", task->references); + xmlTextWriterEndElement(writer); /* references */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "id"); + xmlTextWriterWriteFormatString(writer, "%p", task); + xmlTextWriterEndElement(writer); /* id */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "state"); + xmlTextWriterWriteFormatString(writer, "%s", + statenames[task->state]); + xmlTextWriterEndElement(writer); /* state */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "quantum"); + xmlTextWriterWriteFormatString(writer, "%d", task->quantum); + xmlTextWriterEndElement(writer); /* quantum */ + + xmlTextWriterEndElement(writer); + + UNLOCK(&task->lock); + task = ISC_LIST_NEXT(task, link); + } + xmlTextWriterEndElement(writer); /* tasks */ + + UNLOCK(&mgr->lock); +} +#endif /* HAVE_LIBXML2 */ diff --git a/lib/isc/taskpool.c b/lib/isc/taskpool.c index 2c23c89120..d36381b1b7 100644 --- a/lib/isc/taskpool.c +++ b/lib/isc/taskpool.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: taskpool.c,v 1.15 2005/11/30 03:33:49 marka Exp $ */ +/* $Id: taskpool.c,v 1.16 2007/02/13 02:49:08 marka Exp $ */ /*! \file */ @@ -66,6 +66,7 @@ isc_taskpool_create(isc_taskmgr_t *tmgr, isc_mem_t *mctx, isc_taskpool_destroy(&pool); return (result); } + isc_task_setname(pool->tasks[i], "taskpool", NULL); } *poolp = pool; return (ISC_R_SUCCESS); diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 1a08562323..717ee6ed5d 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.268 2007/01/10 18:56:20 explorer Exp $ */ +/* $Id: socket.c,v 1.269 2007/02/13 02:49:08 marka Exp $ */ /*! \file */ @@ -56,6 +56,7 @@ #include #include #include +#include #include "errno2result.h" @@ -63,6 +64,11 @@ #include "socket_p.h" #endif /* ISC_PLATFORM_USETHREADS */ +/* + * Support names for sockets. + */ +#define ISC_SOCKET_NAMES 1 + /*% * Some systems define the socket length argument as an int, some as size_t, * some as socklen_t. This is here so it can be easily changed if needed. @@ -155,6 +161,11 @@ struct isc_socket { int fd; int pf; +#ifdef ISC_SOCKET_NAMES + char name[16]; + void * tag; +#endif + ISC_LIST(isc_socketevent_t) send_list; ISC_LIST(isc_socketevent_t) recv_list; ISC_LIST(isc_socket_newconnev_t) accept_list; @@ -1621,6 +1632,11 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, } #endif /* defined(USE_CMSG) || defined(SO_RCVBUF) */ +#ifdef ISC_SOCKET_NAMES + memset(sock->name, 0, sizeof(sock->name)); + sock->tag = NULL; +#endif + sock->references = 1; *socketp = sock; @@ -3958,3 +3974,144 @@ isc__socketmgr_dispatch(fd_set *readset, fd_set *writeset, int maxfd) { return (ISC_R_SUCCESS); } #endif /* ISC_PLATFORM_USETHREADS */ + +void +isc_socket_setname(isc_socket_t *socket, const char *name, void *tag) { + + /* + * Name 'socket'. + */ + + REQUIRE(VALID_SOCKET(socket)); + +#ifdef ISC_SOCKET_NAMES + LOCK(&socket->lock); + memset(socket->name, 0, sizeof(socket->name)); + strncpy(socket->name, name, sizeof(socket->name) - 1); + socket->tag = tag; + UNLOCK(&socket->lock); +#else + UNUSED(name); + UNUSED(tag); +#endif + +} + +const char * +isc_socket_getname(isc_socket_t *socket) { + return (socket->name); +} + +void * +isc_socket_gettag(isc_socket_t *socket) { + return (socket->tag); +} + +#ifdef HAVE_LIBXML2 + +static const char * +_socktype(int type) +{ + if (type == 1) + return ("udp"); + else if (type == 2) + return ("tcp"); + else if (type == 3) + return ("unix"); + else if (type == 4) + return ("fdwatch"); + else + return ("not-initialized"); +} + +void +isc_socketmgr_renderxml(isc_socketmgr_t *mgr, xmlTextWriterPtr writer) +{ + isc_socket_t *sock; + char peerbuf[ISC_SOCKADDR_FORMATSIZE]; + isc_sockaddr_t addr; + ISC_SOCKADDR_LEN_T len; + + LOCK(&mgr->lock); + +#ifndef ISC_PLATFORM_USETHREADS + xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"); + xmlTextWriterWriteFormatString(writer, "%d", mgr->refs); + xmlTextWriterEndElement(writer); +#endif + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "sockets"); + sock = ISC_LIST_HEAD(mgr->socklist); + while (sock != NULL) { + LOCK(&sock->lock); + xmlTextWriterStartElement(writer, ISC_XMLCHAR "socket"); + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "id"); + xmlTextWriterWriteFormatString(writer, "%p", sock); + xmlTextWriterEndElement(writer); + + if (sock->name[0] != 0) { + xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); + xmlTextWriterWriteFormatString(writer, "%s", + sock->name); + xmlTextWriterEndElement(writer); /* name */ + } + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"); + xmlTextWriterWriteFormatString(writer, "%d", sock->references); + xmlTextWriterEndElement(writer); + + xmlTextWriterWriteElement(writer, ISC_XMLCHAR "type", + ISC_XMLCHAR _socktype(sock->type)); + + if (sock->connected) { + isc_sockaddr_format(&sock->peer_address, peerbuf, + sizeof(peerbuf)); + xmlTextWriterWriteElement(writer, + ISC_XMLCHAR "peer-address", + ISC_XMLCHAR peerbuf); + } + + len = sizeof(addr); + if (getsockname(sock->fd, &addr.type.sa, (void *)&len) == 0) { + isc_sockaddr_format(&addr, peerbuf, sizeof(peerbuf)); + xmlTextWriterWriteElement(writer, + ISC_XMLCHAR "local-address", + ISC_XMLCHAR peerbuf); + } + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "states"); + if (sock->pending_recv) + xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state", + ISC_XMLCHAR "pending-receive"); + if (sock->pending_send) + xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state", + ISC_XMLCHAR "pending-send"); + if (sock->pending_accept) + xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state", + ISC_XMLCHAR "pending_accept"); + if (sock->listener) + xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state", + ISC_XMLCHAR "listener"); + if (sock->connected) + xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state", + ISC_XMLCHAR "connected"); + if (sock->connecting) + xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state", + ISC_XMLCHAR "connecting"); + if (sock->bound) + xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state", + ISC_XMLCHAR "bound"); + + xmlTextWriterEndElement(writer); /* states */ + + xmlTextWriterEndElement(writer); /* socket */ + + UNLOCK(&sock->lock); + sock = ISC_LIST_NEXT(sock, link); + } + xmlTextWriterEndElement(writer); /* sockets */ + + UNLOCK(&mgr->lock); +} +#endif /* HAVE_LIBXML2 */ diff --git a/lib/isc/unix/time.c b/lib/isc/unix/time.c index e638328692..3de40a2760 100644 --- a/lib/isc/unix/time.c +++ b/lib/isc/unix/time.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: time.c,v 1.51 2006/12/22 01:59:43 marka Exp $ */ +/* $Id: time.c,v 1.52 2007/02/13 02:49:08 marka Exp $ */ /*! \file */ @@ -433,6 +433,6 @@ isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) { REQUIRE(len > 0); now = (time_t)t->seconds; - flen = strftime(buf, len, "%Y-%d-%dT%H:%M:%SZ", gmtime(&now)); + flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now)); INSIST(flen < len); } diff --git a/lib/isc/win32/socket.c b/lib/isc/win32/socket.c index 213f40cf94..cb7e57bc23 100644 --- a/lib/isc/win32/socket.c +++ b/lib/isc/win32/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.47 2007/02/01 23:55:21 marka Exp $ */ +/* $Id: socket.c,v 1.48 2007/02/13 02:49:08 marka Exp $ */ /* This code has been rewritten to take advantage of Windows Sockets * I/O Completion Ports and Events. I/O Completion Ports is ONLY @@ -91,6 +91,8 @@ #include "errno2result.h" +#define ISC_SOCKET_NAMES 1 + /* * Define this macro to control the behavior of connection * resets on UDP sockets. See Microsoft KnowledgeBase Article Q263823 @@ -3816,3 +3818,35 @@ isc_socket_permunix(isc_sockaddr_t *addr, isc_uint32_t perm, UNUSED(group); return (ISC_R_NOTIMPLEMENTED); } + +void +isc_socket_setname(isc_socket_t *socket, const char *name, void *tag) { + + /* + * Name 'socket'. + */ + + REQUIRE(VALID_SOCKET(socket)); + +#ifdef ISC_SOCKET_NAMES + LOCK(&socket->lock); + memset(socket->name, 0, sizeof(socket->name)); + strncpy(socket->name, name, sizeof(socket->name) - 1); + socket->tag = tag; + UNLOCK(&socket->lock); +#else + UNUSED(name); + UNUSED(tag); +#endif + +} + +const char * +isc_socket_getname(isc_socket_t *socket) { + return (socket->name); +} + +void * +isc_socket_gettag(isc_socket_t *socket) { + return (socket->tag); +} diff --git a/util/copyrights b/util/copyrights index e1e4922e74..433272f173 100644 --- a/util/copyrights +++ b/util/copyrights @@ -79,7 +79,7 @@ ./bin/dnssec/win32/signzone.dsp X 2001,2004,2005,2006 ./bin/dnssec/win32/signzone.dsw X 2001 ./bin/dnssec/win32/signzone.mak X 2001,2004,2005,2006 -./bin/named/.cvsignore X 1999,2000,2001 +./bin/named/.cvsignore X 1999,2000,2001,2007 ./bin/named/Makefile.in MAKE 1998,1999,2000,2001,2002,2004,2005,2006 ./bin/named/bind9.xsl SGML 2006,2007 ./bin/named/builtin.c C 2001,2002,2003,2004,2005 @@ -118,7 +118,7 @@ ./bin/named/log.c C 1999,2000,2001,2002,2004,2005,2006 ./bin/named/logconf.c C 1999,2000,2001,2004,2005,2006 ./bin/named/lwaddr.c C 2000,2001,2004,2005 -./bin/named/lwdclient.c C 2000,2001,2004,2005 +./bin/named/lwdclient.c C 2000,2001,2004,2005,2007 ./bin/named/lwderror.c C 2000,2001,2004,2005 ./bin/named/lwdgabn.c C 2000,2001,2004,2005,2006 ./bin/named/lwdgnba.c C 2000,2001,2002,2004,2005 @@ -2173,7 +2173,7 @@ ./lib/isc/symtab.c C 1996,1997,1998,1999,2000,2001,2004,2005 ./lib/isc/task.c C 1998,1999,2000,2001,2002,2003,2004,2005,2006,2007 ./lib/isc/task_p.h C 2000,2001,2004,2005 -./lib/isc/taskpool.c C 1999,2000,2001,2004,2005 +./lib/isc/taskpool.c C 1999,2000,2001,2004,2005,2007 ./lib/isc/timer.c C 1998,1999,2000,2001,2002,2004,2005 ./lib/isc/timer_p.h C 2000,2001,2004,2005 ./lib/isc/unix/.cvsignore X 1998,1999,2000,2001