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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_memory_connector.c,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 16:38:20  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: ncbi_memory_connector.c,v 1000.0 2003/10/29 16:38:20 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Anton Lavrentiev
  35.  *
  36.  * File Description:
  37.  *   In-memory CONNECTOR
  38.  *
  39.  *   See <connect/ncbi_connector.h> for the detailed specification of
  40.  *   the connector's methods and structures.
  41.  *
  42.  */
  43. #include <connect/ncbi_buffer.h>
  44. #include <connect/ncbi_memory_connector.h>
  45. #include <stdlib.h>
  46. /***********************************************************************
  47.  *  INTERNAL -- Auxiliary types and static functions
  48.  ***********************************************************************/
  49. /* All internal data necessary to perform the (re)connect and i/o
  50.  */
  51. typedef struct {
  52.     BUF        buf;
  53.     MT_LOCK    lock;
  54.     EIO_Status r_status;
  55.     EIO_Status w_status;
  56. } SMemoryConnector;
  57. /***********************************************************************
  58.  *  INTERNAL -- "s_VT_*" functions for the "virt. table" of connector methods
  59.  ***********************************************************************/
  60. #ifdef __cplusplus
  61. extern "C" {
  62. #endif /* __cplusplus */
  63.     static const char* s_VT_GetType (CONNECTOR       connector);
  64.     static EIO_Status  s_VT_Open    (CONNECTOR       connector,
  65.                                      const STimeout* timeout);
  66.     static EIO_Status  s_VT_Wait    (CONNECTOR       connector,
  67.                                      EIO_Event       event,
  68.                                      const STimeout* timeout);
  69.     static EIO_Status  s_VT_Write   (CONNECTOR       connector,
  70.                                      const void*     buf,
  71.                                      size_t          size,
  72.                                      size_t*         n_written,
  73.                                      const STimeout* timeout);
  74.     static EIO_Status  s_VT_Read    (CONNECTOR       connector,
  75.                                      void*           buf,
  76.                                      size_t          size,
  77.                                      size_t*         n_read,
  78.                                      const STimeout* timeout);
  79.     static EIO_Status  s_VT_Status  (CONNECTOR       connector,
  80.                                      EIO_Event       dir);
  81.     static EIO_Status  s_VT_Close   (CONNECTOR       connector,
  82.                                      const STimeout* timeout);
  83.     static void        s_Setup      (SMetaConnector* meta,
  84.                                      CONNECTOR       connector);
  85.     static void        s_Destroy    (CONNECTOR       connector);
  86. #  ifdef IMPLEMENTED__CONN_WaitAsync
  87.     static EIO_Status s_VT_WaitAsync(void*                   connector,
  88.                                      FConnectorAsyncHandler  func,
  89.                                      SConnectorAsyncHandler* data);
  90. #  endif
  91. #ifdef __cplusplus
  92. } /* extern "C" */
  93. #endif /* __cplusplus */
  94. /*ARGSUSED*/
  95. static const char* s_VT_GetType
  96. (CONNECTOR connector)
  97. {
  98.     return "MEMORY";
  99. }
  100. /*ARGSUSED*/
  101. static EIO_Status s_VT_Open
  102. (CONNECTOR       connector,
  103.  const STimeout* timeout)
  104. {
  105.     SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;
  106.     xxx->buf = 0;
  107.     xxx->r_status = eIO_Success;
  108.     xxx->w_status = eIO_Success;
  109.     return eIO_Success;
  110. }
  111. /*ARGSUSED*/
  112. static EIO_Status s_VT_Write
  113. (CONNECTOR       connector,
  114.  const void*     buf,
  115.  size_t          size,
  116.  size_t*         n_written,
  117.  const STimeout* timeout)
  118. {
  119.     SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;
  120.     int written;
  121.     if ( !size )
  122.         return eIO_Success;
  123.     MT_LOCK_Do(xxx->lock, eMT_Lock);
  124.     written = BUF_Write(&xxx->buf, buf, size);
  125.     MT_LOCK_Do(xxx->lock, eMT_Unlock);
  126.     if ( !written ) {
  127.         xxx->w_status = eIO_Unknown;
  128.         return eIO_Unknown;
  129.     }
  130.     *n_written = size;
  131.     xxx->w_status = eIO_Success;
  132.     return eIO_Success;
  133. }
  134. /*ARGSUSED*/
  135. static EIO_Status s_VT_Read
  136. (CONNECTOR       connector,
  137.  void*           buf,
  138.  size_t          size,
  139.  size_t*         n_read,
  140.  const STimeout* timeout)
  141. {
  142.     SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;
  143.     if ( !size )
  144.         return eIO_Success;
  145.     MT_LOCK_Do(xxx->lock, eMT_Lock);
  146.     *n_read = BUF_Read(xxx->buf, buf, size);
  147.     MT_LOCK_Do(xxx->lock, eMT_Unlock);
  148.     if ( !*n_read ) {
  149.         xxx->r_status = eIO_Closed;
  150.         return eIO_Closed;
  151.     }
  152.     xxx->r_status = eIO_Success;
  153.     return eIO_Success;
  154. }
  155. /*ARGSUSED*/
  156. static EIO_Status s_VT_Wait
  157. (CONNECTOR       connector,
  158.  EIO_Event       event,
  159.  const STimeout* timeout)
  160. {
  161.     return eIO_Success;
  162. }
  163. static EIO_Status s_VT_Status
  164. (CONNECTOR connector,
  165.  EIO_Event dir)
  166. {
  167.     SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;
  168.     switch (dir) {
  169.     case eIO_Read:
  170.         return xxx->r_status;
  171.     case eIO_Write:
  172.         return xxx->w_status;
  173.     default:
  174.         assert(0); /* should never happen as checked by connection */
  175.         return eIO_InvalidArg;
  176.     }
  177. }
  178. /*ARGSUSED*/
  179. static EIO_Status s_VT_Close
  180. (CONNECTOR       connector,
  181.  const STimeout* timeout)
  182. {
  183.     SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;
  184.     BUF_Destroy(xxx->buf);
  185.     return eIO_Success;
  186. }
  187. static void s_Setup
  188. (SMetaConnector* meta,
  189.  CONNECTOR       connector)
  190. {
  191.     /* initialize virtual table */
  192.     CONN_SET_METHOD(meta, get_type,   s_VT_GetType,   connector);
  193.     CONN_SET_METHOD(meta, open,       s_VT_Open,      connector);
  194.     CONN_SET_METHOD(meta, wait,       s_VT_Wait,      connector);
  195.     CONN_SET_METHOD(meta, write,      s_VT_Write,     connector);
  196.     CONN_SET_METHOD(meta, flush,      0,              0);
  197.     CONN_SET_METHOD(meta, read,       s_VT_Read,      connector);
  198.     CONN_SET_METHOD(meta, status,     s_VT_Status,    connector);
  199.     CONN_SET_METHOD(meta, close,      s_VT_Close,     connector);
  200. #ifdef IMPLEMENTED__CONN_WaitAsync
  201.     CONN_SET_METHOD(meta, wait_async, s_VT_WaitAsync, connector);
  202. #endif
  203.     meta->default_timeout = 0/*infinite*/;
  204. }
  205. static void s_Destroy
  206. (CONNECTOR connector)
  207. {
  208.     SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;
  209.     free(xxx);
  210.     connector->handle = 0;
  211.     free(connector);
  212. }
  213. /***********************************************************************
  214.  *  EXTERNAL -- the connector's "constructors"
  215.  ***********************************************************************/
  216. extern CONNECTOR MEMORY_CreateConnector(MT_LOCK lock)
  217. {
  218.     CONNECTOR         ccc = (SConnector*) malloc(sizeof(SConnector));
  219.     SMemoryConnector* xxx = (SMemoryConnector*) malloc(sizeof(*xxx));
  220.     /* initialize internal data structures */
  221.     xxx->lock    = lock;
  222.     /* initialize connector data */
  223.     ccc->handle  = xxx;
  224.     ccc->next    = 0;
  225.     ccc->meta    = 0;
  226.     ccc->setup   = s_Setup;
  227.     ccc->destroy = s_Destroy;
  228.     return ccc;
  229. }
  230. /*
  231.  * --------------------------------------------------------------------------
  232.  * $Log: ncbi_memory_connector.c,v $
  233.  * Revision 1000.0  2003/10/29 16:38:20  gouriano
  234.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.5
  235.  *
  236.  * Revision 6.5  2003/05/31 05:15:39  lavr
  237.  * Add ARGSUSED where args are meant to be unused, remove Flush
  238.  *
  239.  * Revision 6.4  2003/05/14 03:53:13  lavr
  240.  * Log moved to end
  241.  *
  242.  * Revision 6.3  2002/10/22 15:11:24  lavr
  243.  * Zero connector's handle to crash if revisited
  244.  *
  245.  * Revision 6.2  2002/04/26 16:32:49  lavr
  246.  * Added setting of default timeout in meta-connector's setup routine
  247.  *
  248.  * Revision 6.1  2002/02/20 19:14:08  lavr
  249.  * Initial revision
  250.  *
  251.  * ==========================================================================
  252.  */