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

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

?? rvtimer.c

?? 基于h323協議的軟phone
?? C
?? 第 1 頁 / 共 4 頁
字號:
/***********************************************************************
Filename   : rvtimer.c
Description: timer functions
************************************************************************
        Copyright (c) 2001 RADVISION Inc. and RADVISION Ltd.
************************************************************************
NOTICE:
This document contains information that is confidential and proprietary
to RADVISION Inc. and RADVISION Ltd.. No part of this document may be
reproduced in any form whatsoever without written prior approval by
RADVISION Inc. or RADVISION Ltd..

RADVISION Inc. and RADVISION Ltd. reserve the right to revise this
publication and make changes without obligation to notify any person of
such revisions or changes.
***********************************************************************/
#include "rvtimer.h"
#include "rvtimestamp.h"

/* Internal timer structure containing information for each event. */
struct  RvTimerEvent_s {
    RvInt timertype;          /* Type of timer event (ONESHOT or PERIODIC). */
    RvTimerQueue *tqueue;     /* Timer queue that event was placed on. */
    RvInt state;              /* Current state. */
    RvUint id;                /* id number of event, used for sanity check. */
    RvInt64 starttime;        /* timestamp at start time, used for sanity check. */
    RvInt64 triggerlength;    /* How long from starttime until timer should trigger. */
    RvInt64 triggertime;      /* Time at which event should be triggered. */
    RvBool canceled;          /* Set to RV_TRUE when canceled so PERIODIC timers won't repeat. */
    RvSemaphore wait;         /* Used to block tasks waiting to cancel the event. */
    RvSize_t waitcount;       /* Number of tasks waiting to cancel the event. */
    RvObjPoolElement element; /* Required for using object in pool. */
    RvSize_t index;           /* Index of event in Priority Queue. */
    void *userdata;           /* User data to be passed into event callback. */
    RvTimerFunc callback;     /* User callback to be called upon event. */
}; /* typedef RvTimerEvent in header file */

/* Timer event states. */
#define RV_TIMER_EVENTSTATE_NOTINUSE RvIntConst(0)
#define RV_TIMER_EVENTSTATE_QUEUED RvIntConst(1)
#define RV_TIMER_EVENTSTATE_TRIGGERED RvIntConst(2)

/* Lets make error codes a little easier to type */
#define RvTimerErrorCode(_e) RvErrorCode(RV_ERROR_LIBCODE_CBASE, RV_CBASE_MODULE_TIMER, (_e))

static void *RvTimerEventConstruct(void *objptr, void *data);
static void RvTimerEventDestruct(void *objptr, void *data);
static void *RvTimerMemAlloc(RvSize_t size, void *data);
static void RvTimerMemFree(void *ptr, void *data);
static RvBool RvTimerPQueueItemCmp(void *ptr1, void *ptr2);
static void RvTimerPQueueNewIndex(void *item, RvSize_t index);

RvStatus RvTimerInit(void)
{
    return RV_OK;
}

RvStatus RvTimerEnd(void)
{
    return RV_OK;
}

