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

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

?? mem.cpp

?? ISP1161 USB Driver under WinCE for StrongARM processor implementation
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
CPhysMem::~CPhysMem()
{
    DeleteCriticalSection(&m_csLock);
    CloseHandle(m_hFreeMemEvent);

    FreeList(&m_pInUseListHead);
    FreeList(&m_pFreeListHead);
    FreePhysicalMemory(m_pPhysicalBufferAddr, m_dwTotalPhysMemSize);
}



//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
EError CPhysMem::FreeList(PMEMLIST *ppHead)
{
    PMEMLIST pCurrent = *ppHead;
    PMEMLIST pNext;

    while (pCurrent != NULL)
    {
        pNext = pCurrent->next;
        OHCD_Free(pCurrent);
        pCurrent = pNext;
    }

    *ppHead = NULL;
    return(successful);
}



//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
EError 
CPhysMem::AllocateMemory(
    UINT    size, 
    PUCHAR* pVirtAddr, 
    ULONG*  pPhysAddr,
    DWORD   dwFlags,
    BOOL*   pfRequestingAbort
    )
{
    //
    // Scan the free list for the first chunk that's just big enough to satisfy
    // this request. Remove from the free list. Chop it up (unless the result 
    // is less than 8 bytes). Then re-sort the remaining free chunk back into the
    // free list and place the newly allocated chunk on the IN USE list.
    //
    PMEMLIST pNode;
    PMEMLIST pNodeNew;
    BOOL fHighPri = ((dwFlags & USBALLOCF_HIGHPRIORITY) == USBALLOCF_HIGHPRIORITY);

    if (dwFlags & USBALLOCF_SPECIAL) {
        ASSERT(!m_bSpecialTaken);
        *pVirtAddr = (PUCHAR) m_dwSpecialVA;
        *pPhysAddr = (ULONG)  m_dwSpecialPA;
        m_bSpecialTaken = TRUE;
        DEBUGMSG(ZONE_FUNCTION,(TEXT("OHCD : AllocateMemory : bSpecial allocated\r\n")));
        return(successful);
    }

    //
    // We keep our block sizes in multiples of 8. Round up to next 8.
    //
    if (size != 0) {
        DWORD dwOldSize = size;
        size = ((size-1) & ~(8-1)) + 8;

        DEBUGMSG((dwOldSize != size) && ZONE_VERBOSE && ZONE_FUNCTION,
                     (TEXT("AllocateMemory: (roundup %d->%d)\r\n"), dwOldSize, size));
    }

    EnterCriticalSection(&m_csLock);

    VALIDATE_HEAPS(fHighPri);

    ASSERT(size <= USBPAGESIZE && TEXT("Nonsupported memory size"));

    pNode = FindFreeBlock(size, fHighPri);
    if ( pNode == NULL ) {
        if ( fHighPri ) {
            //
            // Not available from High Priority region, try allocating from Normal region.
            //
            LeaveCriticalSection(&m_csLock);
            return (AllocateMemory(size, pVirtAddr, pPhysAddr, USBALLOCF_NOBLOCK, NULL));
        } else if ( !(dwFlags & USBALLOCF_NOBLOCK) ) {
            //
            // There are no free blocks available. Wait until there are.
            //
            DEBUGMSG(ZONE_ALLOC | ZONE_WARNING, (TEXT("OHCD : No memory block available for allocation... waiting\r\n")));

        #ifdef DEBUG
            const DWORD dwTickCountStart = GetTickCount();
        #endif // DEBUG

            BOOL fRequestingAbort = FALSE;

            if (pfRequestingAbort == NULL) {
                DEBUGMSG( ZONE_WARNING, (TEXT("OHCD: Warning - Block for memory requested with no method for aborting!\n")) );
                //
                // The default is to pass in a NULL pointer, so let's use our
                // own local BOOLEAN.
                //
                pfRequestingAbort = &fRequestingAbort;
            }
            do {
                LeaveCriticalSection(&m_csLock);

                if (*pfRequestingAbort == FALSE) {
                    //
                    // We start operating in "slow mode". See the class defn.
                    //
                    m_fHaveWaited = TRUE;
                    //
                    // Event will be signaled whenever memory is freed
                    //
                    WaitForSingleObject(m_hFreeMemEvent, 60000);
                    //
                    // Has this request been cancelled? Get out now.
                    //
                    if (*pfRequestingAbort) {
                        return(aborted);
                    }
                }
                //
                // Shouldn't have been waiting for memory this long
                //
                DEBUGCHK( GetTickCount() - dwTickCountStart < 10000 );

                EnterCriticalSection(&m_csLock);

                pNode = FindFreeBlock(size, fHighPri);
            } while ( pNode == NULL );
        } else {
            //
            // No mem available, Fail
            //
            LeaveCriticalSection(&m_csLock);
            *pVirtAddr = NULL;
            return outOfMemory;
        }
    }
    // pNode == NULL should have been handled above
    DEBUGCHK( pNode != NULL );
    if ((pNode->dwSize - size) >= 8) {
        //
        // There's enough left over to create a new block.
        //
        DWORD dwNewSize = pNode->dwSize - size;
        pNodeNew = CreateNewNode(dwNewSize, pNode->dwVirtAddr + size, 
                                            pNode->dwPhysAddr + size);

        AddNodeToFreeList(pNodeNew, fHighPri);
        pNode->dwSize = size;
    }
    InsertNodeBefore(pNode, FirstNode(INUSELIST(fHighPri)));
    *pVirtAddr = (PUCHAR) pNode->dwVirtAddr;
    *pPhysAddr = (ULONG) pNode->dwPhysAddr;
    
    DEBUGMSG(ZONE_FUNCTION, (TEXT("OHCD : AllocateMemory : VA = 0x%08X, PA = 0x%08X, size = %d\r\n"),
                          *pVirtAddr, *pPhysAddr, size));

    VALIDATE_HEAPS(fHighPri);
    
    LeaveCriticalSection(&m_csLock);

    return(successful);
}



