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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cpipe.cpp

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? CPP
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// 
// Module Name:  
//     CPipe.cpp
// Abstract:  
//     Implements the Pipe class for managing open pipes for UHCI
//
//                             CPipe (ADT)
//                           /             \
//                  CQueuedPipe (ADT)       CIsochronousPipe
//                /         |       \ 
//              /           |         \
//   CControlPipe    CInterruptPipe    CBulkPipe
// 
// 
// Notes: 
// 
//

#include "cpipe.hpp"
#include "cphysmem.hpp"
#include "chw.hpp"
#include "cuhcd.hpp"

//#pragma warning (4 : 4100)      // temporary, will clean later. JEFFRO.

CHCCAera::CHCCAera(IN CPhysMem* const pCPhysMem) 
:m_pCPhysMem(pCPhysMem)
{
#ifdef DEBUG
    m_debug_fInitializeAlreadyCalled = FALSE;
#endif // DEBUG

// schedule related vars
//CRITICAL_SECTION    CPipe::m_csFrameListLock;
//PULONG              CPipe::m_vaFrameList = NULL;
    m_pFinalQH = NULL;
                                    
#ifdef DEBUG
    m_debug_TDMemoryAllocated = 0;
    m_debug_QHMemoryAllocated = 0;
    m_debug_BufferMemoryAllocated = 0;
    m_debug_ControlExtraMemoryAllocated = 0;
#endif // DEBUG

// Handle Done Transfers thread variables
    m_pDoneHead = 0;
    m_fCheckTransferThreadClosing = FALSE;
    m_hCheckForDoneTransfersEvent = NULL;
    m_hCheckForDoneTransfersThread = NULL;
    m_pBusyPipeList = NULL;
#ifdef DEBUG
    m_debug_numItemsOnBusyPipeList = 0;
#endif // DEBUG
    numReclamationTransfers=0;
    InitializeCriticalSection( &m_csBusyPipeListLock );
    InitializeCriticalSection( &m_csQHScheduleLock );
}
CHCCAera::~CHCCAera()
{
    DeInitialize();
    DeleteCriticalSection( &m_csBusyPipeListLock );
//    DeleteCriticalSection( &m_csFrameListLock );
    DeleteCriticalSection( &m_csQHScheduleLock );
}

// *****************************************************************
// Scope: public static
BOOL CHCCAera::Initialize(IN CUhcd * const pCUhcd)
//
// Purpose: Initialize CPipe's static variables. This
//          also sets up the original empty schedule
//          with the frame list, and interrupt Queue Head tree.
//          We also set up a thread for processing done transfers
//
// Parameters: pCPhysMem - pointer to memory manager object
//
// Returns: TRUE - if everything initialized ok
//          FALSE - in case of failure
//
// Notes: This function is only called from the CUhcd::Initialize routine.
//        It should only be called once, to initialize the static variables
// ******************************************************************
{
    DEBUGMSG(ZONE_INIT, (TEXT("+CPipe::Initialize\n")));

#ifdef DEBUG // only call this once to init static vars/schedule
    DEBUGCHK( m_debug_fInitializeAlreadyCalled == FALSE );
    m_debug_fInitializeAlreadyCalled = TRUE;
#endif // DEBUG

    DEBUGCHK( m_fCheckTransferThreadClosing == FALSE &&
              m_hCheckForDoneTransfersThread == NULL &&
              m_hCheckForDoneTransfersEvent == NULL );
    DEBUGCHK( m_pBusyPipeList == NULL &&
              m_debug_numItemsOnBusyPipeList == 0 );

    if ( m_pCPhysMem == NULL ) {
        DEBUGCHK( 0 ); // This should never happen
        DEBUGMSG(ZONE_ERROR, (TEXT("-CPipe::Initialize, no memory manager object!!\n")));
        return FALSE;
    }

    // Init the list of EDs for scheduling transfers in the periodic lists
    memset( m_interruptQHTree, 0, sizeof(m_interruptQHTree) );
    // set up the periodic (intr/isoch) scheduling structures
    {
        // We set this up as follows:
        // (demonstrated for UHCD_MAX_INTERRUPT_INTERVAL = 4)
        // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        //
        //                level 2 level 1 level 0    Full Speed QH     End of Schedule 
        //
        //   frame #0 -> QH #4  \
        //                         QH #2
        //   frame #2 -> QH #6  /       \
        //                               \      (1ms intr)     (isoch)
        //                                 QH # 1 - - - - QH #0 - - - - FinalQH
        //                               / 
        //   frame #1 -> QH #5  \       /
        //                         QH #3 
        //   frame #3 -> QH #7  / 
        //
        //   etc for rest of frames
        //
        //   The outermost QHs will be numbered i = UHCD_MAX_INTERRUPT_INTERVAL + x, where
        //   x = 0, 1, 2, 3, .., UHCD_MAX_INTERRUPT_INTERVAL - 1. The QH #i will be 
        //   scheduled by any frame which has index == x (mod UHCD_MAX_INTERRUPT_INTERVAL)
        //
        //   Note that the QHs in the kth level will be executed every
        //   2^k frames. Take any number n. If 2^k <= n < 2^(k+1), then
        //   QH #n is placed in the tree at level k. When we want to schedule
        //   a new queue every 2^k frames, we can place it after any existing
        //   tree queues 2^k, 2^k + 1, 2^k + 2, ..., 2^(k+1) - 1
        //
        //   Given QH #n (n > 1), if n in binary is 1x(remaining_bits)b,
        //   then QH #n links to QH # 01(remaining_bits)b.
        //   For instance, 7 = 111b links to 3 = 011b
        //   and also      4 = 100b links to 2 = 010b
        //
        //   ISOCHRONOUS EDs will be placed after QH #0.
        //
        //   INTERRUPT transfers will be placed at the appropriate point within the QH
        //   tree so that they are scheduled at regular intervals.

        // we need 2 * UHCD_MAX_INTERRUPT_INTERVAL + 1 queue heads which
        // will always remain in the schedule and never be freed
        P_ED vaQHList = NULL;
#define CPIPE_INITIALIZE_ED_MEMORY_NEEDED DWORD( (2 * UHCD_MAX_INTERRUPT_INTERVAL + 1) * sizeof( ED ) )
        if ( !m_pCPhysMem->AllocateMemory( DEBUG_PARAM( TEXT("Permanent EDs"), )
                                           CPIPE_INITIALIZE_ED_MEMORY_NEEDED,
                                           (PUCHAR *) &vaQHList,
                                           CPHYSMEM_FLAG_NOBLOCK ) ) {
            DEBUGMSG(ZONE_ERROR, (TEXT("-CPipe::Initialize - Could not get EDs for schedule\n")));
            return FALSE;
        }
    #ifdef DEBUG
        m_debug_QHMemoryAllocated += CPIPE_INITIALIZE_ED_MEMORY_NEEDED;
        DEBUGMSG( ZONE_QH, (TEXT("CPipe::Initialize - allocate persistent QHs, total bytes = %d\n"), m_debug_QHMemoryAllocated) );
    #endif // DEBUG
        m_pFinalQH = vaQHList;
        vaQHList += 1;
        m_interruptQHTree[0] = vaQHList;
        vaQHList += 1;
        // m_pFinalQH is at the very end of the schedule, and points back
        // to QH # 0. For now, the terminate bit is set in HLink, because
        // there are no high speed bulk/control transfers scheduled
        memset( m_pFinalQH, 0, sizeof(ED) );
        m_pFinalQH->bfSkip = 1;
        m_pFinalQH->paNextEd = 0;

        // QH # 0 points to m_pFinalQH
        memset( m_interruptQHTree[0], 0, sizeof(ED) );
        m_interruptQHTree[0]->bfIsIsochronous = 1;
        m_interruptQHTree[0]->bfSkip = 1;
        m_interruptQHTree[0]->paNextEd = GetQHPhysAddr( m_pFinalQH );

        for ( UCHAR pow = 1; pow <= UHCD_MAX_INTERRUPT_INTERVAL; pow <<= 1 ) {
            for ( UCHAR index = pow; index < (pow << 1); index++ ) {
                DEBUGCHK( m_interruptQHTree[ index ] == NULL );
                m_interruptQHTree[ index ] = vaQHList;
                vaQHList += 1;
                const UCHAR link = (index ^ pow) | (pow >> 1);
                DEBUGCHK( m_interruptQHTree[ link ] != NULL );
                memset( m_interruptQHTree[index], 0, sizeof(ED) );
                m_interruptQHTree[index]->bfSkip = 1;
                m_interruptQHTree[index]->paNextEd = GetQHPhysAddr( m_interruptQHTree[link] );
            }
        }

        // Fill in the HCCA Interrupt ED ListHeads.
        for (int index = 0; index < UHCD_MAX_INTERRUPT_INTERVAL; ++index)
            pCUhcd->CHW::m_pInterruptTable[index] = GetQHPhysAddr( m_interruptQHTree[index+UHCD_MAX_INTERRUPT_INTERVAL] );
    }

    // m_hCheckForDoneTransfersEvent - Auto Reset, and Initial State = non-signaled
    m_hCheckForDoneTransfersEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
    if ( m_hCheckForDoneTransfersEvent == NULL ) {
        DEBUGMSG(ZONE_ERROR, (TEXT("-CPipe::Initialize. Error creating process done transfers event\n")));
        return FALSE;
    }

    // set up our thread to check for done transfers
    // currently, the context passed to CheckForDoneTransfersThread is ignored
    m_hCheckForDoneTransfersThread = CreateThread( 0, 0, CheckForDoneTransfersThreadStub, (PVOID)this, 0, NULL );
    if ( m_hCheckForDoneTransfersThread == NULL ) {
        DEBUGMSG(ZONE_ERROR, (TEXT("-CPipe::Initialize. Error creating process done transfers thread\n")));
        return FALSE;
    }
    CeSetThreadPriority( m_hCheckForDoneTransfersThread, g_IstThreadPriority + RELATIVE_PRIO_CHECKDONE );

    DEBUGMSG(ZONE_INIT, (TEXT("-CPipe::Initialize. Success!\n")));
    return TRUE;
}

// *****************************************************************
// Scope: public static
void CHCCAera::DeInitialize( void )
//
// Purpose: DeInitialize any static variables
//
// Parameters: None
//
// Returns: Nothing
//
// Notes: This function should only be called from the ~CUhcd()
// ******************************************************************
{
#ifdef DEBUG // don't call this twice
    DEBUGCHK( m_debug_fInitializeAlreadyCalled );
    m_debug_fInitializeAlreadyCalled = FALSE;
#endif // DEBUG

    m_fCheckTransferThreadClosing = TRUE;
    // Wake up the CheckForDoneTransfersThread and give it time to die
    if ( m_hCheckForDoneTransfersEvent ) {
        SetEvent( m_hCheckForDoneTransfersEvent );
        if ( m_hCheckForDoneTransfersThread ) {
            DWORD dwWaitReturn = WaitForSingleObject( m_hCheckForDoneTransfersThread, 5000 );
            if ( dwWaitReturn != WAIT_OBJECT_0 ) {
                DEBUGCHK( 0 ); // check why thread is blocked
                TerminateThread( m_hCheckForDoneTransfersThread, DWORD(-1) );
            }
            CloseHandle( m_hCheckForDoneTransfersThread );
            m_hCheckForDoneTransfersThread = NULL;
        }
        CloseHandle( m_hCheckForDoneTransfersEvent );
        m_hCheckForDoneTransfersEvent = NULL;
    }

    // all busy pipes should have been closed by now
    DEBUGCHK( m_pBusyPipeList == NULL &&
              m_debug_numItemsOnBusyPipeList == 0 );

    m_fCheckTransferThreadClosing = FALSE;

//    m_pCPhysMem->FreeSpecialMemory( PUCHAR(m_vaFrameList));
}
// ******************************************************************
// Scope: public static
void CHCCAera::SignalCheckForDoneTransfers( DWORD paDoneHead )
//
// Purpose: This function is called when an interrupt is received by
//          the CHW class. We then signal the CheckForDoneTransfersThread
//          to check for any transfers which have completed
//
// Parameters: None
//
// Returns: Nothing
//
// Notes: DO MINIMAL WORK HERE!! Most processing should be handled by
//        The CheckForDoneTransfersThread. If this procedure blocks, it
//        will adversely affect the interrupt processing thread.
// ******************************************************************
{
    DEBUGCHK( m_hCheckForDoneTransfersEvent && m_hCheckForDoneTransfersThread );

    DEBUGCHK( paDoneHead != 0 ); // spurious interrupts are filtered in CHW

    // Traverse the list of done TDs, reversing it in place and simultaneously
    // relinking it with virtual instead of physical addresses.
    P_TD pTD = (P_TD) m_pCPhysMem->PaToVa(paDoneHead);
    P_TD pTail = pTD;
    P_TD pPrev = 0;
    while (pTD) {
        DWORD paNext = pTD->paNextTd.phys;
        P_TD pNext = paNext ? (P_TD) m_pCPhysMem->PaToVa(paNext) : 0;

        pTD->paNextTd.td = pPrev;
        pPrev = pTD;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲av在线| 亚洲影院免费观看| 欧美日韩在线一区二区| 久久精品国产久精国产| 一区二区视频在线看| 精品国产污污免费网站入口| 91福利区一区二区三区| 国产一区不卡视频| 美女视频网站久久| 亚洲高清视频中文字幕| 亚洲欧洲精品天堂一级| 精品国产sm最大网站| 欧美日韩一区二区三区不卡| av在线不卡电影| 国产美女精品人人做人人爽| 青青国产91久久久久久| 午夜视频在线观看一区二区三区| 国产精品视频你懂的| 欧美精品一区二区高清在线观看| 欧美三级日韩三级| 色老头久久综合| 不卡的av中国片| 国产经典欧美精品| 国产尤物一区二区| 美日韩一区二区三区| 视频一区视频二区中文字幕| 一区二区三区在线免费观看| 中文av一区二区| 国产欧美日韩精品一区| 久久色.com| 久久亚洲私人国产精品va媚药| 91精品久久久久久久99蜜桃| 欧美日韩视频在线观看一区二区三区 | 色婷婷久久久久swag精品 | 宅男在线国产精品| 欧美日本国产视频| 欧美性xxxxxxxx| 欧美性生活大片视频| 91福利区一区二区三区| 欧美在线一区二区| 欧美日韩国产经典色站一区二区三区| 在线一区二区三区四区五区| 日本韩国欧美一区| 欧美日韩视频在线一区二区| 欧美精品日日鲁夜夜添| 在线成人免费视频| 日韩女优毛片在线| 久久网站最新地址| 中文字幕的久久| 1区2区3区国产精品| 一区二区三区日韩欧美| 一区二区三区加勒比av| 亚洲国产日韩av| 日本三级韩国三级欧美三级| 青青草97国产精品免费观看 | 777色狠狠一区二区三区| 欧美情侣在线播放| 日韩女优电影在线观看| ww久久中文字幕| 亚洲国产精品99久久久久久久久| 亚洲欧洲精品一区二区三区 | 亚洲免费成人av| 午夜电影网亚洲视频| 麻豆免费看一区二区三区| 国产主播一区二区三区| 成人激情图片网| 欧美性猛交xxxxxx富婆| 欧美一区二区三区喷汁尤物| 久久综合色8888| 专区另类欧美日韩| 日av在线不卡| 成人激情动漫在线观看| 欧美三级中文字幕在线观看| 日韩久久免费av| 亚洲欧美韩国综合色| 天天av天天翘天天综合网| 国产一区二区三区四区五区入口| 成人av电影观看| 欧美久久久久久久久中文字幕| 精品国产污污免费网站入口| 中文字幕一区二区视频| 日本伊人精品一区二区三区观看方式 | 亚洲男女毛片无遮挡| 免费高清在线视频一区·| 成人午夜av在线| 欧美精品123区| 中文字幕第一区二区| 青青草原综合久久大伊人精品 | 中文字幕精品综合| 天天操天天综合网| av电影在线不卡| 精品国产乱码久久久久久久| 亚洲精品日韩一| 国产成人午夜片在线观看高清观看| 在线观看欧美精品| 欧美国产日本韩| 蜜桃久久av一区| 欧美午夜在线一二页| 欧美激情在线免费观看| 日韩和欧美的一区| 色呦呦国产精品| 国产女同性恋一区二区| 美女视频黄久久| 欧美亚洲动漫精品| 国产精品美女久久久久久久网站| 全国精品久久少妇| 欧美视频中文一区二区三区在线观看| 国产欧美综合色| 精彩视频一区二区| 91精品麻豆日日躁夜夜躁| 亚洲免费在线看| av在线综合网| 久久精品一区二区三区四区| 免费在线一区观看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 欧美韩国日本不卡| 国产在线精品免费av| 91麻豆精品国产91久久久使用方法 | 国产亚洲欧美激情| 精品一区二区久久| 91精品国产综合久久久久久久久久| 亚洲欧美综合另类在线卡通| 国产精品一区二区久久精品爱涩 | 国产麻豆9l精品三级站| 日韩一级大片在线观看| 亚洲超碰97人人做人人爱| 色婷婷亚洲婷婷| 国产精品黄色在线观看| 国产传媒一区在线| 久久精品日韩一区二区三区| 久久精品国产久精国产| 日韩一区二区三| 蜜桃av一区二区| 日韩欧美区一区二| 麻豆国产91在线播放| 精品剧情在线观看| 精品在线视频一区| 久久久青草青青国产亚洲免观| 久久aⅴ国产欧美74aaa| 欧美成人一区二区三区片免费| 日本不卡免费在线视频| 91精品久久久久久久91蜜桃| 日韩av一级片| 精品美女在线播放| 国产精品系列在线观看| 久久精品欧美一区二区三区不卡 | eeuss国产一区二区三区| 国产精品久久久久久久久晋中| gogogo免费视频观看亚洲一| 1000部国产精品成人观看| 91香蕉视频污| 天堂午夜影视日韩欧美一区二区| 久久精品国产色蜜蜜麻豆| 国内精品国产成人| 韩国女主播成人在线| 在线观看一区不卡| 午夜精品123| 欧美sm美女调教| www.亚洲免费av| 午夜精品久久久久久久蜜桃app| 欧美一区二区黄| 国产成人在线影院| 亚洲免费资源在线播放| 337p亚洲精品色噜噜狠狠| 久久91精品国产91久久小草| 国产精品嫩草99a| 欧美中文字幕一区| 久久91精品国产91久久小草| 日本一区二区电影| 欧美唯美清纯偷拍| 国产一区不卡精品| 一卡二卡三卡日韩欧美| 欧美电影免费观看高清完整版在线 | 国内外成人在线| 综合欧美一区二区三区| 777午夜精品视频在线播放| 国产福利精品导航| 亚洲成人综合视频| 国产日韩欧美精品一区| 91成人免费在线视频| 麻豆精品久久久| 一区二区三区四区蜜桃| 亚洲精品一区二区三区四区高清| 91免费版在线| 精品亚洲成av人在线观看| 亚洲免费高清视频在线| 久久一日本道色综合| 欧美综合久久久| 国产999精品久久| 日韩精品高清不卡| 亚洲欧洲99久久| 26uuu亚洲| 欧美日韩高清一区| 99久久精品国产网站| 蜜桃久久久久久| 亚洲午夜电影在线观看| 亚洲国产成人午夜在线一区| 欧美一级二级三级乱码| 一本一道综合狠狠老| 国产成人精品免费一区二区|