/* tqtype: type of queue (see header file) */
/* starttimers: number of timers to start with in the pool. */
/* maxtimers: number of timers never to exceed this value (not used for FIXED) */
/* mintimers: number of timers never to go below this value (same as starttimers for FIXED) */
/* freelevel: percentage (0-100) of free timers to maintain (DYNAMIC only) */
/* pagetimers: number of timers per memory page in pool. */
/* memregion: memory region to allocate all needed memory from. */
RVCOREAPI RvStatus RVCALLCONV RvTimerQueueConstruct(RvTimerQueue *tqueue, RvInt tqtype, RvSize_t starttimers, RvSize_t maxtimers, RvSize_t mintimers, RvSize_t freelevel, RvSize_t pagetimers, RvMemory *memregion)
{
    RvStatus result;
    RvTimerEvent timerevent;
    RvObjPoolFuncs poolcallbacks;
    RvPQueueFuncs pqueuecallbacks;
    RvSize_t startevents;
    RvInt32 pooltype;
    RvInt pqueuetype;
    RvBool salvage;
    RvSize_t numtimers;

#if defined(RV_NULLCHECK)
    if(tqueue == NULL)
        return RvTimerErrorCode(RV_ERROR_NULLPTR);
#endif

    result = RvLockConstruct(&tqueue->lock);
    if(result != RV_OK)
        return result;

    result = RvSemaphoreConstruct(&tqueue->wait, 0);
    if(result != RV_OK){
        RvLockDestruct(&tqueue->lock);
        return result;
    }

    /* Set up pool and pqueue types based on timer queue type */
    switch(tqtype) {
        case RV_TIMER_QTYPE_FIXED: pooltype = RV_OBJPOOL_TYPE_FIXED;
                                   pqueuetype = RV_PQUEUE_TYPE_FIXED;
                                   salvage = RV_OBJPOOL_SALVAGE_NEVER; /* save space */
                                   break;
        case RV_TIMER_QTYPE_EXPANDING: pooltype = RV_OBJPOOL_TYPE_EXPANDING;
                                       pqueuetype = RV_PQUEUE_TYPE_EXPANDING;
                                       salvage = RV_OBJPOOL_SALVAGE_NEVER; /* save space */
                                       break;
        case RV_TIMER_QTYPE_DYNAMIC: pooltype = RV_OBJPOOL_TYPE_DYNAMIC;
                                      pqueuetype = RV_PQUEUE_TYPE_DYNAMIC;
                                      salvage = RV_OBJPOOL_SALVAGE_ALLOWED; /* required */
                                      break;
        default: RvSemaphoreDestruct(&tqueue->wait);
                 RvLockDestruct(&tqueue->lock);
                 return RvTimerErrorCode(RV_ERROR_OUTOFRANGE);
    }

    /* Contruct pool of events */
    poolcallbacks.objconstruct = RvTimerEventConstruct;
    poolcallbacks.objdestruct = RvTimerEventDestruct;
    poolcallbacks.pagealloc = RvTimerMemAlloc;
    poolcallbacks.pagefree = RvTimerMemFree;
    poolcallbacks.objconstructdata = tqueue; /* tqueue Never changes so set it upon construction. */
    poolcallbacks.objdestructdata = NULL;
    poolcallbacks.pageallocdata = memregion;
    poolcallbacks.pagefreedata = memregion;
    if(RvObjPoolConstruct(&tqueue->pool, &timerevent, &timerevent.element, &poolcallbacks, sizeof(RvTimerEvent), pagetimers, 0, pooltype, salvage, maxtimers, mintimers, freelevel) == NULL) {
        RvSemaphoreDestruct(&tqueue->wait);
        RvLockDestruct(&tqueue->lock);
        return RvTimerErrorCode(RV_TIMER_ERROR_POOL);
    }

    /* Create starting number of events in pool */
    if(starttimers > RvObjPoolTotalItems(&tqueue->pool)) {
        numtimers = starttimers - RvObjPoolTotalItems(&tqueue->pool);
        if(RvObjPoolAddItems(&tqueue->pool, numtimers) < numtimers) {
            RvObjPoolDestruct(&tqueue->pool);
            RvSemaphoreDestruct(&tqueue->wait);
            RvLockDestruct(&tqueue->lock);
            return RvTimerErrorCode(RV_TIMER_ERROR_POOL);
        }
    }

    /* Construct Priority Queue for events (minimum size is 2). */
    startevents = RvObjPoolTotalItems(&tqueue->pool); /* start with pool & queue in sync */
    if(startevents < 2)
        startevents = 2;
    pqueuecallbacks.memalloc = RvTimerMemAlloc;
    pqueuecallbacks.memfree = RvTimerMemFree;
    pqueuecallbacks.itemcmp = RvTimerPQueueItemCmp;
    pqueuecallbacks.newindex = RvTimerPQueueNewIndex;
    pqueuecallbacks.memallocdata = memregion;
    pqueuecallbacks.memfreedata = memregion;
    if(RvPQueueConstruct(&tqueue->pqueue, pqueuetype, startevents, &pqueuecallbacks) == NULL) {
        RvObjPoolDestruct(&tqueue->pool);
        RvSemaphoreDestruct(&tqueue->wait);
        RvLockDestruct(&tqueue->lock);
        return RvTimerErrorCode(RV_TIMER_ERROR_PQUEUE);
    }

    /* clear id number counter */
    tqueue->idcounter = RvUintConst(0);
    tqueue->callcount = 0;
    tqueue->stopped = RV_FALSE;

    return RV_OK;
}

