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

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

?? msgqdistgrplib.c

?? vxworks操作系統(tǒng)的源代碼 供研究學習
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* msgQDistGrpLib.c - distributed message queue group library (VxFusion option) *//* Copyright 1999-2002 Wind River Systems, Inc. *//*modification history--------------------01q,23oct01,jws  fix compiler warnings (SPR 71117); fix man pages (SPR 71239)01p,24jul01,r_s  changed code to be ANSI compatible so that it compiles with                 diab. made asm macro changes for diab01o,09jun99,drm  Allowing check for empty groups.01n,09jun99,drm  Adding some htonl() / ntohl()01m,09jun99,drm  Adding code to return S_msgQDistLib_OVERALL_TIMEOUT01l,01jun99,drm  Adding check to make sure that only distributed message                 queues (and not groups) can be added to a group.01k,24may99,drm  added vxfusion prefix to VxFusion related includes01j,23feb99,wlf  doc edits01i,18feb99,wlf  doc cleanup01h,29oct98,drm  documentation modifications01g,09oct98,drm  fixed a bug reported by Oce01f,13may98,ur   cleanup when msgQDistGrpInit() fails                 locking on group send inquiries01e,08may98,ur   removed 8 bit node id restriction01d,08apr98,ur   optional enhancement CHECK_FOR_EMPTY_GROUP--untested01c,20mar98,ur   set errno when database is full01b,01jul97,ur   tested, ok.01a,11jun97,ur   written.*//*DESCRIPTIONThis library provides the grouping facility for distributed message queues.  Single distributed message queues can join one or more groups.  A messagesent to a group is sent to all message queues that are members of thatgroup.  A group, however, is prohibited from sending messages.  Also, it isan error to call msgQDistNumMsgs() with a distributed message queue group ID.Groups are created with symbolic names and identified by a unique ID, MSG_Q_ID, as with normal message queues.If the group is new to the distributed system, the group agreement protocol (GAP) is employed to determine a globally unique identifier.  As part of the protocol's negotiation, all group databases throughout the system are updated.The distributed message queue group library is initialized by callingdistInit().AVAILABILITYThis module is distributed as a component of the unbundled distributedmessage queues option, VxFusion.INCLUDE FILES: msgQDistGrpLib.hSEE ALSO: distLib, msgQDistGrpShow*/#include "vxWorks.h"#if defined (MSG_Q_DIST_GRP_REPORT) || defined (DIST_DIAGNOSTIC)#include "stdio.h"#endif#include "string.h"#include "stdlib.h"#include "taskLib.h"#include "hashLib.h"#include "sllLib.h"#include "errnoLib.h"#include "msgQLib.h"#include "netinet/in.h"#include "vxfusion/msgQDistLib.h"#include "vxfusion/msgQDistGrpLib.h"#include "vxfusion/distIfLib.h"#include "vxfusion/distStatLib.h"#include "vxfusion/private/msgQDistGrpLibP.h"#include "vxfusion/private/distNetLibP.h"#include "vxfusion/private/distNodeLibP.h"#include "vxfusion/private/distObjLibP.h"#include "vxfusion/private/distLibP.h"/* defines */#define UNUSED_ARG(x)  if(sizeof(x)) {} /* to suppress compiler warnings */#define KEY_ARG_STR        13#define KEY_CMP_ARG_STR    0       /* not used */#define KEY_ARG_ID        65537#define KEY_CMP_ARG_ID    0        /* not used *//* global data */SEMAPHORE                    distGrpDbSemaphore;DIST_MSG_Q_GRP_ID            distGrpIdNext = 0;/* local data */LOCAL HASH_ID                distGrpDbNmId = NULL;LOCAL DIST_GRP_HASH_NODE *   distGrpDbNm = NULL;LOCAL HASH_ID                distGrpDbIdId = NULL;LOCAL DIST_GRP_HASH_NODE *   distGrpDbId = NULL;LOCAL DIST_GRP_DB_NODE *     distGrpDb = NULL;LOCAL SL_LIST                msgQDistGrpFreeList;LOCAL BOOL                   msgQDistGrpLibInstalled = FALSE;/* local prototypes */LOCAL BOOL          msgQDistGrpHCmpStr (DIST_GRP_HASH_NODE *pMatchNode,                                        DIST_GRP_HASH_NODE *pHNode,                                        int keyArg);LOCAL INT32         msgQDistGrpHFuncStr (int elements,                                         DIST_GRP_HASH_NODE *pHNode,                                         int keyArg);LOCAL BOOL          msgQDistGrpHCmpId (DIST_GRP_HASH_NODE *pMatchNode,                                       DIST_GRP_HASH_NODE *pHNode,                                       int keyArg);LOCAL INT32         msgQDistGrpHFuncId (int elements,                                        DIST_GRP_HASH_NODE *pHNode,                                        int keyArg);LOCAL DIST_STATUS    msgQDistGdbInput (DIST_NODE_ID nodeIdSrc,                                       DIST_TBUF_HDR *pTBufHdr);LOCAL DIST_STATUS    msgQDistGrpInput (DIST_NODE_ID nodeIdSrc,                                       DIST_TBUF_HDR *pTBufHdr);LOCAL STATUS         msgQDistGrpLclSend (DIST_MSG_Q_GRP_SEND_INQ *pInq,                                         DIST_MSG_Q_GRP_ID distMsgQGrpId,                                         char *buffer,                                         UINT nBytes, int timeout,                                         int priority);LOCAL void           msgQDistGrpLclSendCanWait (DIST_INQ_ID inqId,                                                MSG_Q_ID msgQId,                                                char *buffer, UINT nBytes,                                                int timeout, int priority);LOCAL STATUS         msgQDistGrpAgent (DIST_NODE_ID nodeIdSender,                                       DIST_INQ_ID inqIdSender,                                       DIST_MSG_Q_GRP_ID distMsgQGrpId,                                       char *buffer,                                       UINT nBytes, int timeout,                                       int priority);LOCAL STATUS         msgQDistGrpSendStatus (DIST_NODE_ID nodeIdDest,                                            DIST_INQ_ID inqId,                                            DIST_MSG_Q_STATUS msgQStatus);LOCAL BOOL           msgQDistGrpBurstOne (DIST_GRP_HASH_NODE *pNode,                                          DIST_GRP_BURST *pBurst);/***************************************************************************** msgQDistGrpLibInit - initialize the distributed message queue group package (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 msgQDistGrpLibInit (void)    {    }/***************************************************************************** msgQDistGrpInit - initialize the group database (VxFusion option)** This routine initializes the group database.** AVAILABILITY* This routine is distributed as a component of the unbundled distributed* message queues option, VxFusion.** RETURNS: OK, if successful; ERROR, if unsucessful.** NOMANUAL*/STATUS msgQDistGrpInit    (    int               sizeLog2   /* init 2^^sizeLog2 entries */    )    {    DIST_GRP_DB_NODE * pDbNode;    int                hashTblSizeLog2;    int                grpHNBytes;    int                grpDbNBytes;    int                grpDbSize;    int                ix;    STATUS             grpDbServAddStatus;    STATUS             msgQGrpServAddStatus;    if (sizeLog2 < 1)        return (ERROR);    if (msgQDistGrpLibInstalled == TRUE)        return (OK);    if (hashLibInit () == ERROR)        return (ERROR); /* hashLibInit() failed */    if (distInqInit (DIST_INQ_HASH_TBL_SZ_LOG2) == ERROR)        return (ERROR);    hashTblSizeLog2 = sizeLog2 - 1;    distGrpDbNmId = hashTblCreate (hashTblSizeLog2, msgQDistGrpHCmpStr,                                   msgQDistGrpHFuncStr, KEY_ARG_STR);    distGrpDbIdId = hashTblCreate (hashTblSizeLog2, msgQDistGrpHCmpId,                                   msgQDistGrpHFuncId, KEY_ARG_ID);    if (distGrpDbNmId && distGrpDbIdId)        {        grpDbSize = 1 << sizeLog2;        grpHNBytes = grpDbSize * sizeof (DIST_GRP_HASH_NODE);        grpDbNBytes = grpDbSize * sizeof (DIST_GRP_DB_NODE);        distGrpDbNm = (DIST_GRP_HASH_NODE *) malloc (grpHNBytes);        distGrpDbId = (DIST_GRP_HASH_NODE *) malloc (grpHNBytes);        distGrpDb = (DIST_GRP_DB_NODE *) malloc (grpDbNBytes);        if (distGrpDbNm && distGrpDbId && distGrpDb)            {            sllInit (&msgQDistGrpFreeList);            for (ix = 0; ix < grpDbSize; ix++)                {                pDbNode = &distGrpDb[ix];                pDbNode->ixNode = ix;                sllPutAtHead (&msgQDistGrpFreeList, (SL_NODE *) pDbNode);                distGrpDbNm[ix].pDbNode = pDbNode;                distGrpDbId[ix].pDbNode = pDbNode;                }            msgQDistGrpDbLockInit();            /* Add distributed group database service to table of services. */            grpDbServAddStatus = distNetServAdd (                    DIST_PKT_TYPE_DGDB,                    msgQDistGdbInput,                    DIST_DGDB_SERV_NAME,                    DIST_DGDB_SERV_NET_PRIO,                    DIST_DGDB_SERV_TASK_PRIO,                    DIST_DGDB_SERV_TASK_STACK_SZ);            /* Add message group service to table of services. */                        msgQGrpServAddStatus =                distNetServAdd ( DIST_PKT_TYPE_MSG_Q_GRP,                                 msgQDistGrpInput,                                 DIST_MSG_Q_GRP_SERV_NAME,                                 DIST_MSG_Q_GRP_SERV_NET_PRIO,                                 DIST_MSG_Q_GRP_SERV_TASK_PRIO,                                 DIST_MSG_Q_GRP_SERV_TASK_STACK_SZ);            if (grpDbServAddStatus != ERROR && msgQGrpServAddStatus != ERROR)                {                msgQDistGrpLibInstalled = TRUE;                return (OK);                }            }        }        /* cleanup, when error */        if (distGrpDbNmId)    hashTblDelete (distGrpDbNmId);        if (distGrpDbIdId)    hashTblDelete (distGrpDbIdId);        if (distGrpDbNm)      free (distGrpDbNm);        if (distGrpDbId)      free (distGrpDbId);        if (distGrpDb)        free (distGrpDb);        return (ERROR);    }/***************************************************************************** msgQDistGrpAdd - add a distributed message queue to a group (VxFusion option)** This routine adds the queue identified by the argument <msgQId> to a group* with the ASCII name specified by the argument <distGrpName>. ** Multicasting is based on distributed message queue groups.  If the group * does not exist, one is created.  Any number of message queues from different * nodes can be bound to a single group. In addition, a message queue can* be added into any number of groups; msgQDistGrpAdd() must be called for each* group of which the message queue is to be a member.** The <options> parameter is presently unused and must be set to 0.** This routine returns a message queue ID, MSG_Q_ID, that can be used directly * by msgQDistSend() or by the generic msgQSend() routine.  Do not call the* msgQReceive() or msgQNumMsgs() routines or their distributed counterparts,* msgQDistReceive() and msgQDistNumMsgs(), with a group message queue ID.** As with msgQDistCreate(), use distNameAdd() to add the group message * queue ID returned by this routine to the distributed name database so * that the ID can be used by tasks on other nodes.** AVAILABILITY* This routine is distributed as a component of the unbundled distributed* message queues option, VxFusion.** RETURNS: MSG_Q_ID, or NULL if there is an error.** ERRNO:* \is* \i S_msgQDistGrpLib_NAME_TOO_LONG* The name of the group is too long.* \i S_msgQDistGrpLib_INVALID_OPTION* The <options> parameter is invalid.* \i S_msgQDistGrpLib_DATABASE_FULL* The group database is full.* \i S_distLib_OBJ_ID_ERROR* The <msgQId> parameter is not a distributed message queue.* \ie** SEE ALSO: msgQLib, msgQDistLib, distNameLib* * INTERNAL NOTE: Takes <distGrpDbSemaphore>.*/MSG_Q_ID msgQDistGrpAdd    (    char *            distGrpName,  /* new or existing group name           */    MSG_Q_ID          msgQId,       /* message queue to add to the group    */    DIST_GRP_OPT      options       /* group message queue options - UNUSED */    )    {    DIST_GRP_DB_NODE * pDistGrpDbNode;    DIST_MSG_Q_ID      dMsgQId;      /* distributed message queue ID */    DIST_OBJ_NODE * pObjNode;     /* ptr to object containing real ID */     DIST_GAP_NODE   dGapNode;    DIST_GAP_NODE * pDGapNodeTemp;    /*     * Check the parameters:       * - msgQId must be a distributed message queue. It cannot be a     *   a standard message queue or a group.     * - the group name cannot exceed DIST_NAME_MAX_LENGTH     * - options must be 0     *     * If any of the parameters are invalid, set errno and return     * NULL to indicate failure.     */    if (!ID_IS_DISTRIBUTED (msgQId)) /* not a distributed message queue */        {        errnoSet (S_distLib_OBJ_ID_ERROR);        return NULL;        }    else                             /* is distributed msgQ */        {        pObjNode = MSG_Q_ID_TO_DIST_OBJ_NODE (msgQId);        if (!IS_DIST_MSG_Q_OBJ (pObjNode))            {            /* legal object ID, but not a message queue */            errnoSet (S_distLib_OBJ_ID_ERROR);            return NULL;                }               dMsgQId = (DIST_MSG_Q_ID) pObjNode->objNodeId;        if (IS_DIST_MSG_Q_TYPE_GRP(dMsgQId))            {            /* ID refers to a group, not a plain dist. message queue */            errnoSet (S_distLib_OBJ_ID_ERROR);            return NULL;            }        }    if (strlen (distGrpName) > DIST_NAME_MAX_LENGTH)        {        errnoSet (S_msgQDistGrpLib_NAME_TOO_LONG);        return (NULL);    /* name too long */        }    if (options != 0)        {        errnoSet (S_msgQDistGrpLib_INVALID_OPTION);        return (NULL);    /* options parameter currently unused */        }    /* Lock the database and try to find the group. */    msgQDistGrpDbLock();    pDistGrpDbNode = msgQDistGrpLclFindByName (distGrpName);    if (pDistGrpDbNode == NULL)        {#ifdef MSG_Q_DIST_GRP_REPORT        DIST_MSG_Q_GRP_ID    grpId;#endif        /* Group is unknown by now, create it. */#ifdef MSG_Q_DIST_GRP_REPORT        printf ("msgQDistGrpAdd: group is unknown by now--create it\n");#endif        pDistGrpDbNode = msgQDistGrpLclCreate (distGrpName, distGrpIdNext++,                                               DIST_GRP_STATE_LOCAL_TRY);        msgQDistGrpDbUnlock();        if (pDistGrpDbNode == NULL)            {#ifdef DIST_DIAGNOSTIC            distLog ("msgQDistGrpAdd: failed to create new group\n");#endif            errnoSet (S_msgQDistGrpLib_DATABASE_FULL);            return (NULL);            }        /*         * Agree on a global unique identifier for the group and         * add the fist group member.         */#ifdef MSG_Q_DIST_GRP_REPORT        printf ("msgQDistGrpAdd: enter agreement phase, propose 0x%lx\n",                (u_long) msgQDistGrpLclGetId (pDistGrpDbNode));        grpId =#endif            msgQDistGrpAgree (pDistGrpDbNode);#ifdef MSG_Q_DIST_GRP_REPORT        printf ("msgQDistGrpAdd: agreed on 0x%lx\n", (u_long) grpId);#endif        msgQDistGrpLclAddMember (pDistGrpDbNode, msgQId);        }    else        {        /* Group already exists. Check the state. */#ifdef MSG_Q_DIST_GRP_REPORT        printf ("msgQDistGrpAdd: group already exists--add object\n");#endif        while (pDistGrpDbNode->grpDbState < DIST_GRP_STATE_GLOBAL)            {                /*                 * Group already exists, but has a local state. This means,                 * somebody else tries to install the group.                 * We unlock the group database and wait for a go-ahead.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品一区二区三区在线观看| 91麻豆精品国产91久久久更新时间 | 26uuu精品一区二区在线观看| 精品成人私密视频| 蜜桃av噜噜一区| 日韩久久免费av| 精品一区二区三区免费| 久久品道一品道久久精品| 国产成人鲁色资源国产91色综| 精品视频1区2区3区| 亚洲妇女屁股眼交7| 欧美日韩视频在线一区二区| 日本一区中文字幕| 精品美女一区二区| 国产1区2区3区精品美女| 国产精品激情偷乱一区二区∴| 久久成人久久鬼色| 久久理论电影网| 99精品视频免费在线观看| 亚洲精品乱码久久久久久黑人| 精品在线你懂的| 国产女主播一区| 99视频国产精品| 亚洲一区二区欧美激情| 日韩欧美一区二区三区在线| 成人午夜又粗又硬又大| 亚洲一区二区综合| 欧美精品一区二区三区一线天视频| 亚洲成a人片在线不卡一二三区| 成人av资源在线观看| 无码av免费一区二区三区试看| 91女人视频在线观看| 亚洲v日本v欧美v久久精品| 久久综合九色综合欧美亚洲| 色美美综合视频| 精品综合久久久久久8888| 亚洲日本一区二区| 欧美xingq一区二区| 色哟哟一区二区在线观看| 久久国产精品免费| 亚洲欧美激情小说另类| 久久亚洲私人国产精品va媚药| 免费高清在线一区| 国产精品美女视频| 欧美精品在线观看播放| 成人免费的视频| 九一九一国产精品| 亚洲在线一区二区三区| 国产午夜一区二区三区| 欧美视频一区二区在线观看| 国产成人av一区二区| 日韩高清不卡一区二区三区| 亚洲欧美日韩在线不卡| 久久精品免费在线观看| 日韩亚洲欧美一区| 欧美天天综合网| 色综合天天综合给合国产| 国产伦精一区二区三区| 日日摸夜夜添夜夜添国产精品| 日韩一级完整毛片| 日本高清不卡视频| av在线播放成人| 成人小视频免费观看| 精东粉嫩av免费一区二区三区| 欧美激情一区二区三区蜜桃视频| youjizz国产精品| 国产风韵犹存在线视精品| 五月天亚洲精品| 亚洲男人天堂av网| 1000精品久久久久久久久| 久久蜜臀精品av| 精品国产污污免费网站入口 | 色欧美乱欧美15图片| 国产成人午夜电影网| 国产一区二区三区不卡在线观看| 国产欧美精品一区二区色综合朱莉| 波波电影院一区二区三区| 国产乱子伦一区二区三区国色天香| 日本一区二区免费在线| 精品国产免费人成在线观看| 精品三级在线看| 日韩精品一区二区三区视频播放| 97久久久精品综合88久久| 成人a区在线观看| www.视频一区| 色综合欧美在线| 色综合久久88色综合天天免费| 热久久免费视频| 久久不见久久见免费视频7| 精品一区二区成人精品| 精品制服美女久久| 久久精品国产秦先生| 男女男精品视频| 国产精品 欧美精品| 成人精品免费视频| 色狠狠综合天天综合综合| 欧美视频自拍偷拍| 欧美乱妇一区二区三区不卡视频| kk眼镜猥琐国模调教系列一区二区 | 2023国产精品自拍| 亚洲精品一区二区三区福利| 欧美激情自拍偷拍| 亚洲特黄一级片| 亚洲福利一二三区| 麻豆传媒一区二区三区| 国产东北露脸精品视频| 91首页免费视频| 欧美高清视频一二三区| 精品福利一二区| 国产精品久久久久一区 | 色婷婷av久久久久久久| 在线观看一区不卡| 日韩一级成人av| 国产精品久99| 免费在线一区观看| 丁香婷婷综合网| 欧美色涩在线第一页| 精品国产免费人成电影在线观看四季 | 91久久精品一区二区| 欧美一区二区精品久久911| 国产欧美日韩另类视频免费观看| 日韩一区二区精品在线观看| 久久精品人人爽人人爽| 亚洲国产日韩a在线播放| 久国产精品韩国三级视频| 91视频在线看| 久久久美女艺术照精彩视频福利播放| 欧美一区二区视频在线观看| 国产精品视频在线看| 天天免费综合色| 91亚洲精品乱码久久久久久蜜桃| 国产精品66部| 欧美日韩国产系列| 国产精品免费aⅴ片在线观看| 国产日韩欧美激情| 婷婷成人综合网| 91小视频免费观看| 日韩欧美一卡二卡| 一区二区免费看| 国产成人亚洲综合a∨猫咪| 911国产精品| 亚洲天堂2016| 成人久久久精品乱码一区二区三区 | 欧美美女一区二区三区| 国产欧美日本一区二区三区| 免费黄网站欧美| 欧美日韩午夜精品| 亚洲乱码中文字幕| 国产91对白在线观看九色| 日韩一二三四区| 日韩激情中文字幕| 在线观看视频91| 亚洲区小说区图片区qvod| 国产一区在线看| xf在线a精品一区二区视频网站| 久久久99精品久久| 免费高清在线视频一区·| 欧美日韩一区二区欧美激情| 一区二区国产视频| 在线观看视频91| 亚洲午夜私人影院| 色婷婷久久久综合中文字幕| 国产精品人妖ts系列视频| 国产乱妇无码大片在线观看| 精品国精品国产尤物美女| 偷窥少妇高潮呻吟av久久免费 | 韩国v欧美v亚洲v日本v| 日韩一区二区在线看| 日本麻豆一区二区三区视频| 欧美久久一区二区| 亚洲成人你懂的| 欧美妇女性影城| 日韩电影一区二区三区四区| 欧美色老头old∨ideo| 亚洲综合一区二区三区| 欧美在线视频日韩| 亚洲国产成人va在线观看天堂| 国产在线一区二区综合免费视频| 97精品国产97久久久久久久久久久久| 欧美性色黄大片| 午夜视频在线观看一区二区三区 | 国产寡妇亲子伦一区二区| 久久久蜜桃精品| 北条麻妃一区二区三区| 日韩美女视频一区| 欧美亚洲国产一卡| 午夜精品久久久久久久99水蜜桃 | 欧美绝品在线观看成人午夜影视| 久久青草欧美一区二区三区| 国产精品一级二级三级| 国产欧美久久久精品影院| 92国产精品观看| 亚洲1区2区3区视频| 日韩欧美在线一区二区三区| 国产成人av一区二区| 亚洲综合一区二区三区| 日韩久久免费av| 91亚洲精品一区二区乱码| 日韩av一二三| 亚洲国产精品高清|