//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
EError 
CPhysMem::FreeMemory(
    PUCHAR virtAddr, 
    ULONG physAddr, 
    DWORD dwFlags
    )
{
    BOOL fRemoved = FALSE;
    BOOL fHighPri = ((dwFlags & USBALLOCF_HIGHPRIORITY) == USBALLOCF_HIGHPRIORITY);

    //
    // take it out of the IN USE list and sort it (coalesce) in the free list.
    //
    if (dwFlags & USBALLOCF_SPECIAL) {
        m_bSpecialTaken = FALSE;
        return(successful);
    }

    if (virtAddr == NULL && physAddr == 0)
    {
        return(error);
    }

    if (physAddr == 0)
    {
        physAddr = VaToPa(virtAddr);
    }
    else if (virtAddr == NULL)
    {
        virtAddr = PaToVa(physAddr);
    }

    EnterCriticalSection(&m_csLock);

    PMEMLIST pNode = FirstNode(INUSELIST(fHighPri));
    
    VALIDATE_HEAPS(fHighPri);

    //
    // Walk the list looking for this block
    //
    while (!EndOfList(INUSELIST(fHighPri), pNode)) {

        if ((pNode->dwVirtAddr == (DWORD) virtAddr) &&
            (pNode->dwPhysAddr == (DWORD) physAddr)) {
            
            RemoveNode(pNode);
            AddNodeToFreeList(pNode, fHighPri);
            fRemoved = TRUE;
            break;
        }
        pNode = pNode->next;
    }
    
    if (fHighPri && !fRemoved) {
        LeaveCriticalSection(&m_csLock);
        //
        // Try removing from normal region.
        //
        return(FreeMemory(virtAddr, physAddr, 0));
    }
    
    VALIDATE_HEAPS(fHighPri);

    DEBUGMSG(ZONE_FUNCTION, 
             (TEXT("OHCD : FreeMemory : VA = 0x%08X, PA = 0x%08X, flags = 0x%08X\r\n"),
             virtAddr, physAddr, dwFlags));
    
    LeaveCriticalSection(&m_csLock);
    //
    // Signal everyone waiting for memory that some just became available.
    //
    if (m_fHaveWaited)
        PulseEvent(m_hFreeMemEvent);
    
    return(successful);
}



//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
EError 
CPhysMem::ReleaseBlockedCalls()
{
    //
    // Signal everyone waiting for memory to check if they have been aborted.
    //
    if (m_fHaveWaited)
        PulseEvent(m_hFreeMemEvent);
    
    return(successful);
}



//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
BOOL FreePhysicalMemory(LPVOID lpMemory, UINT cbSize)
{
    UnlockPages(lpMemory, cbSize);
    VirtualFree(lpMemory,0, MEM_RELEASE);

    return TRUE;
}



//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
LPVOID AllocatePhysicalMemory(UINT cbSize, LPULONG ppaBuffer)
{
    LPVOID pBuffer = NULL;
    LPVOID pLastBuffer;
    LPVOID pNextBuffer;
    ULONG paBuffer = 0;
    BOOL fDone;
    BOOL fResult;
    //let's first find the maximum # of pages that could be locked
    UINT cPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(NULL, cbSize);
    //allocate an array for the maximum # of pages
    PULONG aPages = new ULONG[cPages];

    // we need to allocate at least 1 byte
    if(cbSize == 0)
        cbSize = 1;

    do
    {
        fDone = TRUE;
        pLastBuffer = pBuffer;

        pBuffer = VirtualAlloc(NULL, cbSize,
                MEM_COMMIT, PAGE_NOCACHE | PAGE_READWRITE);

        // our allocated block had better be on a page boundary!
        ASSERT(((DWORD)pBuffer & (PAGE_SIZE - 1)) == 0);

        DEBUGMSG(ZONE_ALLOC,
                (TEXT("Allocated possibly continuous memory block: %%08X\r\n"),
                pBuffer));

        if(pBuffer)
        {
            fResult = LockPages(pBuffer, cbSize, aPages, LOCKFLAG_WRITE);

            if(fResult)
            {
                PULONG pPage;

                ASSERT(cPages ==
                        ADDRESS_AND_SIZE_TO_SPAN_PAGES(pBuffer, cbSize));
                pPage = aPages;

                // We want page numbers and NK gives us the physical address
                // of each page, adjust the list.  Except on MIPS where NK
                // gives us the physical address shifted right 6 bits.

                for(UINT i = 0 ; i < cPages ; ++i)
                {
#if defined(MIPS)
#if defined(R4000) | defined(R5230)
#if defined(R4100)
                    *pPage >>= PAGE_SHIFT - 4;
#else
                    *pPage >>= PAGE_SHIFT - 6;
#endif
#else
                    *pPage >>= PAGE_SHIFT;
#endif
#elif defined(SHx) | defined(x86) | defined(PPC) | defined(ARM)
                    *pPage >>= PAGE_SHIFT;
#else
#error Unsupported Processor
#endif
                    ++pPage;
                }

                pPage = aPages;

                ASSERT(cPages > 0);

                for(i = 0 ; i < cPages - 1 && fDone ; ++i)
                {
                    if(*pPage + 1 != *(pPage + 1))
                        fDone = FALSE;

                    ++pPage;
                }
                if(fDone)
                    paBuffer = *aPages << PAGE_SHIFT;
            }
            if(!fDone)
                *(LPLPVOID)pBuffer = pLastBuffer;
        }
    } while(!fDone);

    while(pLastBuffer)
    {
        pNextBuffer = *(LPLPVOID)pLastBuffer;

        UnlockPages(pLastBuffer, cbSize);
        VirtualFree(pLastBuffer,0, MEM_RELEASE);

        pLastBuffer = pNextBuffer;
    }

    // our allocated block had better be on a page boundary or we will miss
    // part of the physical address and the interrupt table will not be aligned!
    ASSERT(((DWORD)pBuffer & (PAGE_SIZE - 1)) == 0);

    ASSERT(ppaBuffer);
    *ppaBuffer = paBuffer;

    ASSERT((*ppaBuffer & (PAGE_SIZE - 1)) == 0);

    if(aPages)
        delete[] aPages;

    DEBUGMSG(ZONE_INIT|ZONE_ALLOC,
             (TEXT("OHCD:AllocatePhysicalMemory Continuous memory block VA: %08X PA:%08X \r\n"), pBuffer, *ppaBuffer));

    return pBuffer;
}

#ifdef  DEBUG
EError CPhysMem::DebugAllocateMemory(UINT size, PUCHAR * pVirtAddr,
            ULONG *pPhysAddr, DWORD dwFlags, BOOL * pfRequestingAbort,
            TCHAR *szFile, DWORD dwLine)
{
    EError  err;
    err = AllocateMemory(size, pVirtAddr, pPhysAddr, dwFlags, pfRequestingAbort);

    DEBUGMSG(ZONE_ALLOC,
            (TEXT("OHCD: ALLOC!!!!! Block at VA = 0x%08X, PA = 0x%08X, size = %d was allocated in File: %s, Line #: %ld \r\n"),
            *pVirtAddr, *pPhysAddr, size, szFile, dwLine));
    
    return err;
}

EError CPhysMem::DebugFreeMemory(PUCHAR virtAddr, ULONG physAddr, DWORD dwFlags,
            TCHAR *szFile, DWORD dwLine)
{
    EError  err;
    err = FreeMemory(virtAddr, physAddr, dwFlags);

    if (physAddr == 0)
    {
        if(virtAddr)
            physAddr = VaToPa(virtAddr);
    }
    else if (virtAddr == NULL)
    {
        if(physAddr)
            virtAddr = PaToVa(physAddr);
    }

    DEBUGMSG(ZONE_ALLOC,
            (TEXT("OHCD: FREE!!!!!! Block at VA = 0x%08X, PA = 0x%08X, flags = 0x%08X was freed in File: %s, Line #: %ld \r\n"),
            virtAddr, physAddr, dwFlags, szFile, dwLine));
    
    return err;
}

#endif



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃av一区二区在线观看| 亚洲免费色视频| 在线一区二区三区四区五区| 国产成人精品免费一区二区| 国产精品2024| 国产精品中文欧美| 国产成人亚洲综合a∨婷婷| 黄页视频在线91| 丁香五精品蜜臀久久久久99网站 | 久久国产精品99久久久久久老狼| 丝袜美腿高跟呻吟高潮一区| 日本不卡一区二区| 美女视频黄频大全不卡视频在线播放| 精品一区二区三区在线视频| 国产一区二区三区四区在线观看| 成人深夜视频在线观看| 欧美精品第1页| 日韩欧美三级在线| 国产精品免费av| 一区二区三区四区视频精品免费 | 丝袜亚洲另类丝袜在线| 青青草成人在线观看| 国产一区999| 99精品视频在线观看免费| 在线观看91精品国产入口| 欧美xxxx老人做受| 日韩一区日韩二区| 久久机这里只有精品| 顶级嫩模精品视频在线看| 欧美影视一区二区三区| 精品久久久久久最新网址| 亚洲色图在线视频| 麻豆成人免费电影| 色综合天天综合给合国产| 日韩一区二区三区电影| 1区2区3区精品视频| 日韩激情视频在线观看| 99精品在线免费| 欧美一区二区三区婷婷月色| 国产精品久久久久精k8| 日日摸夜夜添夜夜添亚洲女人| 国产91露脸合集magnet| 欧美高清视频不卡网| 国产精品久久久久影院亚瑟 | 欧美大肚乱孕交hd孕妇| 国产精品成人免费精品自在线观看 | 久久精品国产免费| 色系网站成人免费| 欧美激情一区二区三区全黄| 免费在线观看视频一区| 欧美在线免费观看亚洲| 国产精品国产自产拍高清av王其| 久久精品国产亚洲高清剧情介绍| 欧美性xxxxxx少妇| 国产精品福利影院| 国产原创一区二区| 日韩女优制服丝袜电影| 亚洲国产aⅴ天堂久久| 成人97人人超碰人人99| 久久影院午夜论| 蜜桃视频免费观看一区| 欧美日韩一区不卡| 亚洲综合一区二区| 色综合久久久久| 亚洲欧洲日产国码二区| 丁香婷婷综合激情五月色| 久久综合99re88久久爱| 蜜桃视频一区二区| 日韩欧美不卡一区| 精品在线播放免费| 欧美成人video| 日韩av在线发布| 欧美精品亚洲二区| 日本vs亚洲vs韩国一区三区| 欧美精品三级在线观看| 免费在线观看精品| 久久亚洲精品国产精品紫薇| 紧缚奴在线一区二区三区| 精品欧美一区二区久久| 国产在线精品不卡| 亚洲国产精品成人综合色在线婷婷 | 99久久久免费精品国产一区二区| 中文字幕成人网| 9久草视频在线视频精品| 亚洲图片欧美激情| 91婷婷韩国欧美一区二区| 亚洲欧美日韩系列| 欧美视频三区在线播放| 天天影视色香欲综合网老头| 日韩女优av电影在线观看| 国产一区二区三区蝌蚪| 国产精品麻豆网站| 欧美特级限制片免费在线观看| 亚洲成av人片| 日韩限制级电影在线观看| 国产高清精品在线| 亚洲欧美成人一区二区三区| 欧美日韩国产一二三| 精品一区二区免费| 国产精品久久久久久福利一牛影视 | 国产午夜精品一区二区三区四区| 成人av午夜电影| 午夜欧美电影在线观看| 国产校园另类小说区| 在线观看免费一区| 国模少妇一区二区三区| 亚洲麻豆国产自偷在线| 日韩欧美一二三四区| 99久久国产综合色|国产精品| 五月天久久比比资源色| 日本一区二区三区国色天香| 精品视频一区三区九区| 国产麻豆视频一区二区| 亚洲成人av电影| 中文字幕第一区第二区| 日韩精品专区在线影院观看| 99久久99久久精品国产片果冻| 美女视频黄 久久| 一区二区三区不卡视频在线观看| 日韩欧美高清在线| 欧美视频你懂的| 不卡欧美aaaaa| 亚洲成人免费看| 国产精品女同互慰在线看| 日韩视频免费观看高清完整版在线观看| 国产高清精品网站| 日本欧美一区二区在线观看| 亚洲黄色小说网站| 中文字幕电影一区| 久久久青草青青国产亚洲免观| 欧美色综合久久| 色婷婷久久久亚洲一区二区三区| 韩国女主播成人在线观看| 日本免费新一区视频| 亚洲二区在线观看| 亚洲综合成人在线| 亚洲日本护士毛茸茸| 国产精品久久久久久亚洲毛片| 日韩视频在线观看一区二区| 666欧美在线视频| 欧美中文字幕一区二区三区| fc2成人免费人成在线观看播放| 国产一区二区福利| 极品尤物av久久免费看| 免费高清在线一区| 日本系列欧美系列| 免费看精品久久片| 美女在线一区二区| 日韩精品三区四区| 日韩电影在线一区二区| 视频在线观看91| 天堂久久久久va久久久久| 五月天久久比比资源色| 日韩精品一级二级| 色偷偷成人一区二区三区91 | 欧美日韩在线三区| 欧美性受极品xxxx喷水| 欧美做爰猛烈大尺度电影无法无天| 99re成人在线| 色婷婷av一区二区三区之一色屋| 一本一道波多野结衣一区二区| 91色综合久久久久婷婷| 色噜噜久久综合| 欧美日韩高清一区二区不卡 | 亚洲国产高清aⅴ视频| 精品av久久707| 国产精品天美传媒| 一区二区三区久久| 日韩电影一区二区三区| 国产麻豆一精品一av一免费 | 欧美一区二视频| 精品国产乱码久久久久久浪潮| 欧美国产日产图区| 亚洲男帅同性gay1069| 午夜精品久久久| 国产黄色91视频| 日韩亚洲欧美中文三级| 中文字幕不卡的av| 亚洲国产成人porn| 国产一区二区三区观看| 99久久免费视频.com| 欧美一区二区在线免费观看| 久久综合九色综合欧美98| 亚洲欧美乱综合| 奇米在线7777在线精品| 成人免费毛片app| 欧美精品乱码久久久久久| 久久精品视频一区| 亚洲国产婷婷综合在线精品| 久久精品国产亚洲5555| 91一区二区在线| 日韩三级免费观看| 亚洲欧美日韩一区二区| 国产美女主播视频一区| 欧美三级三级三级爽爽爽| 久久网站最新地址| 亚洲成a人片在线观看中文| 国产99久久久国产精品免费看| 欧美午夜片在线看| 国产精品激情偷乱一区二区∴|