⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ncbi_memory_connector.c

📁 ncbi源码
💻 C
字号:
/* * =========================================================================== * PRODUCTION $Log: ncbi_memory_connector.c,v $ * PRODUCTION Revision 1000.0  2003/10/29 16:38:20  gouriano * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.5 * PRODUCTION * =========================================================================== *//*  $Id: ncbi_memory_connector.c,v 1000.0 2003/10/29 16:38:20 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Author:  Anton Lavrentiev * * File Description: *   In-memory CONNECTOR * *   See <connect/ncbi_connector.h> for the detailed specification of *   the connector's methods and structures. * */#include <connect/ncbi_buffer.h>#include <connect/ncbi_memory_connector.h>#include <stdlib.h>/*********************************************************************** *  INTERNAL -- Auxiliary types and static functions ***********************************************************************//* All internal data necessary to perform the (re)connect and i/o */typedef struct {    BUF        buf;    MT_LOCK    lock;    EIO_Status r_status;    EIO_Status w_status;} SMemoryConnector;/*********************************************************************** *  INTERNAL -- "s_VT_*" functions for the "virt. table" of connector methods ***********************************************************************/#ifdef __cplusplusextern "C" {#endif /* __cplusplus */    static const char* s_VT_GetType (CONNECTOR       connector);    static EIO_Status  s_VT_Open    (CONNECTOR       connector,                                     const STimeout* timeout);    static EIO_Status  s_VT_Wait    (CONNECTOR       connector,                                     EIO_Event       event,                                     const STimeout* timeout);    static EIO_Status  s_VT_Write   (CONNECTOR       connector,                                     const void*     buf,                                     size_t          size,                                     size_t*         n_written,                                     const STimeout* timeout);    static EIO_Status  s_VT_Read    (CONNECTOR       connector,                                     void*           buf,                                     size_t          size,                                     size_t*         n_read,                                     const STimeout* timeout);    static EIO_Status  s_VT_Status  (CONNECTOR       connector,                                     EIO_Event       dir);    static EIO_Status  s_VT_Close   (CONNECTOR       connector,                                     const STimeout* timeout);    static void        s_Setup      (SMetaConnector* meta,                                     CONNECTOR       connector);    static void        s_Destroy    (CONNECTOR       connector);#  ifdef IMPLEMENTED__CONN_WaitAsync    static EIO_Status s_VT_WaitAsync(void*                   connector,                                     FConnectorAsyncHandler  func,                                     SConnectorAsyncHandler* data);#  endif#ifdef __cplusplus} /* extern "C" */#endif /* __cplusplus *//*ARGSUSED*/static const char* s_VT_GetType(CONNECTOR connector){    return "MEMORY";}/*ARGSUSED*/static EIO_Status s_VT_Open(CONNECTOR       connector, const STimeout* timeout){    SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;    xxx->buf = 0;    xxx->r_status = eIO_Success;    xxx->w_status = eIO_Success;    return eIO_Success;}/*ARGSUSED*/static EIO_Status s_VT_Write(CONNECTOR       connector, const void*     buf, size_t          size, size_t*         n_written, const STimeout* timeout){    SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;    int written;    if ( !size )        return eIO_Success;    MT_LOCK_Do(xxx->lock, eMT_Lock);    written = BUF_Write(&xxx->buf, buf, size);    MT_LOCK_Do(xxx->lock, eMT_Unlock);    if ( !written ) {        xxx->w_status = eIO_Unknown;        return eIO_Unknown;    }    *n_written = size;    xxx->w_status = eIO_Success;    return eIO_Success;}/*ARGSUSED*/static EIO_Status s_VT_Read(CONNECTOR       connector, void*           buf, size_t          size, size_t*         n_read, const STimeout* timeout){    SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;    if ( !size )        return eIO_Success;    MT_LOCK_Do(xxx->lock, eMT_Lock);    *n_read = BUF_Read(xxx->buf, buf, size);    MT_LOCK_Do(xxx->lock, eMT_Unlock);    if ( !*n_read ) {        xxx->r_status = eIO_Closed;        return eIO_Closed;    }    xxx->r_status = eIO_Success;    return eIO_Success;}/*ARGSUSED*/static EIO_Status s_VT_Wait(CONNECTOR       connector, EIO_Event       event, const STimeout* timeout){    return eIO_Success;}static EIO_Status s_VT_Status(CONNECTOR connector, EIO_Event dir){    SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;    switch (dir) {    case eIO_Read:        return xxx->r_status;    case eIO_Write:        return xxx->w_status;    default:        assert(0); /* should never happen as checked by connection */        return eIO_InvalidArg;    }}/*ARGSUSED*/static EIO_Status s_VT_Close(CONNECTOR       connector, const STimeout* timeout){    SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;    BUF_Destroy(xxx->buf);    return eIO_Success;}static void s_Setup(SMetaConnector* meta, CONNECTOR       connector){    /* initialize virtual table */    CONN_SET_METHOD(meta, get_type,   s_VT_GetType,   connector);    CONN_SET_METHOD(meta, open,       s_VT_Open,      connector);    CONN_SET_METHOD(meta, wait,       s_VT_Wait,      connector);    CONN_SET_METHOD(meta, write,      s_VT_Write,     connector);    CONN_SET_METHOD(meta, flush,      0,              0);    CONN_SET_METHOD(meta, read,       s_VT_Read,      connector);    CONN_SET_METHOD(meta, status,     s_VT_Status,    connector);    CONN_SET_METHOD(meta, close,      s_VT_Close,     connector);#ifdef IMPLEMENTED__CONN_WaitAsync    CONN_SET_METHOD(meta, wait_async, s_VT_WaitAsync, connector);#endif    meta->default_timeout = 0/*infinite*/;}static void s_Destroy(CONNECTOR connector){    SMemoryConnector* xxx = (SMemoryConnector*) connector->handle;    free(xxx);    connector->handle = 0;    free(connector);}/*********************************************************************** *  EXTERNAL -- the connector's "constructors" ***********************************************************************/extern CONNECTOR MEMORY_CreateConnector(MT_LOCK lock){    CONNECTOR         ccc = (SConnector*) malloc(sizeof(SConnector));    SMemoryConnector* xxx = (SMemoryConnector*) malloc(sizeof(*xxx));    /* initialize internal data structures */    xxx->lock    = lock;    /* initialize connector data */    ccc->handle  = xxx;    ccc->next    = 0;    ccc->meta    = 0;    ccc->setup   = s_Setup;    ccc->destroy = s_Destroy;    return ccc;}/* * -------------------------------------------------------------------------- * $Log: ncbi_memory_connector.c,v $ * Revision 1000.0  2003/10/29 16:38:20  gouriano * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.5 * * Revision 6.5  2003/05/31 05:15:39  lavr * Add ARGSUSED where args are meant to be unused, remove Flush * * Revision 6.4  2003/05/14 03:53:13  lavr * Log moved to end * * Revision 6.3  2002/10/22 15:11:24  lavr * Zero connector's handle to crash if revisited * * Revision 6.2  2002/04/26 16:32:49  lavr * Added setting of default timeout in meta-connector's setup routine * * Revision 6.1  2002/02/20 19:14:08  lavr * Initial revision * * ========================================================================== */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -