亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? distnodelib.c

?? vxworks的完整的源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* distNodeLib - node library (VxFusion option) *//* Copyright 1999 - 2002 Wind River Systems, Inc. *//*modification history--------------------01q,15apr02,jws  fix SPR74878 (not locking node database properly)01p,23oct01,jws  fix compiler warnings (SPR 71117)01o,04oct01,jws  final fixes for SPR 3477001n,27sep01,p_r  Fixes for SPR#3477001m,11jun99,drm  Changing unicast piggy-backing default to FALSE.01l,24may99,drm  added vxfusion prefix to VxFusion related includes01k,11sep98,drm  added #include to pick up distPanic()01j,12aug98,drm  added #include stmt for distObjTypeP.h01i,08aug98,drm  added code to set broadcast flag when sending broadcast msgs01h,08apr98,ur   made `piggy backing' switchable with distNodeCtl()01g,13mar98,ur   added support for multiple crashed and operational hooks01f,29jan98,ur   added support for sending negative acknowledgments01e,23jan98,ur   bug fixed in the delivery of reassembled packets01d,20jan98,ur   splited distNodeInit() in two parts01c,19jan98,ur   bug fixed in distNodePktAck()01b,16jan98,ur   XACK contains state of sending node01a,10jun97,ur   written.*//*DESCRIPTIONThis library contains the node database, and routines to handle it.For every node in the system, one entry should be placed in the database.The database knows about the state of the node (as it looks from the localnode) and about communication between the local node and the remote one.INTERNALThe semaphore <distNodeDbSem> is used to lock the node database.  Thedatabase is a hash table of nodes in the system.  Packets chained forinput/output are part of each node's entry.  The table must be lockedwhen entering an entry.  It is also locked when finding and entry, althoughit is not clear that this is necessary because entries are never removed.The DIST_NODE_COMM structures are the packet queues.  The database mustbe locked when dealing with these structures.  It is believed that thisis now true.  Because of the way the communications routines are called,<distNodeDbSem> is now a mutex, and is sometimes called recursively.AVAILABILITYThis module is distributed as a component of the unbundled distributedmessage queues option, VxFusion.*/#include "vxWorks.h"#undef  DIST_DIAGNOSTIC   /* defining this seems to break VxFusion! */#undef  DIST_DIAGNOSTIC_SHOW#if defined (DIST_NODE_REPORT) \ || defined (DIST_DIAGNOSTIC) \ || defined (DIST_DIAGNOSTIC_SHOW)#include "stdio.h"#endif#include "stdlib.h"#include "hashLib.h"#include "semLib.h"#include "taskLib.h"#include "string.h"#include "errnoLib.h"#include "netinet/in.h"#include "private/distObjTypeP.h"#include "vxfusion/distLib.h"#include "vxfusion/distIfLib.h"#include "vxfusion/distNodeLib.h"#include "vxfusion/distStatLib.h"#include "vxfusion/private/distLibP.h"#include "vxfusion/private/distNodeLibP.h"#include "vxfusion/private/distTBufLibP.h"#include "vxfusion/private/distPktLibP.h"/* defines *//* make two macros look like macros */#define DIST_NODE_DB_LOCK    distNodeDbLock()#define DIST_NODE_DB_UNLOCK  distNodeDbUnlock()#define UNUSED_ARG(x)  if(sizeof(x)) {} /* to suppress compiler warnings *//* test if b is within [a,c) */#define winWithin(a, b, c) \    (((a <= b) && (b < c)) || ((c < a) && (a <= b)) || ((b < c) && (c < a)))/* add a to b and fold it back */#define winAdd(a, b) \    (((a) + (b)) & (DIST_IF_RNG_BUF_SZ - 1))/* sub a by b and fold it back */#define winSub(a, b) \    (((a) - (b)) & (DIST_IF_RNG_BUF_SZ - 1))#define KEY_ARG              65537        /* used by hash function */#define KEY_CMP_ARG          0            /* unused */#define DIST_NODE_MAX_HOOKS  8/* global variables */DIST_NODE_ID distNodeLocalId;   /* windSh needs this global *//* * The semaphore used to be binary, but is now initialized as mutex. * It cannot be changed back, because it is sometimes taken recursively, * and will block if not mutex. */SEM_ID       distNodeDbSem;     /* Should be taken before DIST_TBUF_FREEM *//* local variables */LOCAL HASH_ID     distNodeDbId;LOCAL BOOL        distNodeLibInstalled = FALSE;LOCAL int        distNodeNumNodesAll = 0;LOCAL int        distNodeNumNodesAlive = 0;LOCAL int        distNodeNumNodesOperational = 0;LOCAL int        distNodeLocalState;LOCAL DIST_NODE_ID    distNodeGodfatherId;LOCAL FUNCPTR        distNodeOperationalHook[DIST_NODE_MAX_HOOKS];LOCAL FUNCPTR        distNodeCrashedHook[DIST_NODE_MAX_HOOKS];LOCAL int        distNodeMaxRetries = DIST_NODE_MAX_RETRIES;LOCAL int        distNodeRetryTimeout = DIST_NODE_RETRY_TIMEOUT;LOCAL BOOL        distNodeSupportNACK = TRUE;   /* negative acknowlege */LOCAL BOOL        distNodeSupportPBB = FALSE;   /* piggy backing broadcast */LOCAL BOOL        distNodeSupportPBU = FALSE;   /* piggy backing unicast *//* local prototypes */LOCAL DIST_NODE_DB_NODE * distNodeFindById (DIST_NODE_ID nodeId);LOCAL BOOL   distNodeHCmp (DIST_NODE_DB_NODE *pMatchNode,                           DIST_NODE_DB_NODE *pHNode,                           int keyArg);LOCAL BOOL   distNodeHFunc (int elements, DIST_NODE_DB_NODE *pHNode,                            int keyArg);LOCAL STATUS distNodePktResend (DIST_NODE_COMM *pComm,                                DIST_TBUF_HDR *pTBufHdr);LOCAL void   distNodeDBTimerTask (void);LOCAL void   distNodeDBTimer (void);LOCAL BOOL   distNodeDBNodeTimer (DIST_NODE_DB_NODE *pNode,                                  DIST_NODE_BTIMO *pBtimo);LOCAL void   distNodeDBCommTimer (DIST_NODE_DB_NODE *pNode,                                  DIST_NODE_BTIMO *pBtimo,                                  BOOL isBroadcastComm);LOCAL STATUS distNodeSendNegAck (DIST_NODE_DB_NODE *pNode,                                 short id,                                 short seq);LOCAL STATUS distNodeSendAck (DIST_NODE_DB_NODE *pNode,                              int ackBroadcast,                              int options);LOCAL void   distNodeCleanup (DIST_NODE_DB_NODE *pNode);LOCAL void   distNodeSetState (DIST_NODE_DB_NODE *pNode,                               int state);LOCAL STATUS distNodeSendBootstrap (DIST_NODE_ID dest,                                    int type,                                    int timeout);#if defined(DIST_DIAGNOSTIC) || defined(DIST_DIAGNOSTIC_SHOW)LOCAL BOOL         distNodeNodeShow (DIST_NODE_DB_NODE *pNode,                                     int dummy);LOCAL const char * distNodeStateToName (int state);#endif/***************************************************************************** distNodeLibInit - initialize this module (VxFusion option)** This routine currently does nothing.** AVAILABILITY* This routine is distributed as a component of the unbundled distributed* message queues option, VxFusion.** RETURNS: N/A* NOMANUAL*/void distNodeLibInit (void)    {    }/***************************************************************************** distNodeInit - initializes the node library (VxFusion option)** This routine initializes the node database. The database can handle* up to 2^<sizeLog2> entries.** AVAILABILITY* This routine is distributed as a component of the unbundled distributed* message queues option, VxFusion.** RETURNS: OK, if successful.* NOMANUAL*/STATUS distNodeInit    (    int sizeLog2   /* init database with 2^^sizeLog2 entries */    )    {    int    hashTblSizeLog2;    int    i, tid;    if (sizeLog2 < 1)        return (ERROR);    if (distNodeLibInstalled == TRUE)        return (OK);    for (i = 0; i < DIST_NODE_MAX_HOOKS; i++)        {        distNodeOperationalHook[i] = NULL;        distNodeCrashedHook[i] = NULL;        }    distNodeLocalState = DIST_NODE_STATE_BOOT;    /* Initialize the node database. */    if (hashLibInit () == ERROR)        return (ERROR);    /* hashLibInit() failed */    hashTblSizeLog2 = sizeLog2 - 1;    distNodeDbId = hashTblCreate (hashTblSizeLog2, distNodeHCmp,            distNodeHFunc, KEY_ARG);    if (distNodeDbId == NULL)        return (ERROR);    /* hashTblCreate() failed */#ifdef UNDEFINED    distNodeDbSem = semBCreate (SEM_Q_PRIORITY, SEM_FULL) ; #else    distNodeDbSem = semMCreate (SEM_Q_PRIORITY + SEM_INVERSION_SAFE) ; #endif    /* Get the node database manager running. */    tid = taskSpawn ("tDiNodeMgr",                     DIST_NODE_MGR_PRIO,                     VX_SUPERVISOR_MODE | VX_UNBREAKABLE,                     DIST_NODE_MGR_STACK_SZ,                     (FUNCPTR) distNodeDBTimerTask,                     0, 0, 0, 0, 0, 0, 0, 0, 0, 0);    if (tid == ERROR)        return (ERROR);    /* taskSpawn() failed */    distNodeGodfatherId = DIST_IF_BROADCAST_ADDR;    /*     * Add a virtual broadcast node.     * State information (sliding windows, etc.) for outgoing broadcasts     * must be handled at a centralized place. This is the virtual     * broadcast node.     * State information for incoming broadcasts is managed within     * the broadcast communication substructure for the corresponding     * node. When a note enters the incorporation phase, all other     * nodes in the system get aware of it and update their node     * databases.     */    if (distNodeCreate (DIST_IF_BROADCAST_ADDR, DIST_NODE_STATE_OPERATIONAL)         ==        NULL)        {        return (ERROR);        }            distNodeLibInstalled = TRUE;    return (OK);    }/***************************************************************************** distNodeHCmp - compare function for hashing in node DB (VxFusion option)** This routine is the hash compare function for node IDs.** AVAILABILITY* This routine is distributed as a component of the unbundled distributed* message queues option, VxFusion.** RETURNS: True, if node IDs match.* NOMANUAL*/LOCAL BOOL distNodeHCmp    (    DIST_NODE_DB_NODE * pMatchNode, /* first node */    DIST_NODE_DB_NODE * pHNode,     /* second node */    int                 keyArg      /* unused arg */    )    {    DIST_NODE_ID  distNodeId1 = pMatchNode->nodeId;    DIST_NODE_ID  distNodeId2 = pHNode->nodeId;        UNUSED_ARG(keyArg);    return (distNodeId1 == distNodeId2);    }/***************************************************************************** distNodeHFunc - hash function for node DB (VxFusion option)** This is the hash function for node IDs.** AVAILABILITY* This routine is distributed as a component of the unbundled distributed* message queues option, VxFusion.** RETURNS: A hash index.* NOMANUAL*/LOCAL BOOL distNodeHFunc    (    int                 elements,  /* size of hash table */    DIST_NODE_DB_NODE * pHNode,    /* node whose ID to hash */    int                 divisor    /* used by hash computation */    )    {    return ((pHNode->nodeId % divisor) & (elements - 1));    }/***************************************************************************** distNodeCtl - control function for node database (VxFusion option)** This routine performs a control function on the node database.* The following functions are accepted:* \is* \i DIST_CTL_RETRY_TIMEOUT* Set send-timeout in ticks to start with. When no ACK is received* within the timeout, the packet is resent. The timeout for the* <n>th sending is: <n> * DIST_CTL_RETRY_TIMEOUT .* \i DIST_CTL_MAX_RETRIES* Set a limit for number of retries, when sending fails.* \i DIST_CTL_GET_LOCAL_ID* Get local node id.* \i DIST_CTL_GET_LOCAL_STATE* Get state of local node.* \i DIST_CTL_NACK_SUPPORT* Negative acknowledges (NACKs) are used for requesting a resend of a single* missing fragment from a packet. NACKs are sent immediately after a* fragment is found to be missing.* If <arg> is FALSE (0), the sending of negative acknowledges is disabled.* If <arg> is TRUE (1), sending of NACKs is enabled. This is the default.* \i DIST_CTL_PGGYBAK_UNICST_SUPPORT* If this is enabled, the system waits a version dependent time until it* sends an acknowledge for a previously received packet.* If a data packet is sent to* the acknowledge awaiting host in meantime, the acknowlege is delivered* in that packet. This switch turns on/off piggy backing for unicast* communication only.* If <arg> is FALSE (0), piggy backing is disabled.* If <arg> is TRUE (1), piggy backing is enabled.* Piggy backing is enabled for unicast communication by default.* \i DIST_CTL_PGGYBAK_BRDCST_SUPPORT* If this is enabled, the system waits* a version dependent time until it sends an* acknowledge for a previously received packet. If a data packet is sent to* the acknowledge awaiting host in meantime, the acknowlege is delivered* in that packet. This switch turns on/off piggy backing for broadcast* communication only.* If <arg> is FALSE (0), piggy backing is disabled.* If <arg> is TRUE (1), piggy backing is enabled.* Piggy backing is disabled for broadcast communication by default.* \i DIST_CTL_OPERATIONAL_HOOK* Set a function to be called, each time a node shifts to operational state.* \i DIST_CTL_CRASHED_HOOK* Set a function to be called, each time a node shifts to crashed state.* \ie** The prototype of the function hooked to the database, should look* like this:* \cs*    void fnc (DIST_NODE_ID nodeStateChanged);* \ce* * RETURNS: OK, the value requested, or ERROR if <function> is unknown.** ERRNO:* S_distLib_UNKNOWN_REQUEST** AVAILABILITY* This routine is distributed as a component of the unbundled distributed* message queues option, VxFusion.* NOMANUAL*/int distNodeCtl    (    int function,        /* function code      */    int arg              /* arbitrary argument */    )    {    int i;    switch (function)        {        case DIST_CTL_MAX_RETRIES:            if (arg < 0)                return (ERROR);            distNodeMaxRetries = arg;            return (OK);        case DIST_CTL_RETRY_TIMEOUT:            if (arg < 0)                return (ERROR);            /*             * <arg> is in ticks;             * <distNodeRetryTimeout> is in manager wakeups;             */            distNodeRetryTimeout = (1000 * arg / sysClkRateGet() +                    DIST_NODE_MGR_WAKEUP_MSEC - 1) / DIST_NODE_MGR_WAKEUP_MSEC;            return (OK);        case DIST_CTL_OPERATIONAL_HOOK:            {            for (i = 0; i < DIST_NODE_MAX_HOOKS; i++)                {                if (distNodeOperationalHook[i] == NULL)                    {                    distNodeOperationalHook[i] = (FUNCPTR) arg;                    return (OK);                    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文成人av在线| 日韩精彩视频在线观看| 日韩精品一卡二卡三卡四卡无卡| 久草精品在线观看| 欧美日韩精品高清| 综合电影一区二区三区| 经典三级一区二区| 欧美精品九九99久久| 亚洲国产精品精华液2区45| 日韩**一区毛片| 欧美亚洲国产一区二区三区va | 国产一区二区三区四区在线观看| 一本色道**综合亚洲精品蜜桃冫| 国产午夜亚洲精品不卡| 麻豆专区一区二区三区四区五区| 日韩欧美中文一区二区| 成人免费不卡视频| 婷婷综合另类小说色区| 久久久蜜桃精品| 欧美图片一区二区三区| 成人av免费在线播放| 五月天中文字幕一区二区| 日本一二三不卡| 日韩欧美一区在线| 欧美在线色视频| 91网页版在线| 国产激情视频一区二区在线观看 | 日韩精品福利网| 日韩女同互慰一区二区| 91污在线观看| 国产成人精品综合在线观看| 精品一区二区在线视频| 日韩欧美成人午夜| 麻豆久久久久久| 一区二区三区四区激情| 国产精品久久久久久久久果冻传媒| 久久久久久亚洲综合影院红桃| 中文字幕一区二区三区四区| 91麻豆精品国产91久久久久久久久| 国产精品网曝门| 懂色中文一区二区在线播放| 欧美国产激情二区三区| 99久久亚洲一区二区三区青草| 欧美激情一区二区三区全黄| 风流少妇一区二区| 亚洲欧美激情在线| 欧美精品自拍偷拍动漫精品| 久久综合五月天婷婷伊人| 日韩欧美国产电影| 国产视频一区在线观看| 亚洲蜜臀av乱码久久精品| 日韩电影在线免费看| 国产一区二区三区久久久| 久久国产精品99精品国产| 国产美女一区二区三区| 色94色欧美sute亚洲线路二| 亚洲四区在线观看| 日本一区二区三区四区| 粉嫩高潮美女一区二区三区| 自拍视频在线观看一区二区| 色av一区二区| 久久国产精品无码网站| 国产精品你懂的| 欧美精选一区二区| 成人亚洲一区二区一| 亚洲线精品一区二区三区| 欧美va亚洲va香蕉在线| av成人免费在线观看| 日韩精品一二区| 国产精品色呦呦| 欧美一区二区三区免费视频| 国产aⅴ综合色| 日韩电影在线观看网站| 中文字幕成人av| 91精品中文字幕一区二区三区| 成人精品免费看| 日韩中文字幕麻豆| 国产精品久久久久久久久免费桃花 | 色综合久久久网| 美女一区二区视频| 亚洲黄色尤物视频| 久久久精品国产免大香伊| 欧美三级韩国三级日本三斤| 国产精品一色哟哟哟| 国产麻豆一精品一av一免费 | 制服丝袜在线91| 91在线国产福利| 韩国成人精品a∨在线观看| 亚洲一区免费视频| 国产精品久久久久久久久免费桃花 | 欧美日韩免费不卡视频一区二区三区| 久久国产福利国产秒拍| 亚洲一区视频在线观看视频| 中文字幕av在线一区二区三区| 日韩一区二区在线看| 91国在线观看| 99精品视频一区二区| 国产不卡视频在线播放| 欧美无砖专区一中文字| 怡红院av一区二区三区| 欧美专区日韩专区| 精品一区二区三区欧美| 日本一区二区三区国色天香| 97久久超碰精品国产| 亚洲高清免费视频| 日韩精品一区二区三区四区视频| 精品影视av免费| 中文字幕人成不卡一区| 欧美一区二区三区免费| 成人精品国产一区二区4080| 日本不卡一区二区| 亚洲欧洲www| 亚洲精品一区二区三区在线观看| 成人美女在线视频| 韩国精品主播一区二区在线观看 | 蜜桃免费网站一区二区三区| 91久久精品一区二区三区| 成人v精品蜜桃久久一区| 美女网站色91| 国产乱一区二区| 日本一区二区综合亚洲| 美女脱光内衣内裤视频久久网站 | 国产精品夫妻自拍| 久久久噜噜噜久久人人看 | 九九九久久久精品| 韩国女主播成人在线观看| 国产福利不卡视频| 国产美女一区二区三区| 日韩有码一区二区三区| 美女一区二区久久| 日本aⅴ免费视频一区二区三区| 国产精品久久看| 中文字幕 久热精品 视频在线| 69p69国产精品| 99视频热这里只有精品免费| 国产精品白丝jk黑袜喷水| 国精品**一区二区三区在线蜜桃| 美女看a上一区| 国产91色综合久久免费分享| 欧美日韩国产天堂| 久久99国产精品麻豆| 欧美丰满少妇xxxbbb| 国产一区二三区好的| 成人av资源在线观看| 欧美日韩aaaaaa| 久久精品亚洲麻豆av一区二区| 亚洲人成电影网站色mp4| 人人精品人人爱| 从欧美一区二区三区| 欧美少妇bbb| 国产日韩欧美不卡| 污片在线观看一区二区| 国产麻豆一精品一av一免费| 在线亚洲精品福利网址导航| 日韩免费高清av| 亚洲乱码中文字幕| 激情综合亚洲精品| 欧美午夜不卡视频| 久久精品水蜜桃av综合天堂| 亚洲不卡在线观看| 成人av高清在线| 日韩女优毛片在线| 亚洲在线免费播放| 国产成人精品免费一区二区| 欧美三级电影在线观看| 国产精品麻豆久久久| 免费观看91视频大全| 91国偷自产一区二区三区观看| 久久久久久久久久久电影| 亚洲国产综合色| 色综合久久久久综合99| 久久精品欧美日韩| 蜜桃视频在线一区| 欧美日韩免费一区二区三区视频| 欧美激情艳妇裸体舞| 老司机精品视频一区二区三区| 91久久人澡人人添人人爽欧美| 亚洲国产精品成人综合色在线婷婷| 日韩精品亚洲一区| 欧美日韩精品一区二区| 麻豆91小视频| 欧美麻豆精品久久久久久| 亚洲免费大片在线观看| 国产成人亚洲综合a∨婷婷图片| 日韩精品中文字幕在线一区| 视频一区二区三区中文字幕| 一本到三区不卡视频| 国产精品国产馆在线真实露脸| 国产一区二区福利视频| 久久综合狠狠综合久久综合88| 日韩国产精品久久| 欧美一区二区私人影院日本| 亚洲不卡在线观看| 欧美电影在线免费观看| 亚洲成av人片在线| 欧美日韩亚洲高清一区二区| 亚洲一区二区精品久久av| 欧美中文字幕亚洲一区二区va在线| 一区二区三区产品免费精品久久75| 91亚洲永久精品|