tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

baset.h (3843B)


      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/. */
      4 
      5 #ifndef BASET_H
      6 #define BASET_H
      7 
      8 /*
      9 * baset.h
     10 *
     11 * This file contains definitions for the basic types used throughout
     12 * nss but not available publicly.
     13 */
     14 
     15 #ifndef NSSBASET_H
     16 #include "nssbaset.h"
     17 #endif /* NSSBASET_H */
     18 
     19 #include "plhash.h"
     20 
     21 PR_BEGIN_EXTERN_C
     22 
     23 /*
     24 * nssArenaMark
     25 *
     26 * This type is used to mark the current state of an NSSArena.
     27 */
     28 
     29 struct nssArenaMarkStr;
     30 typedef struct nssArenaMarkStr nssArenaMark;
     31 
     32 #ifdef DEBUG
     33 /*
     34 * ARENA_THREADMARK
     35 *
     36 * Optionally, this arena implementation can be compiled with some
     37 * runtime checking enabled, which will catch the situation where
     38 * one thread "marks" the arena, another thread allocates memory,
     39 * and then the mark is released.  Usually this is a surprise to
     40 * the second thread, and this leads to weird runtime errors.
     41 * Define ARENA_THREADMARK to catch these cases; we define it for all
     42 * (internal and external) debug builds.
     43 */
     44 #define ARENA_THREADMARK
     45 
     46 /*
     47 * ARENA_DESTRUCTOR_LIST
     48 *
     49 * Unfortunately, our pointer-tracker facility, used in debug
     50 * builds to agressively fight invalid pointers, requries that
     51 * pointers be deregistered when objects are destroyed.  This
     52 * conflicts with the standard arena usage where "memory-only"
     53 * objects (that don't hold onto resources outside the arena)
     54 * can be allocated in an arena, and never destroyed other than
     55 * when the arena is destroyed.  Therefore we have added a
     56 * destructor-registratio facility to our arenas.  This was not
     57 * a simple decision, since we're getting ever-further away from
     58 * the original arena philosophy.  However, it was felt that
     59 * adding this in debug builds wouldn't be so bad; as it would
     60 * discourage them from being used for "serious" purposes.
     61 * This facility requires ARENA_THREADMARK to be defined.
     62 */
     63 #ifdef ARENA_THREADMARK
     64 #define ARENA_DESTRUCTOR_LIST
     65 #endif /* ARENA_THREADMARK */
     66 
     67 #endif /* DEBUG */
     68 
     69 typedef struct nssListStr nssList;
     70 typedef struct nssListIteratorStr nssListIterator;
     71 typedef PRBool (*nssListCompareFunc)(void *a, void *b);
     72 typedef PRIntn (*nssListSortFunc)(void *a, void *b);
     73 typedef void (*nssListElementDestructorFunc)(void *el);
     74 
     75 typedef struct nssHashStr nssHash;
     76 typedef void(PR_CALLBACK *nssHashIterator)(const void *key, void *value,
     77                                           void *arg);
     78 
     79 /*
     80 * nssPointerTracker
     81 *
     82 * This type is used in debug builds (both external and internal) to
     83 * track our object pointers.  Objects of this type must be statically
     84 * allocated, which means the structure size must be available to the
     85 * compiler.  Therefore we must expose the contents of this structure.
     86 * But please don't access elements directly; use the accessors.
     87 */
     88 
     89 #ifdef DEBUG
     90 struct nssPointerTrackerStr {
     91    PRCallOnceType once;
     92    PZLock *lock;
     93    PLHashTable *table;
     94 };
     95 typedef struct nssPointerTrackerStr nssPointerTracker;
     96 #endif /* DEBUG */
     97 
     98 /*
     99 * nssStringType
    100 *
    101 * There are several types of strings in the real world.  We try to
    102 * use only UTF8 and avoid the rest, but that's not always possible.
    103 * So we have a couple converter routines to go to and from the other
    104 * string types.  We have to be able to specify those string types,
    105 * so we have this enumeration.
    106 */
    107 
    108 enum nssStringTypeEnum {
    109    nssStringType_DirectoryString,
    110    nssStringType_TeletexString, /* Not "teletext" with trailing 't' */
    111    nssStringType_PrintableString,
    112    nssStringType_UniversalString,
    113    nssStringType_BMPString,
    114    nssStringType_UTF8String,
    115    nssStringType_PHGString,
    116    nssStringType_GeneralString,
    117 
    118    nssStringType_Unknown = -1
    119 };
    120 typedef enum nssStringTypeEnum nssStringType;
    121 
    122 PR_END_EXTERN_C
    123 
    124 #endif /* BASET_H */