security/nss/lib/util/nssilckt.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 /*
     6 ** nssilock.h - Instrumented locking functions for NSS
     7 **
     8 ** Description:
     9 **    nssilock provides instrumentation for locks and monitors in
    10 **    the NSS libraries. The instrumentation, when enabled, causes
    11 **    each call to the instrumented function to record data about
    12 **    the call to an external file. The external file
    13 **    subsequently used to extract performance data and other
    14 **    statistical information about the operation of locks used in
    15 **    the nss library.
    16 **     
    17 **    To enable compilation with instrumentation, build NSS with 
    18 **    the compile time switch NEED_NSS_ILOCK defined.
    19 **
    20 **    say:  "gmake OS_CFLAGS+=-DNEED_NSS_ILOCK" at make time.
    21 **
    22 **    At runtime, to enable recording from nssilock, one or more
    23 **    environment variables must be set. For each nssILockType to
    24 **    be recorded, an environment variable of the form NSS_ILOCK_x
    25 **    must be set to 1. For example:
    26 **
    27 **       set NSS_ILOCK_Cert=1
    28 **
    29 **    nssilock uses PRLOG is used to record to trace data. The
    30 **    PRLogModule name associated with nssilock data is: "nssilock".
    31 **    To enable recording of nssilock data you will need to set the
    32 **    environment variable NSPR_LOG_MODULES to enable
    33 **    recording for the nssilock log module. Similarly, you will
    34 **    need to set the environment variable NSPR_LOG_FILE to specify
    35 **    the filename to receive the recorded data. See prlog.h for usage.
    36 **    Example:
    37 **
    38 **        export NSPR_LOG_MODULES=nssilock:6
    39 **        export NSPR_LOG_FILE=xxxLogfile
    40 **
    41 ** Operation:
    42 **    nssilock wraps calls to NSPR's PZLock and PZMonitor functions
    43 **    with similarly named functions: PZ_NewLock(), etc. When NSS is
    44 **    built with lock instrumentation enabled, the PZ* functions are
    45 **    compiled into NSS; when lock instrumentation is disabled,
    46 **    calls to PZ* functions are directly mapped to PR* functions
    47 **    and the instrumentation arguments to the PZ* functions are
    48 **    compiled away.
    49 **
    50 **
    51 ** File Format:
    52 **    The format of the external file is implementation
    53 **    dependent. Where NSPR's PR_LOG() function is used, the file
    54 **    contains data defined for PR_LOG() plus the data written by
    55 **    the wrapped function. On some platforms and under some
    56 **    circumstances, platform dependent logging or
    57 **    instrumentation probes may be used. In any case, the
    58 **    relevant data provided by the lock instrumentation is:
    59 **    
    60 **      lockType, func, address, duration, line, file [heldTime]
    61 ** 
    62 **    where:
    63 **    
    64 **       lockType: a character representation of nssILockType for the
    65 **       call. e.g. ... "cert"
    66 **    
    67 **       func: the function doing the tracing. e.g. "NewLock"
    68 **    
    69 **       address: address of the instrumented lock or monitor
    70 **    
    71 **       duration: is how long was spent in the instrumented function,
    72 **       in PRIntervalTime "ticks".
    73 **    
    74 **       line: the line number within the calling function
    75 **    
    76 **       file: the file from which the call was made
    77 **    
    78 **       heldTime: how long the lock/monitor was held. field
    79 **       present only for PZ_Unlock() and PZ_ExitMonitor().
    80 **    
    81 ** Design Notes:
    82 **    The design for lock instrumentation was influenced by the
    83 **    need to gather performance data on NSS 3.x. It is intended
    84 **    that the effort to modify NSS to use lock instrumentation
    85 **    be minimized. Existing calls to locking functions need only
    86 **    have their names changed to the instrumentation function
    87 **    names.
    88 **    
    89 ** Private NSS Interface:
    90 **    nssilock.h defines a private interface for use by NSS.
    91 **    nssilock.h is experimental in nature and is subject to
    92 **    change or revocation without notice. ... Don't mess with
    93 **    it.
    94 **    
    95 */
    97 /*
    98  * $Id:
    99  */
   101 #ifndef _NSSILCKT_H_
   102 #define _NSSILCKT_H_
   104 #include "utilrename.h"
   105 #include "prtypes.h"
   106 #include "prmon.h"
   107 #include "prlock.h"
   108 #include "prcvar.h"
   110 typedef enum {
   111     nssILockArena = 0,
   112     nssILockSession = 1,
   113     nssILockObject = 2,
   114     nssILockRefLock = 3,
   115     nssILockCert = 4,
   116     nssILockCertDB = 5,
   117     nssILockDBM = 6,
   118     nssILockCache = 7,
   119     nssILockSSL = 8,
   120     nssILockList = 9,
   121     nssILockSlot = 10,
   122     nssILockFreelist = 11,
   123     nssILockOID = 12,
   124     nssILockAttribute = 13,
   125     nssILockPK11cxt = 14,  /* pk11context */
   126     nssILockRWLock = 15,
   127     nssILockOther = 16,
   128     nssILockSelfServ = 17,
   129     nssILockKeyDB = 18,
   130     nssILockLast  /* don't use this one! */
   131 } nssILockType;
   133 /*
   134 ** conditionally compile in nssilock features
   135 */
   136 #if defined(NEED_NSS_ILOCK)
   138 /*
   139 ** Declare operation type enumerator
   140 ** enumerations identify the function being performed
   141 */
   142 typedef enum  {
   143     FlushTT = 0,
   144     NewLock = 1,
   145     Lock = 2,
   146     Unlock = 3,
   147     DestroyLock = 4,
   148     NewCondVar = 5,
   149     WaitCondVar = 6,
   150     NotifyCondVar = 7,
   151     NotifyAllCondVar = 8,
   152     DestroyCondVar = 9,
   153     NewMonitor = 10,
   154     EnterMonitor = 11,
   155     ExitMonitor = 12,
   156     Notify = 13,
   157     NotifyAll = 14,
   158     Wait = 15,
   159     DestroyMonitor = 16
   160 } nssILockOp;
   162 /*
   163 ** Declare the trace record
   164 */
   165 struct pzTrace_s {
   166     PRUint32        threadID; /* PR_GetThreadID() */
   167     nssILockOp      op;       /* operation being performed */
   168     nssILockType    ltype;    /* lock type identifier */
   169     PRIntervalTime  callTime; /* time spent in function */
   170     PRIntervalTime  heldTime; /* lock held time, or -1 */
   171     void            *lock;    /* address of lock structure */    
   172     PRIntn          line;     /* line number */
   173     char            file[24]; /* filename */
   174 };
   176 /*
   177 ** declare opaque types. See: nssilock.c
   178 */
   179 typedef struct pzlock_s PZLock;
   180 typedef struct pzcondvar_s PZCondVar;
   181 typedef struct pzmonitor_s PZMonitor;
   183 #else /* NEED_NSS_ILOCK */
   185 #define PZLock                  PRLock
   186 #define PZCondVar               PRCondVar
   187 #define PZMonitor               PRMonitor
   189 #endif /* NEED_NSS_ILOCK */
   191 #endif /* _NSSILCKT_H_ */

mercurial