/* This will stop all further operation of the timer queue. */
/* It will block until all callbacks currently in progress have */
/* completed and will not allow any further events to be processed. */
/* This should only be called once for each timer queue. */
RvStatus RvTimerQueueStop(RvTimerQueue *tqueue)
{
    RvStatus result;

#if defined(RV_NULLCHECK)
    if(tqueue == NULL)
        return RvTimerErrorCode(RV_ERROR_NULLPTR);
#endif

    result = RvLockGet(&tqueue->lock);
    if(result != RV_OK)
        return result;

    if(tqueue->stopped == RV_TRUE) {
        /* Already stopped, no harm done just report it. */
        RvLockRelease(&tqueue->lock);
        return RvTimerErrorCode(RV_TIMER_ERROR_QUEUESTOPPED);
    }

    tqueue->stopped = RV_TRUE;

    /* First see if we have to wait for callbacks to complete. */
    if(tqueue->callcount > 0) {
        /* Wait until callbacks complete. */
        RvLockRelease(&tqueue->lock);
        result = RvSemaphoreWait(&tqueue->wait);
        return RV_OK; /* We don't need to do anything else. */
    }

    RvLockRelease(&tqueue->lock);
    return RV_OK;
}

/* Returns the current number event events waiting in the timer queue. */
RvSize_t RvTimerQueueNumEvents(RvTimerQueue *tqueue)
{
    RvSize_t qsize;

#if defined(RV_NULLCHECK)
    if(tqueue == NULL)
        return 0;
#endif

    if(RvLockGet(&tqueue->lock) != RV_OK)
        return 0;
    qsize = RvPQueueNumItems(&tqueue->pqueue);
    RvLockRelease(&tqueue->lock);

    return qsize;
}

/* Returns the current size of the timer queue. Note that this is */
/* the size of the timer pool and that the the size of the priority */
/* queue may be different since, for efficiency, they are not kept */
/* in sync except in the case of a FIXED queue. */
RVCOREAPI RvSize_t RVCALLCONV RvTimerQueueGetSize(RvTimerQueue *tqueue)
{
    RvSize_t poolsize;

#if defined(RV_NULLCHECK)
    if(tqueue == NULL)
        return 0;
#endif

    if(RvLockGet(&tqueue->lock) != RV_OK)
        return 0;
    poolsize = RvObjPoolTotalItems(&tqueue->pool);
    RvLockRelease(&tqueue->lock);

    return poolsize;
}

/* Changes the current size of the timer queue. The size may */
/* only be increased. The additional amount is added to the */
/* pool and to the priority queue. The new value will be returned */
/* and may be larger than the requested size based on page round-off. */
/* Changes are subject to the constraints of the maxtimers and */
/* mintimers settings. */
RvSize_t RvTimerQueueSetSize(RvTimerQueue *tqueue, RvSize_t newsize)
{
    RvSize_t poolsize, newqsize, newitems, result;

#if defined(RV_NULLCHECK)
    if(tqueue == NULL)
        return 0;
#endif

    if(RvLockGet(&tqueue->lock) != RV_OK)
        return 0;

    poolsize = RvObjPoolTotalItems(&tqueue->pool);
    if(newsize <= poolsize) {
        RvLockRelease(&tqueue->lock);
        return poolsize;
    }
    newitems = newsize - poolsize;

    newqsize = newsize;
    if(newqsize < 2)
        newqsize = 2; /* minimum size of priority queue. */

    /* Ajdust the size of the priority queue. */
    if(RvPQueueChangeSize(&tqueue->pqueue, newqsize) != newqsize) {
        RvLockRelease(&tqueue->lock);
        return poolsize;
    }

    /* Add the items to the timer pool. */
    RvObjPoolAddItems(&tqueue->pool, newitems);
    result = RvObjPoolTotalItems(&tqueue->pool);

    RvLockRelease(&tqueue->lock);
    return result;
}

