| Index: mozilla/nsprpub/pr/src/misc/prcountr.c
|
| ===================================================================
|
| --- mozilla/nsprpub/pr/src/misc/prcountr.c (revision 191424)
|
| +++ mozilla/nsprpub/pr/src/misc/prcountr.c (working copy)
|
| @@ -1,474 +0,0 @@
|
| -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
| -/* This Source Code Form is subject to the terms of the Mozilla Public
|
| - * License, v. 2.0. If a copy of the MPL was not distributed with this
|
| - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
| -
|
| -/*
|
| -** prcountr.c -- NSPR Instrumentation Counters
|
| -**
|
| -** Implement the interface defined in prcountr.h
|
| -**
|
| -** Design Notes:
|
| -**
|
| -** The Counter Facility (CF) has a single anchor: qNameList.
|
| -** The anchor is a PRCList. qNameList is a list of links in QName
|
| -** structures. From qNameList any QName structure and its
|
| -** associated RName structure can be located.
|
| -**
|
| -** For each QName, a list of RName structures is anchored at
|
| -** rnLink in the QName structure.
|
| -**
|
| -** The counter itself is embedded in the RName structure.
|
| -**
|
| -** For manipulating the counter database, single lock is used to
|
| -** protect the entire list: counterLock.
|
| -**
|
| -** A PRCounterHandle, defined in prcountr.h, is really a pointer
|
| -** to a RName structure. References by PRCounterHandle are
|
| -** dead-reconed to the RName structure. The PRCounterHandle is
|
| -** "overloaded" for traversing the QName structures; only the
|
| -** function PR_FindNextQnameHandle() uses this overloading.
|
| -**
|
| -**
|
| -** ToDo (lth): decide on how to lock or atomically update
|
| -** individual counters. Candidates are: the global lock; a lock
|
| -** per RName structure; Atomic operations (Note that there are
|
| -** not adaquate atomic operations (yet) to achieve this goal). At
|
| -** this writing (6/19/98) , the update of the counter variable in
|
| -** a QName structure is unprotected.
|
| -**
|
| -*/
|
| -
|
| -#include "prcountr.h"
|
| -#include "prclist.h"
|
| -#include "prlock.h"
|
| -#include "prlog.h"
|
| -#include "prmem.h"
|
| -#include <string.h>
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -typedef struct QName
|
| -{
|
| - PRCList link;
|
| - PRCList rNameList;
|
| - char name[PRCOUNTER_NAME_MAX+1];
|
| -} QName;
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -typedef struct RName
|
| -{
|
| - PRCList link;
|
| - QName *qName;
|
| - PRLock *lock;
|
| - volatile PRUint32 counter;
|
| - char name[PRCOUNTER_NAME_MAX+1];
|
| - char desc[PRCOUNTER_DESC_MAX+1];
|
| -} RName;
|
| -
|
| -
|
| -/*
|
| -** Define the Counter Facility database
|
| -*/
|
| -static PRLock *counterLock;
|
| -static PRCList qNameList;
|
| -static PRLogModuleInfo *lm;
|
| -
|
| -/*
|
| -** _PR_CounterInitialize() -- Initialize the Counter Facility
|
| -**
|
| -*/
|
| -static void _PR_CounterInitialize( void )
|
| -{
|
| - /*
|
| - ** This function should be called only once
|
| - */
|
| - PR_ASSERT( counterLock == NULL );
|
| -
|
| - counterLock = PR_NewLock();
|
| - PR_INIT_CLIST( &qNameList );
|
| - lm = PR_NewLogModule("counters");
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: Initialization complete"));
|
| -
|
| - return;
|
| -} /* end _PR_CounterInitialize() */
|
| -
|
| -/*
|
| -** PR_CreateCounter() -- Create a counter
|
| -**
|
| -** ValidateArguments
|
| -** Lock
|
| -** if (qName not already in database)
|
| -** NewQname
|
| -** if (rName already in database )
|
| -** Assert
|
| -** else NewRname
|
| -** NewCounter
|
| -** link 'em up
|
| -** Unlock
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(PRCounterHandle)
|
| - PR_CreateCounter(
|
| - const char *qName,
|
| - const char *rName,
|
| - const char *description
|
| -)
|
| -{
|
| - QName *qnp;
|
| - RName *rnp;
|
| - PRBool matchQname = PR_FALSE;
|
| -
|
| - /* Self initialize, if necessary */
|
| - if ( counterLock == NULL )
|
| - _PR_CounterInitialize();
|
| -
|
| - /* Validate input arguments */
|
| - PR_ASSERT( strlen(qName) <= PRCOUNTER_NAME_MAX );
|
| - PR_ASSERT( strlen(rName) <= PRCOUNTER_NAME_MAX );
|
| - PR_ASSERT( strlen(description) <= PRCOUNTER_DESC_MAX );
|
| -
|
| - /* Lock the Facility */
|
| - PR_Lock( counterLock );
|
| -
|
| - /* Do we already have a matching QName? */
|
| - if (!PR_CLIST_IS_EMPTY( &qNameList ))
|
| - {
|
| - qnp = (QName *) PR_LIST_HEAD( &qNameList );
|
| - do {
|
| - if ( strcmp(qnp->name, qName) == 0)
|
| - {
|
| - matchQname = PR_TRUE;
|
| - break;
|
| - }
|
| - qnp = (QName *)PR_NEXT_LINK( &qnp->link );
|
| - } while( qnp != (QName *)PR_LIST_HEAD( &qNameList ));
|
| - }
|
| - /*
|
| - ** If we did not find a matching QName,
|
| - ** allocate one and initialize it.
|
| - ** link it onto the qNameList.
|
| - **
|
| - */
|
| - if ( matchQname != PR_TRUE )
|
| - {
|
| - qnp = PR_NEWZAP( QName );
|
| - PR_ASSERT( qnp != NULL );
|
| - PR_INIT_CLIST( &qnp->link );
|
| - PR_INIT_CLIST( &qnp->rNameList );
|
| - strcpy( qnp->name, qName );
|
| - PR_APPEND_LINK( &qnp->link, &qNameList );
|
| - }
|
| -
|
| - /* Do we already have a matching RName? */
|
| - if (!PR_CLIST_IS_EMPTY( &qnp->rNameList ))
|
| - {
|
| - rnp = (RName *) PR_LIST_HEAD( &qnp->rNameList );
|
| - do {
|
| - /*
|
| - ** No duplicate RNames are allowed within a QName
|
| - **
|
| - */
|
| - PR_ASSERT( strcmp(rnp->name, rName));
|
| - rnp = (RName *)PR_NEXT_LINK( &rnp->link );
|
| - } while( rnp != (RName *)PR_LIST_HEAD( &qnp->rNameList ));
|
| - }
|
| -
|
| - /* Get a new RName structure; initialize its members */
|
| - rnp = PR_NEWZAP( RName );
|
| - PR_ASSERT( rnp != NULL );
|
| - PR_INIT_CLIST( &rnp->link );
|
| - strcpy( rnp->name, rName );
|
| - strcpy( rnp->desc, description );
|
| - rnp->lock = PR_NewLock();
|
| - if ( rnp->lock == NULL )
|
| - {
|
| - PR_ASSERT(0);
|
| - }
|
| -
|
| - PR_APPEND_LINK( &rnp->link, &qnp->rNameList ); /* add RName to QName's rnList */
|
| - rnp->qName = qnp; /* point the RName to the QName */
|
| -
|
| - /* Unlock the Facility */
|
| - PR_Unlock( counterLock );
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: Create: QName: %s %p, RName: %s %p\n\t",
|
| - qName, qnp, rName, rnp ));
|
| -
|
| - return((PRCounterHandle)rnp);
|
| -} /* end PR_CreateCounter() */
|
| -
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(void)
|
| - PR_DestroyCounter(
|
| - PRCounterHandle handle
|
| -)
|
| -{
|
| - RName *rnp = (RName *)handle;
|
| - QName *qnp = rnp->qName;
|
| -
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: Deleting: QName: %s, RName: %s",
|
| - qnp->name, rnp->name));
|
| -
|
| - /* Lock the Facility */
|
| - PR_Lock( counterLock );
|
| -
|
| - /*
|
| - ** Remove RName from the list of RNames in QName
|
| - ** and free RName
|
| - */
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: Deleting RName: %s, %p",
|
| - rnp->name, rnp));
|
| - PR_REMOVE_LINK( &rnp->link );
|
| - PR_Free( rnp->lock );
|
| - PR_DELETE( rnp );
|
| -
|
| - /*
|
| - ** If this is the last RName within QName
|
| - ** remove QName from the qNameList and free it
|
| - */
|
| - if ( PR_CLIST_IS_EMPTY( &qnp->rNameList ) )
|
| - {
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: Deleting unused QName: %s, %p",
|
| - qnp->name, qnp));
|
| - PR_REMOVE_LINK( &qnp->link );
|
| - PR_DELETE( qnp );
|
| - }
|
| -
|
| - /* Unlock the Facility */
|
| - PR_Unlock( counterLock );
|
| - return;
|
| -} /* end PR_DestroyCounter() */
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(PRCounterHandle)
|
| - PR_GetCounterHandleFromName(
|
| - const char *qName,
|
| - const char *rName
|
| -)
|
| -{
|
| - const char *qn, *rn, *desc;
|
| - PRCounterHandle qh, rh = NULL;
|
| - RName *rnp = NULL;
|
| -
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: GetCounterHandleFromName:\n\t"
|
| - "QName: %s, RName: %s", qName, rName ));
|
| -
|
| - qh = PR_FindNextCounterQname( NULL );
|
| - while (qh != NULL)
|
| - {
|
| - rh = PR_FindNextCounterRname( NULL, qh );
|
| - while ( rh != NULL )
|
| - {
|
| - PR_GetCounterNameFromHandle( rh, &qn, &rn, &desc );
|
| - if ( (strcmp( qName, qn ) == 0)
|
| - && (strcmp( rName, rn ) == 0 ))
|
| - {
|
| - rnp = (RName *)rh;
|
| - goto foundIt;
|
| - }
|
| - rh = PR_FindNextCounterRname( rh, qh );
|
| - }
|
| - qh = PR_FindNextCounterQname( NULL );
|
| - }
|
| -
|
| -foundIt:
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: GetConterHandleFromName: %p", rnp ));
|
| - return(rh);
|
| -} /* end PR_GetCounterHandleFromName() */
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(void)
|
| - PR_GetCounterNameFromHandle(
|
| - PRCounterHandle handle,
|
| - const char **qName,
|
| - const char **rName,
|
| - const char **description
|
| -)
|
| -{
|
| - RName *rnp = (RName *)handle;
|
| - QName *qnp = rnp->qName;
|
| -
|
| - *qName = qnp->name;
|
| - *rName = rnp->name;
|
| - *description = rnp->desc;
|
| -
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: GetConterNameFromHandle: "
|
| - "QNp: %p, RNp: %p,\n\tQName: %s, RName: %s, Desc: %s",
|
| - qnp, rnp, qnp->name, rnp->name, rnp->desc ));
|
| -
|
| - return;
|
| -} /* end PR_GetCounterNameFromHandle() */
|
| -
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(void)
|
| - PR_IncrementCounter(
|
| - PRCounterHandle handle
|
| -)
|
| -{
|
| - PR_Lock(((RName *)handle)->lock);
|
| - ((RName *)handle)->counter++;
|
| - PR_Unlock(((RName *)handle)->lock);
|
| -
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: Increment: %p, %ld",
|
| - handle, ((RName *)handle)->counter ));
|
| -
|
| - return;
|
| -} /* end PR_IncrementCounter() */
|
| -
|
| -
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(void)
|
| - PR_DecrementCounter(
|
| - PRCounterHandle handle
|
| -)
|
| -{
|
| - PR_Lock(((RName *)handle)->lock);
|
| - ((RName *)handle)->counter--;
|
| - PR_Unlock(((RName *)handle)->lock);
|
| -
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: Decrement: %p, %ld",
|
| - handle, ((RName *)handle)->counter ));
|
| -
|
| - return;
|
| -} /* end PR_DecrementCounter() */
|
| -
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(void)
|
| - PR_AddToCounter(
|
| - PRCounterHandle handle,
|
| - PRUint32 value
|
| -)
|
| -{
|
| - PR_Lock(((RName *)handle)->lock);
|
| - ((RName *)handle)->counter += value;
|
| - PR_Unlock(((RName *)handle)->lock);
|
| -
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: AddToCounter: %p, %ld",
|
| - handle, ((RName *)handle)->counter ));
|
| -
|
| - return;
|
| -} /* end PR_AddToCounter() */
|
| -
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(void)
|
| - PR_SubtractFromCounter(
|
| - PRCounterHandle handle,
|
| - PRUint32 value
|
| -)
|
| -{
|
| - PR_Lock(((RName *)handle)->lock);
|
| - ((RName *)handle)->counter -= value;
|
| - PR_Unlock(((RName *)handle)->lock);
|
| -
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: SubtractFromCounter: %p, %ld",
|
| - handle, ((RName *)handle)->counter ));
|
| -
|
| - return;
|
| -} /* end PR_SubtractFromCounter() */
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(PRUint32)
|
| - PR_GetCounter(
|
| - PRCounterHandle handle
|
| -)
|
| -{
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: GetCounter: %p, %ld",
|
| - handle, ((RName *)handle)->counter ));
|
| -
|
| - return(((RName *)handle)->counter);
|
| -} /* end PR_GetCounter() */
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(void)
|
| - PR_SetCounter(
|
| - PRCounterHandle handle,
|
| - PRUint32 value
|
| -)
|
| -{
|
| - ((RName *)handle)->counter = value;
|
| -
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: SetCounter: %p, %ld",
|
| - handle, ((RName *)handle)->counter ));
|
| -
|
| - return;
|
| -} /* end PR_SetCounter() */
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(PRCounterHandle)
|
| - PR_FindNextCounterQname(
|
| - PRCounterHandle handle
|
| -)
|
| -{
|
| - QName *qnp = (QName *)handle;
|
| -
|
| - if ( PR_CLIST_IS_EMPTY( &qNameList ))
|
| - qnp = NULL;
|
| - else if ( qnp == NULL )
|
| - qnp = (QName *)PR_LIST_HEAD( &qNameList );
|
| - else if ( PR_NEXT_LINK( &qnp->link ) == &qNameList )
|
| - qnp = NULL;
|
| - else
|
| - qnp = (QName *)PR_NEXT_LINK( &qnp->link );
|
| -
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: FindNextQname: Handle: %p, Returns: %p",
|
| - handle, qnp ));
|
| -
|
| - return((PRCounterHandle)qnp);
|
| -} /* end PR_FindNextCounterQname() */
|
| -
|
| -
|
| -/*
|
| -**
|
| -*/
|
| -PR_IMPLEMENT(PRCounterHandle)
|
| - PR_FindNextCounterRname(
|
| - PRCounterHandle rhandle,
|
| - PRCounterHandle qhandle
|
| -)
|
| -{
|
| - RName *rnp = (RName *)rhandle;
|
| - QName *qnp = (QName *)qhandle;
|
| -
|
| -
|
| - if ( PR_CLIST_IS_EMPTY( &qnp->rNameList ))
|
| - rnp = NULL;
|
| - else if ( rnp == NULL )
|
| - rnp = (RName *)PR_LIST_HEAD( &qnp->rNameList );
|
| - else if ( PR_NEXT_LINK( &rnp->link ) == &qnp->rNameList )
|
| - rnp = NULL;
|
| - else
|
| - rnp = (RName *)PR_NEXT_LINK( &rnp->link );
|
| -
|
| - PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: FindNextRname: Rhandle: %p, QHandle: %p, Returns: %p",
|
| - rhandle, qhandle, rnp ));
|
| -
|
| - return((PRCounterHandle)rnp);
|
| -} /* end PR_FindNextCounterRname() */
|
|
|