ncbi_core.h
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:18k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_core.h,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:05:51  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R6.25
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CONNECT___NCBI_CORE__H
  10. #define CONNECT___NCBI_CORE__H
  11. /*  $Id: ncbi_core.h,v 1000.1 2004/04/12 17:05:51 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Denis Vakatov
  37.  *
  38.  * File Description:
  39.  *   Types and code shared by all "ncbi_*.[ch]" modules.
  40.  *
  41.  *********************************
  42.  * I/O status and direction:
  43.  *    enum:       EIO_ReadMethod
  44.  *    enum:       EIO_WriteMethod
  45.  *    enum:       EIO_Status,  verbal: IO_StatusStr()
  46.  *    enum:       EIO_Event
  47.  *
  48.  * Critical section (basic multi-thread synchronization):
  49.  *    handle:     MT_LOCK
  50.  *    enum:       EMT_Lock
  51.  *    callbacks:  (*FMT_LOCK_Handler)(),  (*FMT_LOCK_Cleanup)()
  52.  *    methods:    MT_LOCK_Create(),  MT_LOCK_AddRef(),  MT_LOCK_Delete(),
  53.  *                MT_LOCK_Do()
  54.  *
  55.  * Tracing and logging:
  56.  *    handle:     LOG
  57.  *    enum:       ELOG_Level,  verbal: LOG_LevelStr()
  58.  *    flags:      TLOG_FormatFlags, ELOG_FormatFlags
  59.  *    callbacks:  (*FLOG_Handler)(),  (*FLOG_Cleanup)()
  60.  *    methods:    LOG_Create(),  LOG_Reset(),  LOG_AddRef(),  LOG_Delete(),
  61.  *                LOG_WriteInternal()
  62.  *
  63.  * Registry:
  64.  *    handle:     REG
  65.  *    enum:       EREG_Storage
  66.  *    callbacks:  (*FREG_Get)(),  (*FREG_Set)(),  (*FREG_Cleanup)()
  67.  *    methods:    REG_Create(),  REG_Reset(),  REG_AddRef(),  REG_Delete(),
  68.  *                REG_Get(),  REG_Set()
  69.  *
  70.  */
  71. #include <connect/ncbi_types.h>
  72. /* Run-time debugging */
  73. #if defined(verify)
  74. #undef verify
  75. #endif
  76. #if !defined(NDEBUG)  &&  !defined(_DEBUG)
  77. #  define NDEBUG
  78. #endif
  79. #include <assert.h>
  80. #if defined(NDEBUG)
  81. #  define verify(expr)  (void)(expr)
  82. #else
  83. /* The following 2 headers are actually only required for Codewarrior
  84.  * on Mac to prototype printf() and abort() respectively :-/
  85.  */
  86. #  include <stdio.h>
  87. #  include <stdlib.h>
  88. #  define verify(expr)  assert(expr)
  89. #endif
  90. /** @addtogroup UtilityFunc
  91.  *
  92.  * @{
  93.  */
  94. #ifdef __cplusplus
  95. extern "C" {
  96. #endif
  97. /******************************************************************************
  98.  *  I/O
  99.  */
  100. /* I/O read method
  101.  */
  102. typedef enum {
  103.     eIO_ReadPlain, /* read presently available data only                     */
  104.     eIO_ReadPeek,  /* eIO_ReadPeek but dont discard the data from input queue*/
  105.     eIO_ReadPersist, /* try to read exactly "n" bytes; wait for enough data  */
  106.     /* deprecated */
  107.     eIO_Plain   = eIO_ReadPlain,
  108.     eIO_Peek    = eIO_ReadPeek,
  109.     eIO_Persist = eIO_ReadPersist
  110. } EIO_ReadMethod;
  111. /* I/O write method
  112.  */
  113. typedef enum {
  114.     eIO_WritePlain,
  115.     eIO_WritePersist
  116. } EIO_WriteMethod;
  117. /* I/O event (or direction)
  118.  * Note: Internally, these constants are used as bit-values, and thus should
  119.  *       not be changed in this header. However, user code should not rely
  120.  *       on the values of these constants.
  121.  */
  122. typedef enum {
  123.     eIO_Open      = 0x0, /* also serves as no-event indicator in SOCK_Poll() */
  124.     eIO_Read      = 0x1,
  125.     eIO_Write     = 0x2,
  126.     eIO_ReadWrite = 0x3, /* eIO_Read | eIO_Write                             */
  127.     eIO_Close     = 0x4  /* also serves as error indicator in SOCK_Poll()    */
  128. } EIO_Event;
  129. /* I/O status
  130.  */
  131. typedef enum {
  132.     eIO_Success = 0,  /* everything is fine, no errors occurred              */
  133.     eIO_Timeout,      /* timeout expired before the data could be i/o'd      */
  134.     eIO_Closed,       /* peer has closed the connection                      */
  135.     eIO_Interrupt,    /* signal received while the operation was in progress */
  136.     eIO_InvalidArg,   /* bad argument value(s)                               */
  137.     eIO_NotSupported, /* the requested operation is not supported            */
  138.     eIO_Unknown       /* unknown (most probably -- fatal) error              */
  139. } EIO_Status;
  140. /* Return verbal description of the I/O status
  141.  */
  142. extern NCBI_XCONNECT_EXPORT const char* IO_StatusStr(EIO_Status status);
  143. /******************************************************************************
  144.  *  MT locking
  145.  */
  146. /* Lock handle -- keeps all data needed for the locking and for the cleanup
  147.  */
  148. struct MT_LOCK_tag;
  149. typedef struct MT_LOCK_tag* MT_LOCK;
  150. /* Set the lock/unlock callback function and its data for MT critical section.
  151.  * TIP: If the RW-lock functionality is not provided by the callback, then:
  152.  *   eMT_LockRead <==> eMT_Lock
  153.  */
  154. typedef enum {
  155.     eMT_Lock,      /* lock    critical section             */
  156.     eMT_LockRead,  /* lock    critical section for reading */
  157.     eMT_Unlock     /* unlock  critical section             */
  158. } EMT_Lock;
  159. /* MT locking function (operates like Mutex or RW-lock)
  160.  * Return non-zero value if the requested operation was successful.
  161.  * NOTE:  the "-1" value is reserved for unset handler;  you also
  162.  *   may want to return "-1" if your locking function does no locking, and
  163.  *   you dont consider it as an error, but still want the caller to be
  164.  *   aware of this "rightful non-doing" as opposed to the "rightful doing".
  165.  */
  166. typedef int/*bool*/ (*FMT_LOCK_Handler)
  167. (void*    user_data,  /* see "user_data" in MT_LOCK_Create() */
  168.  EMT_Lock how         /* as passed to MT_LOCK_Do() */
  169.  );
  170. /* MT lock cleanup function;  see "MT_LOCK_Delete()" for more details
  171.  */
  172. typedef void (*FMT_LOCK_Cleanup)
  173. (void* user_data  /* see "user_data" in MT_LOCK_Create() */
  174.  );
  175. /* Create new MT locking object (with reference counter := 1)
  176.  */
  177. extern NCBI_XCONNECT_EXPORT MT_LOCK MT_LOCK_Create
  178. (void*            user_data, /* to call "handler" and "cleanup" with */
  179.  FMT_LOCK_Handler handler,   /* locking function */
  180.  FMT_LOCK_Cleanup cleanup    /* cleanup function */
  181.  );
  182. /* Increment ref.counter by 1,  then return "lk"
  183.  */
  184. extern NCBI_XCONNECT_EXPORT MT_LOCK MT_LOCK_AddRef(MT_LOCK lk);
  185. /* Decrement ref.counter by 1.
  186.  * Now, if ref.counter becomes 0, then
  187.  * destroy the handle, call "lk->cleanup(lk->user_data)", and return NULL.
  188.  * Otherwise (if ref.counter is still > 0), return "lk".
  189.  */
  190. extern NCBI_XCONNECT_EXPORT MT_LOCK MT_LOCK_Delete(MT_LOCK lk);
  191. /* Call "lk->handler(lk->user_data, how)".
  192.  * Return value returned by the lock handler ("handler" in MT_LOCK_Create()).
  193.  * If lock handler is not specified then always return "-1".
  194.  * NOTE:  use MT_LOCK_Do() to avoid overhead!
  195.  */
  196. #define MT_LOCK_Do(lk,how)  (lk ? MT_LOCK_DoInternal(lk, how) : -1)
  197. extern NCBI_XCONNECT_EXPORT int/*bool*/ MT_LOCK_DoInternal
  198. (MT_LOCK  lk,
  199.  EMT_Lock how
  200.  );
  201. /******************************************************************************
  202.  *  ERROR HANDLING and LOGGING
  203.  */
  204. /* Log handle -- keeps all data needed for the logging and for the cleanup
  205.  */
  206. struct LOG_tag;
  207. typedef struct LOG_tag* LOG;
  208. /* Log severity level
  209.  */
  210. typedef enum {
  211.     eLOG_Trace = 0,
  212.     eLOG_Note,
  213.     eLOG_Warning,
  214.     eLOG_Error,
  215.     eLOG_Critical,
  216.     eLOG_Fatal
  217. } ELOG_Level;
  218. /* Return verbal description of the log level
  219.  */
  220. extern NCBI_XCONNECT_EXPORT const char* LOG_LevelStr(ELOG_Level level);
  221. /* Message and miscellaneous data to pass to the log post callback FLOG_Handler
  222.  * For more details, see LOG_WriteInternal().
  223.  */
  224. typedef struct {
  225.     const char* message;   /* can be NULL */
  226.     ELOG_Level  level;
  227.     const char* module;    /* can be NULL */
  228.     const char* file;      /* can be NULL */
  229.     int         line;
  230.     const void* raw_data;  /* raw data to log (usually NULL)*/
  231.     size_t      raw_size;  /* size of the raw data (usually zero)*/
  232. } SLOG_Handler;
  233. /* Log post callback.
  234.  */
  235. typedef void (*FLOG_Handler)
  236. (void*         user_data,  /* see "user_data" in LOG_Create() or LOG_Reset() */
  237.  SLOG_Handler* call_data   /* composed from LOG_WriteInternal() args */
  238.  );
  239. /* Log cleanup function;  see "LOG_Reset()" for more details
  240.  */
  241. typedef void (*FLOG_Cleanup)
  242. (void* user_data  /* see "user_data" in LOG_Create() or LOG_Reset() */
  243.  );
  244. /* Create new LOG (with reference counter := 1).
  245.  * ATTENTION:  if non-NULL "lk" is specified then MT_LOCK_Delete() will be
  246.  *             called when this LOG is destroyed -- be aware of it!
  247.  */
  248. extern NCBI_XCONNECT_EXPORT LOG LOG_Create
  249. (void*        user_data, /* the data to call "handler" and "cleanup" with */
  250.  FLOG_Handler handler,   /* handler */
  251.  FLOG_Cleanup cleanup,   /* cleanup */
  252.  MT_LOCK      mt_lock    /* protective MT lock (can be NULL) */
  253.  );
  254. /* Reset the "lg" to use the new "user_data", "handler" and "cleanup".
  255.  * NOTE:  it does not change ref.counter.
  256.  */
  257. extern NCBI_XCONNECT_EXPORT void LOG_Reset
  258. (LOG          lg,         /* created by LOG_Create() */
  259.  void*        user_data,  /* new user data */
  260.  FLOG_Handler handler,    /* new handler */
  261.  FLOG_Cleanup cleanup     /* new cleanup */
  262.  );
  263. /* Increment ref.counter by 1,  then return "lg"
  264.  */
  265. extern NCBI_XCONNECT_EXPORT LOG LOG_AddRef(LOG lg);
  266. /* Decrement ref.counter by 1.
  267.  * Now, if ref.counter becomes 0, then
  268.  * call "lg->cleanup(lg->user_data)", destroy the handle, and return NULL.
  269.  * Otherwise (if ref.counter is still > 0), return "lg".
  270.  */
  271. extern NCBI_XCONNECT_EXPORT LOG LOG_Delete(LOG lg);
  272. /* Write message (maybe, with raw data attached) to the log -- e.g. call:
  273.  *   "lg->handler(lg->user_data, SLOG_Handler*)"
  274.  * NOTE:  Do not call this function directly, if possible. Instead, use
  275.  *        LOG_WRITE() and LOG_DATA() macros from <ncbi_util.h>!
  276.  */
  277. extern NCBI_XCONNECT_EXPORT void LOG_WriteInternal
  278. (LOG         lg,        /* created by LOG_Create() */
  279.  ELOG_Level  level,     /* severity */
  280.  const char* module,    /* module name */
  281.  const char* file,      /* source file */
  282.  int         line,      /* source line */
  283.  const char* message,   /* message content */
  284.  const void* raw_data,  /* raw data to log (can be NULL)*/
  285.  size_t      raw_size   /* size of the raw data (can be zero)*/
  286.  );
  287. /******************************************************************************
  288.  *  REGISTRY
  289.  */
  290. /* Registry handle (keeps all data needed for the registry get/set/cleanup)
  291.  */
  292. struct REG_tag;
  293. typedef struct REG_tag* REG;
  294. /* Transient/Persistent storage
  295.  */
  296. typedef enum {
  297.     eREG_Transient = 0,
  298.     eREG_Persistent
  299. } EREG_Storage;
  300. /* Copy the registry value stored in "section" under name "name"
  301.  * to buffer "value". Look for the matching entry first in the transient
  302.  * storage, and then in the persistent storage.
  303.  * If the specified entry is not found in the registry then just do not
  304.  * modify "value" (leave it "as is", i.e. default).
  305.  * Note:  always terminate value by ''.
  306.  * Note:  do not put more than "value_size" bytes to "value".
  307.  */
  308. typedef void (*FREG_Get)
  309. (void*       user_data,
  310.  const char* section,
  311.  const char* name,
  312.  char*       value,      /* passed a default value, cut to "value_size" syms */
  313.  size_t      value_size  /* always > 0 */
  314.  );
  315. /* Store the "value" to  the registry section "section" under name "name",
  316.  * in storage "storage".
  317.  */
  318. typedef void (*FREG_Set)
  319. (void*        user_data,
  320.  const char*  section,
  321.  const char*  name,
  322.  const char*  value,
  323.  EREG_Storage storage
  324.  );
  325. /* Registry cleanup function;  see "REG_Reset()" for more details
  326.  */
  327. typedef void (*FREG_Cleanup)
  328. (void* user_data  /* see "user_data" in REG_Create() or REG_Reset() */
  329.  );
  330. /* Create new REG (with reference counter := 1).
  331.  * ATTENTION:  if non-NULL "mt_lock" is specified then MT_LOCK_Delete() will be
  332.  *             called when this REG is destroyed -- be aware of it!
  333.  */
  334. extern NCBI_XCONNECT_EXPORT REG REG_Create
  335. (void*        user_data, /* the data to call "set", "get" and "cleanup" with */
  336.  FREG_Get     get,       /* the get method */
  337.  FREG_Set     set,       /* the set method */
  338.  FREG_Cleanup cleanup,   /* cleanup */
  339.  MT_LOCK      mt_lock    /* protective MT lock (can be NULL) */
  340.  );
  341. /* Reset the "rg" to use the new "user_data", "set", "get" and "cleanup".
  342.  * NOTE:  it does not change ref.counter.
  343.  */
  344. extern NCBI_XCONNECT_EXPORT void REG_Reset
  345. (REG          rg,         /* created by REG_Create() */
  346.  void*        user_data,  /* new user data */
  347.  FREG_Get     get,        /* the get method */
  348.  FREG_Set     set,        /* the set method */
  349.  FREG_Cleanup cleanup,    /* cleanup */
  350.  int/*bool*/  do_cleanup  /* call old cleanup(if any specified) for old data */
  351.  );
  352. /* Increment ref.counter by 1,  then return "rg"
  353.  */
  354. extern NCBI_XCONNECT_EXPORT REG REG_AddRef(REG rg);
  355. /* Decrement ref.counter by 1.
  356.  * Now, if ref.counter becomes 0, then
  357.  * call "rg->cleanup(rg->user_data)", destroy the handle, and return NULL.
  358.  * Otherwise (if ref.counter is still > 0), return "rg".
  359.  */
  360. extern NCBI_XCONNECT_EXPORT REG REG_Delete(REG rg);
  361. /* Copy the registry value stored in "section" under name "name"
  362.  * to buffer "value";  if the entry is found in both transient and persistent
  363.  * storages, then copy the one from the transient storage.
  364.  * If the specified entry is not found in the registry (or if there is
  365.  * no registry defined), and "def_value" is not NULL, then copy "def_value"
  366.  * to "value".
  367.  * Return "value" (however, if "value_size" is zero, then return NULL).
  368.  * If non-NULL, the returned "value" will be terminated by ''.
  369.  */
  370. extern NCBI_XCONNECT_EXPORT char* REG_Get
  371. (REG         rg,         /* created by REG_Create() */
  372.  const char* section,    /* registry section name */
  373.  const char* name,       /* registry entry name  */
  374.  char*       value,      /* buffer to put the value of the requested entry to*/
  375.  size_t      value_size, /* max. size of buffer "value" */
  376.  const char* def_value   /* default value (none if passed NULL) */
  377.  );
  378. /* Store the "value" to  the registry section "section" under name "name",
  379.  * in storage "storage".
  380.  */
  381. extern NCBI_XCONNECT_EXPORT void REG_Set
  382. (REG          rg,        /* created by REG_Create() */
  383.  const char*  section,
  384.  const char*  name,
  385.  const char*  value,
  386.  EREG_Storage storage
  387.  );
  388. #ifdef __cplusplus
  389. }  /* extern "C" */
  390. #endif
  391. /* @} */
  392. /*
  393.  * ===========================================================================
  394.  *
  395.  * $Log: ncbi_core.h,v $
  396.  * Revision 1000.1  2004/04/12 17:05:51  gouriano
  397.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R6.25
  398.  *
  399.  * Revision 6.25  2004/03/12 23:26:22  gorelenk
  400.  * Added export prefixes.
  401.  *
  402.  * Revision 6.24  2003/09/02 20:45:45  lavr
  403.  * -<connect/connect_export.h> -- now included from <connect/ncbi_types.h>
  404.  *
  405.  * Revision 6.23  2003/04/09 17:58:48  siyan
  406.  * Added doxygen support
  407.  *
  408.  * Revision 6.22  2003/03/06 19:42:47  lavr
  409.  * Isolate special inclusion of <stdio.h>, <stdlib.h> in DEBUG branch only
  410.  *
  411.  * Revision 6.21  2003/03/06 01:42:14  lavr
  412.  * Include <stdio.h> and <stdlib.h> required by <assert.h> under Codewarrior
  413.  *
  414.  * Revision 6.20  2003/01/08 01:59:32  lavr
  415.  * DLL-ize CONNECT library for MSVC (add NCBI_XCONNECT_EXPORT)
  416.  *
  417.  * Revision 6.19  2002/09/19 18:00:33  lavr
  418.  * Header file guard macro changed
  419.  *
  420.  * Revision 6.18  2002/08/13 19:26:39  lavr
  421.  * Add eIO_Interrupt to EIO_Status
  422.  *
  423.  * Revision 6.17  2002/08/08 14:21:11  ucko
  424.  * Fix C++-style comment; really move CVS log to end.
  425.  *
  426.  * Revision 6.16  2002/08/07 16:28:25  lavr
  427.  * Added EIO_WriteMethod; EIO_ReadMethod enums changed; log moved to end
  428.  *
  429.  * Revision 6.15  2002/05/06 19:07:48  lavr
  430.  * Added notes to EIO_Event enum type
  431.  *
  432.  * Revision 6.14  2002/03/28 13:28:43  kans
  433.  * undef verify if already defined, such as on Mac OS X Darwin (EN)
  434.  *
  435.  * Revision 6.13  2001/09/27 22:29:35  vakatov
  436.  * Always define "NDEBUG" if "_DEBUG" is not defined (mostly for the C Toolkit)
  437.  *
  438.  * Revision 6.12  2001/08/09 16:22:51  lavr
  439.  * Remove last (unneeded) parameter from LOG_Reset()
  440.  *
  441.  * Revision 6.11  2001/06/19 20:16:18  lavr
  442.  * Added #include <connect/ncbi_types.h>
  443.  *
  444.  * Revision 6.10  2001/06/19 19:08:28  lavr
  445.  * STimeout and ESwitch moved to <connect/ncbi_types.h>
  446.  *
  447.  * Revision 6.9  2001/05/17 18:10:22  vakatov
  448.  * Moved the logging macros from <ncbi_core.h> to <ncbi_util.h>.
  449.  * Logging::  always call the logger if severity is eLOG_Fatal.
  450.  *
  451.  * Revision 6.8  2001/03/02 20:06:54  lavr
  452.  * Typos fixed
  453.  *
  454.  * Revision 6.7  2001/01/23 23:07:30  lavr
  455.  * A make-up change
  456.  *
  457.  * Revision 6.6  2001/01/11 16:41:18  lavr
  458.  * Registry Get/Set methods got the 'user_data' argument, forgotten earlier
  459.  *
  460.  * Revision 6.5  2000/10/18 20:29:41  vakatov
  461.  * REG_Get::  pass in the default value (rather than '')
  462.  *
  463.  * Revision 6.4  2000/06/23 19:34:41  vakatov
  464.  * Added means to log binary data
  465.  *
  466.  * Revision 6.3  2000/04/07 19:55:14  vakatov
  467.  * Standard indentation
  468.  *
  469.  * Revision 6.2  2000/03/24 23:12:03  vakatov
  470.  * Starting the development quasi-branch to implement CONN API.
  471.  * All development is performed in the NCBI C++ tree only, while
  472.  * the NCBI C tree still contains "frozen" (see the last revision) code.
  473.  *
  474.  * Revision 6.1  2000/02/23 22:30:40  vakatov
  475.  * Initial revision
  476.  *
  477.  * ===========================================================================
  478.  */
  479. #endif /* CONNECT___NCBI_CORE__H */