/* 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/. */ #ifndef BASET_H #define BASET_H /* * baset.h * * This file contains definitions for the basic types used throughout * nss but not available publicly. */ #ifndef NSSBASET_H #include "nssbaset.h" #endif /* NSSBASET_H */ #include "plhash.h" PR_BEGIN_EXTERN_C /* * nssArenaMark * * This type is used to mark the current state of an NSSArena. */ struct nssArenaMarkStr; typedef struct nssArenaMarkStr nssArenaMark; #ifdef DEBUG /* * ARENA_THREADMARK * * Optionally, this arena implementation can be compiled with some * runtime checking enabled, which will catch the situation where * one thread "marks" the arena, another thread allocates memory, * and then the mark is released. Usually this is a surprise to * the second thread, and this leads to weird runtime errors. * Define ARENA_THREADMARK to catch these cases; we define it for all * (internal and external) debug builds. */ #define ARENA_THREADMARK /* * ARENA_DESTRUCTOR_LIST * * Unfortunately, our pointer-tracker facility, used in debug * builds to agressively fight invalid pointers, requries that * pointers be deregistered when objects are destroyed. This * conflicts with the standard arena usage where "memory-only" * objects (that don't hold onto resources outside the arena) * can be allocated in an arena, and never destroyed other than * when the arena is destroyed. Therefore we have added a * destructor-registratio facility to our arenas. This was not * a simple decision, since we're getting ever-further away from * the original arena philosophy. However, it was felt that * adding this in debug builds wouldn't be so bad; as it would * discourage them from being used for "serious" purposes. * This facility requires ARENA_THREADMARK to be defined. */ #ifdef ARENA_THREADMARK #define ARENA_DESTRUCTOR_LIST #endif /* ARENA_THREADMARK */ #endif /* DEBUG */ typedef struct nssListStr nssList; typedef struct nssListIteratorStr nssListIterator; typedef PRBool (*nssListCompareFunc)(void *a, void *b); typedef PRIntn (*nssListSortFunc)(void *a, void *b); typedef void (*nssListElementDestructorFunc)(void *el); typedef struct nssHashStr nssHash; typedef void(PR_CALLBACK *nssHashIterator)(const void *key, void *value, void *arg); /* * nssPointerTracker * * This type is used in debug builds (both external and internal) to * track our object pointers. Objects of this type must be statically * allocated, which means the structure size must be available to the * compiler. Therefore we must expose the contents of this structure. * But please don't access elements directly; use the accessors. */ #ifdef DEBUG struct nssPointerTrackerStr { PRCallOnceType once; PZLock *lock; PLHashTable *table; }; typedef struct nssPointerTrackerStr nssPointerTracker; #endif /* DEBUG */ /* * nssStringType * * There are several types of strings in the real world. We try to * use only UTF8 and avoid the rest, but that's not always possible. * So we have a couple converter routines to go to and from the other * string types. We have to be able to specify those string types, * so we have this enumeration. */ enum nssStringTypeEnum { nssStringType_DirectoryString, nssStringType_TeletexString, /* Not "teletext" with trailing 't' */ nssStringType_PrintableString, nssStringType_UniversalString, nssStringType_BMPString, nssStringType_UTF8String, nssStringType_PHGString, nssStringType_GeneralString, nssStringType_Unknown = -1 }; typedef enum nssStringTypeEnum nssStringType; PR_END_EXTERN_C #endif /* BASET_H */