/* Adds to the current size of the timer queue. The amount is added */
/* to the pool and to the priority queue. The actual amount will be */
/* returned and may be larger than the requested size based on page */
/* round-off. Changes are subject to the constraints of the maxtimers */
/* and mintimers settings. */
RVCOREAPI RvSize_t RVCALLCONV RvTimerQueueAddSize(RvTimerQueue *tqueue, RvSize_t addsize)
{
    RvSize_t poolsize, newqsize, result;

#if defined(RV_NULLCHECK)
    if(tqueue == NULL)
        return 0;
#endif

    if(RvLockGet(&tqueue->lock) != RV_OK)
        return 0;

    poolsize = RvObjPoolTotalItems(&tqueue->pool);
    newqsize = poolsize + addsize;
    if(newqsize < 2)
        newqsize = 2; /* minimum size of priority queue. */

    /* Ajdust the size of the priority queue. */
    if(RvPQueueChangeSize(&tqueue->pqueue, newqsize) != newqsize) {
        RvLockRelease(&tqueue->lock);
        return poolsize;
    }

    /* Add the items to the timer pool. */
    RvObjPoolAddItems(&tqueue->pool, addsize);
    result = RvObjPoolTotalItems(&tqueue->pool) - poolsize;

    RvLockRelease(&tqueue->lock);
    return result;
}

/* Returns current value for maxtimers (not used by FIXED queues) */
RvSize_t RvTimerQueueGetMaxtimers(RvTimerQueue *tqueue)
{
    RvSize_t maxtimers;

#if defined(RV_NULLCHECK)
    if(tqueue == NULL)
        return 0;
#endif

    if(RvLockGet(&tqueue->lock) != RV_OK)
        return 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合丝袜日本网| 欧美日韩成人一区二区| 美女视频黄久久| 亚洲一区二区三区自拍| 国产精品毛片无遮挡高清| 国产日韩精品一区二区三区在线| 日韩一区二区免费在线观看| 911精品国产一区二区在线| 91无套直看片红桃| 麻豆久久久久久| 日韩电影在线观看网站| 亚洲国产精品久久艾草纯爱| 国产精品日韩精品欧美在线| 久久久精品国产免费观看同学| 色婷婷综合久久| 色综合色狠狠天天综合色| 99久久久国产精品| eeuss鲁片一区二区三区在线看| 国产福利电影一区二区三区| 日韩1区2区3区| 日本aⅴ精品一区二区三区 | 亚洲激情综合网| 欧美国产日韩亚洲一区| 国产亚洲精品超碰| 欧美激情资源网| 中文字幕永久在线不卡| 亚洲欧美在线观看| 亚洲欧洲中文日韩久久av乱码| 亚洲欧洲精品一区二区三区不卡 | 国产欧美视频一区二区| 欧美激情一区二区三区全黄| 欧美精品一区二区在线观看| 久久九九久久九九| 国产欧美精品国产国产专区| 自拍偷拍亚洲欧美日韩| 一区二区三区在线看| 亚洲国产一区二区视频| 日本亚洲天堂网| 久久99国产精品久久99果冻传媒| 国产精品1区2区| eeuss影院一区二区三区| 91福利区一区二区三区| 欧美一区二区三区在线看| 精品国产乱码久久| 欧美高清在线一区二区| 亚洲精品亚洲人成人网| 亚洲成av人**亚洲成av**| 一区二区三区**美女毛片| 奇米四色…亚洲| 狠狠色丁香九九婷婷综合五月| 国产一区二区精品久久91| 国产精品888| a在线欧美一区| 成人av免费在线观看| 欧美一区中文字幕| 日韩一区二区免费视频| 欧美国产一区在线| 亚洲国产精品影院| 国产精品一区二区无线| 色爱区综合激月婷婷| 久久精品人人做| 亚洲成a人片综合在线| 精品一区二区三区免费毛片爱 | 午夜不卡av免费| 欧美日韩一区二区不卡| 日韩电影网1区2区| 久久综合中文字幕| 91免费版在线| 亚洲欧美精品午睡沙发| 色婷婷综合久久| 国产福利精品导航| 日韩精品电影在线| 国产精品三级久久久久三级| 亚洲成a人v欧美综合天堂| 成人综合在线网站| 欧美一区二区三区电影| 亚洲日本乱码在线观看| 国产成人在线视频网址| 欧美三级视频在线观看 | 亚洲欧美视频在线观看视频| 日韩电影在线免费看| www.av亚洲| 国产色产综合色产在线视频| 午夜精品成人在线视频| 色哟哟一区二区三区| 国产亚洲综合色| 麻豆精品一二三| 欧美日韩一区二区三区四区五区 | 亚洲国产aⅴ成人精品无吗| 成人美女在线视频| 久久亚洲一区二区三区明星换脸| 天天av天天翘天天综合网 | 日本一区二区三区视频视频| 久久精工是国产品牌吗| 色噜噜偷拍精品综合在线| 国产欧美日韩久久| 国产高清精品久久久久| 久久久久久麻豆| 久久99久久99小草精品免视看| 欧美日本免费一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在| 国产精品影音先锋| 久久婷婷国产综合国色天香| 亚洲一区二区三区美女| 在线观看网站黄不卡| 亚洲综合视频在线| 欧美性xxxxxxxx| 日韩精品三区四区| 91精品国产品国语在线不卡 | 日本乱人伦aⅴ精品| 一区二区在线观看免费| 国产精品一区免费在线观看| 777奇米成人网| 麻豆视频一区二区| ww亚洲ww在线观看国产| 日本最新不卡在线| 欧美一区二区高清| 国产在线精品视频| 欧美大胆一级视频| 免费在线观看成人| 欧美激情在线免费观看| 国产综合久久久久久鬼色 | 欧美日产在线观看| 日本免费新一区视频| 日韩三级精品电影久久久| 国产精品亚洲专一区二区三区| 国产精品人人做人人爽人人添| 91亚洲精品一区二区乱码| 日韩国产精品久久久久久亚洲| 欧美三级电影一区| 国产精品资源网| 亚洲一区二区三区不卡国产欧美| 欧美一级日韩不卡播放免费| 国产91精品免费| 亚洲va欧美va人人爽| 精品国产在天天线2019| 91精品国产福利| 豆国产96在线|亚洲| 亚洲日本丝袜连裤袜办公室| 欧美另类一区二区三区| 久久国产人妖系列| 亚洲午夜久久久久久久久电影院| 欧美电影免费观看高清完整版 | 国产亚洲欧美色| 欧美三区免费完整视频在线观看| 久久99日本精品| 亚洲自拍偷拍欧美| 国产欧美一区二区精品性| 91精品国产综合久久久久久久久久| 国产激情91久久精品导航| 奇米影视一区二区三区小说| 樱桃国产成人精品视频| 久久久午夜精品| 日韩精品一区二区三区四区| 色偷偷久久一区二区三区| 国产盗摄女厕一区二区三区| 免费人成黄页网站在线一区二区| 自拍视频在线观看一区二区| 久久综合九色综合97_久久久| 欧美日本在线看| 91免费看`日韩一区二区| 国产在线一区二区| 免费精品视频在线| 日韩国产欧美在线观看| 一区二区三区免费| 亚洲女爱视频在线| 国产精品国产成人国产三级| 久久网站热最新地址| 精品美女在线播放| 欧美一区二区成人| 欧美日本国产视频| 欧美人牲a欧美精品| 欧美影片第一页| 欧美亚洲尤物久久| 欧美日韩中文另类| 久久综合久久鬼色| 久久精品欧美一区二区三区不卡| 日韩欧美在线影院| 欧美精品一区二区久久婷婷| 精品国产乱码91久久久久久网站| 日韩欧美成人一区| 精品国产91久久久久久久妲己| 日韩视频一区二区在线观看| 欧美r级电影在线观看| 日韩一区二区高清| 欧美mv日韩mv国产网站app| 久久免费看少妇高潮| 久久天天做天天爱综合色| 国产日韩欧美a| 亚洲欧美二区三区| 亚洲国产精品视频| 男女性色大片免费观看一区二区| 日韩成人一区二区| 国产一区二区三区不卡在线观看 | 欧美丰满美乳xxx高潮www| 欧美精选一区二区| 国产欧美视频在线观看| 亚洲综合色视频| 成人av在线看| 精品国产一区a|