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

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

?? buffer.c

?? 從大量的wince源代碼中剝離出的fat文件系統(tǒng)源代碼。移植性非常高。 微軟的代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
        if (cBufVolumes++ == 0) {

            DWORD cbTotal;
            PBYTE pbCarve = NULL;

            if (cbufTotal == 0) {

                SYSTEM_INFO si;

                InitList((PDLINK)&dlBufMRU);

                // Determine buffer size (and number of blocks per that size)

                GetSystemInfo(&si);

#ifdef BIG_BUFFERS
                cbBuf = si.dwPageSize;

                // Make sure that a system with, say, 4K pages will still work
                // with a device that has, say, 8K sectors.

                if (cbBuf < pvol->v_pdsk->d_diActive.di_bytes_per_sect) {
                    cbBuf = pvol->v_pdsk->d_diActive.di_bytes_per_sect;
                    flBuf |= GBUF_LOCALALLOC;
                }
#else
                cbBuf = pvol->v_pdsk->d_diActive.di_bytes_per_sect;

                if (cbBuf != si.dwPageSize)
                    flBuf |= GBUF_LOCALALLOC;
#endif
                // Make sure the optimal buffer size for this volume is
                // ALSO at least as large as our block size.

                if (cbBuf < BLOCK_SIZE)
                    cbBuf = BLOCK_SIZE;

                // Make sure buffer size is a multiple of the block size.

                if ((cbBuf & BLOCK_OFFSET_MASK) != 0) {
                    DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!AllocBufferPool: cbBuf(%d) not a multiple of BLOCK_SIZE(%d), failing...\n"), cbBuf, BLOCK_SIZE));
                    goto error;
                }

                // Calculate the number of blocks per buffer.

                cblkBuf = cbBuf >> BLOCK_LOG2;

                // Calculate mask that converts a block into a buffer-granular block.

                maskBufBlock = ~(cblkBuf-1);

                // Make sure number of blocks per buffer is power of 2.

                if ((cblkBuf & ~maskBufBlock) != 0) {
                    DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!AllocBufferPool: cblkBuf(%d) is not a power of two, failing...\n"), cblkBuf));
                    goto error;
                }

                // See if it makes sense to allocate a large chunk of virtual
                // memory and carve it up (ie, if the total size of the buffer
                // pool is a perfect number of pages).

                ASSERT(pbBufCarve == NULL);

                if ((cbTotal = DEF_BUFFERS * cbBuf) % si.dwPageSize == 0) {

                    pbBufCarve = VirtualAlloc(0,
                                              cbTotal,
                                              MEM_RESERVE|MEM_COMMIT,
                                            //MEM_RESERVE|MEM_MAPPED,
                                              PAGE_READWRITE
                                            //PAGE_NOACCESS
                                             );
                    if (pbBufCarve) {
                        DEBUGALLOC(cbTotal);
                        pbCarve = pbBufCarve;
                    }
                }
            }

            while (cbufTotal < DEF_BUFFERS) {
                PBUF pbuf;
                if (!(pbuf = NewBuffer(cbBuf, &pbCarve)))
                    break;
                cbufTotal++;
                AddItem((PDLINK)&dlBufMRU, (PDLINK)&pbuf->b_dlink);
            }

            if (cbufTotal < MIN_BUFFERS) {

              error:
                FreeBufferPool(pvol);
                LeaveCriticalSection(&csBuffers);
                return FALSE;
            }

            // Since we have at least MIN_BUFFERS buffers now, calculate
            // the number of threads our buffer pool can handle simultaneously.
            // If DEMAND_PAGING is enabled, we reduce that number by 1 so that
            // a Pagein thread can always assume there are adequate buffers.

#ifdef DEMAND_PAGING
            cBufThreads = cBufThreadsOrig = cbufTotal / MIN_BUFFERS - 1;
#else
            cBufThreads = cBufThreadsOrig = cbufTotal / MIN_BUFFERS;
#endif
        }
    }

    // For all calls (first time or not), we must invalidate any buffers
    // we retained for an unmounted volume that was subsequently *recycled*
    // instead of *remounted*.

    if (pvol->v_flags & VOLF_RECYCLED)
        InvalidateBufferSet(pvol, TRUE);

    LeaveCriticalSection(&csBuffers);
    return TRUE;
}


/*  FreeBufferPool - free all buffers in buffer pool
 *
 *  ENTRY
 *      pvol - pointer to VOLUME currently being unmounted
 *
 *  EXIT
 *      TRUE if volume can be freed, or FALSE if not (ie, there are still
 *      dirty buffers that could not be committed).  Note that if the volume
 *      wasn't going to be freed to begin with, we always return FALSE.
 *
 *      This module keeps track of the number of buffer clients (volumes),
 *      and only when the last client has called FreeBufferPool will the pool
 *      actually be freed (subject to all buffers being clean, of course).
 */

BOOL FreeBufferPool(PVOLUME pvol)
{
    PBUF pbuf, pbufEnd;
    BOOL fFree = TRUE;
    BOOL fFreeCarve = FALSE;

    ASSERT(OWNCRITICALSECTION(&pvol->v_cs));

    // If the current volume isn't even using the buffer pool (yet),
    // then we're done.

    if (!(pvol->v_flags & VOLF_BUFFERED))
        return fFree;

    EnterCriticalSection(&csBuffers);

    // This is our last chance to commit all dirty buffers.  With any
    // luck, this will clean all the buffers, allowing us to free them all.
    // That will be our assumption at least.  If dirty buffers still remain
    // for this volume, its DIRTY bit will get set again, below.

    CommitVolumeBuffers(pvol);
    pvol->v_flags &= ~VOLF_DIRTY;

    // If we have buffers carved from a single chunk of memory, then
    // quickly walk the entire list and determine if ALL the carved buffers
    // can be freed.  A single dirty or held carved buffer means that NONE
    // of the carved buffers can be freed.

    pbuf = dlBufMRU.pbufNext;
    pbufEnd = (PBUF)&dlBufMRU;

    if (pbBufCarve) {
        if (cBufVolumes == 1) {
            fFreeCarve = TRUE;
            if (!(pvol->v_flags & VOLF_CLOSING)) {
                while (pbuf != pbufEnd) {
                    if ((pbuf->b_flags & BUF_DIRTY) || HeldBuffer(pbuf)) {
                        DEBUGMSG(TRUE,(DBGTEXT("FATFS!FreeBufferPool: dirty/held buffer for block %d!\n"), pbuf->b_blk));
                        if (pbuf->b_flags & BUF_CARVED) {
                            fFreeCarve = fFree = FALSE;
#ifndef DEBUG
                            break;  // in debug builds, we like to see all the dirty buffers
#endif
                        }
                    }
                    pbuf = pbuf->b_dlink.pbufNext;
                }
            }
        }
        if (fFreeCarve) {
            DEBUGFREE(DEF_BUFFERS * cbBuf);
            VERIFYTRUE(VirtualFree(pbBufCarve, 0, MEM_RELEASE));
            pbBufCarve = NULL;
        }
    }

    // Now walk the buffer list again, freeing every buffer that we can.

    pbuf = dlBufMRU.pbufNext;

    while (pbuf != pbufEnd) {

        BOOL fClean = !(pbuf->b_flags & BUF_DIRTY) && !HeldBuffer(pbuf);

        if (pvol->v_flags & VOLF_CLOSING) {

            // The only reason we hold the buffer is so that CleanBuffer
            // won't generate a bogus assertion.  We don't care about the
            // data anymore, so it is otherwise pointless.

            HoldBuffer(pbuf);
            CleanBuffer(pbuf);
            UnholdBuffer(pbuf);

            fClean = TRUE;
        }

        if (cBufVolumes > 1) {

            // If there are still other clients (ie, volumes), then all we
            // want to do is remove any buffer references to this volume
            // if it's being destroyed, so that we avoid false matches
            // if another volume with the same address gets allocated later.

            if (pbuf->b_pvol == pvol) {
                if (fClean) {
                    pbuf->b_pvol = NULL;
                } else {
                    pvol->v_flags |= VOLF_DIRTY;
                    fFree = FALSE;
                }
            }
        }
        else {

            ASSERT(pbuf->b_pvol == NULL || pbuf->b_pvol == pvol);

            if (fClean) {

                pbuf->b_pvol = NULL;

                // The current buffer is clean.  Now, if this is NOT a carved
                // buffer, or it is but we can free all the carved buffers anyway,
                // then free the current buffer.

                if (!(pbuf->b_flags & BUF_CARVED) || fFreeCarve) {

                    cbufTotal--;

                    if (!(pbuf->b_flags & BUF_CARVED)) {
                        DEBUGFREE(cbBuf);
                        if (flBuf & GBUF_LOCALALLOC)
                            VERIFYNULL(LocalFree((HLOCAL)pbuf->b_pdata));
                        else
                            VERIFYTRUE(VirtualFree(pbuf->b_pdata, 0, MEM_RELEASE));
                    }

                    RemoveItem((PDLINK)&pbuf->b_dlink);

                    DEBUGFREE(sizeof(BUF));
                    VERIFYNULL(LocalFree((HLOCAL)pbuf));

                    pbuf = dlBufMRU.pbufNext;
                    continue;
                }
            }
            else {
                ASSERT(pbuf->b_pvol == pvol);

                pvol->v_flags |= VOLF_DIRTY;
                fFree = FALSE;
            }
        }
        pbuf = pbuf->b_dlink.pbufNext;
    }

  //DEBUGMSG(cbufTotal, (DBGTEXT("FATFS!FreeBufferPool: %d buffers retained\n"), cbufTotal));

    // If there were no dirty buffers for this volume, then we can remove
    // its reference to buffer pool.

    if (!(pvol->v_flags & VOLF_DIRTY)) {
        pvol->v_flags &= ~VOLF_BUFFERED;
        cBufVolumes--;
    }

    LeaveCriticalSection(&csBuffers);

    return fFree;
}


/*  ModifyBuffer - Prepare to dirty buffer
 *
 *  ENTRY
 *      pbuf - pointer to buffer
 *      pMod - pointer to modification
 *      cbMod - length of modification (ZERO to prevent logging)
 *
 *  EXIT
 *      ERROR_SUCCESS if the buffer is allowed to be modified, otherwise
 *      some error code (eg, ERROR_WRITE_PROTECT).
 */

DWORD ModifyBuffer(PBUF pbuf, PVOID pMod, int cbMod)
{
    DWORD dwError = ERROR_SUCCESS;

    ASSERTHELDBUFFER(pbuf);

    if (pbuf->b_pvol->v_flags & VOLF_READONLY) {
        dwError = ERROR_WRITE_PROTECT;
    }

    if (!dwError)
        DirtyBuffer(pbuf);

    return dwError;
}


/*  DirtyBuffer - Dirty a buffer
 *
 *  ENTRY
 *      pbuf - pointer to BUF
 *
 *  EXIT
 *      The buffer is marked DIRTY.
 */

void DirtyBuffer(PBUF pbuf)
{
    ASSERTHELDBUFFER(pbuf);

    pbuf->b_flags |= BUF_DIRTY;
}


/*  DirtyBufferError - Dirty a buffer that cannot be cleaned
 *
 *  ENTRY
 *      pbuf - pointer to BUF
 *      pMod - pointer to modification (NULL if none)
 *      cbMod - length of modification (ZERO if none)
 *
 *  EXIT
 *      The buffer is marked DIRTY, and any error is recorded.
 */

void DirtyBufferError(PBUF pbuf, PVOID pMod, int cbMod)
{
    ASSERTHELDBUFFER(pbuf);

    pbuf->b_flags |= BUF_DIRTY;

    EnterCriticalSection(&csBuffers);

    if (!(pbuf->b_flags & BUF_ERROR)) {
        if (cbufError % MIN_BUFFERS == 0)
            InterlockedDecrement(&cBufThreads);
        cbufError++;
        pbuf->b_flags |= BUF_ERROR;
    }
    LeaveCriticalSection(&csBuffers);
}


/*  CommitBuffer - Commit a dirty buffer
 *
 *  ENTRY
 *      pbuf - pointer to BUF
 *      fCS - TRUE if csBuffers is held, FALSE if not
 *
 *  EXIT
 *      ERROR_SUCCESS (0) if successful, non-zero if not.
 *
 *  NOTES
 *      Since we clear BUF_DIRTY before calling WriteVolume, it's important
 *      we do something to prevent FindBuffer from getting any bright ideas
 *      about reusing it before we have finished writing the original dirty
 *      contents.  Furthermore, since we don't want to hold csBuffers across
 *      the potentially lengthy WriteVolume request, applying another hold to
 *      the buffer is really our only option.
 */

DWORD CommitBuffer(PBUF pbuf, BOOL fCS)
{
    PBYTE pbMod = NULL;
    int cbMod = 0;
    DWORD dwError = ERROR_SUCCESS;

#ifdef UNDER_CE     ASSERT(fCS == OWNCRITICALSECTION(&csBuffers));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区二区不卡| 精品国产欧美一区二区| 亚洲综合男人的天堂| 色呦呦一区二区三区| 18成人在线观看| 欧美亚洲日本一区| 视频一区在线视频| 91精品综合久久久久久| 精品一区二区在线看| 久久久久久久免费视频了| 国产精品一区二区久激情瑜伽| 国产精品麻豆视频| 91久久精品一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了| 欧美丰满嫩嫩电影| 韩国理伦片一区二区三区在线播放| 久久久精品综合| 99视频国产精品| 亚洲chinese男男1069| 日韩欧美国产一区在线观看| 国产不卡视频一区| 亚洲综合免费观看高清在线观看| 在线综合亚洲欧美在线视频| 国产精品羞羞答答xxdd| 樱花影视一区二区| 精品精品国产高清a毛片牛牛 | 一本高清dvd不卡在线观看| 亚洲一二三四区不卡| 精品国产成人在线影院| 91丝袜呻吟高潮美腿白嫩在线观看| 午夜伦欧美伦电影理论片| 精品欧美一区二区在线观看| 91视频免费看| 激情伊人五月天久久综合| 国产精品欧美一级免费| 欧美私模裸体表演在线观看| 国内精品视频666| 亚洲在线免费播放| 国产午夜精品理论片a级大结局 | 久久er精品视频| 亚洲免费视频中文字幕| 日韩一级大片在线观看| 色综合久久综合| 国产精品中文字幕一区二区三区| 亚洲一区视频在线| 国产精品伦一区二区三级视频| 日韩亚洲欧美高清| 在线观看国产日韩| 成人h版在线观看| 激情深爱一区二区| 日日噜噜夜夜狠狠视频欧美人| 国产精品视频在线看| 精品福利一二区| 777a∨成人精品桃花网| 色视频欧美一区二区三区| 国产91丝袜在线观看| 日韩一区精品视频| 亚洲综合视频网| 亚洲欧美激情插| 国产精品你懂的| 国产情人综合久久777777| 日韩欧美一区二区免费| 欧美丰满少妇xxxxx高潮对白| 色婷婷综合久久久久中文一区二区| 国产福利视频一区二区三区| 麻豆专区一区二区三区四区五区| 亚洲成人在线免费| 亚洲狠狠丁香婷婷综合久久久| 欧美激情一区在线观看| 久久久亚洲综合| 欧美成人福利视频| 日韩一二三区不卡| 91精品国产aⅴ一区二区| 欧美日韩在线直播| 色婷婷综合久久久久中文| 波多野结衣中文字幕一区二区三区| 国产麻豆精品一区二区| 久久99蜜桃精品| 国内精品写真在线观看| 国产麻豆一精品一av一免费| 激情综合一区二区三区| 国产在线一区二区| 国产最新精品精品你懂的| 狠狠色丁香婷综合久久| 国内国产精品久久| 国产精品18久久久久久久网站| 精品一区二区久久| 国产很黄免费观看久久| 国产a视频精品免费观看| 国产精品18久久久久久久久| 国产福利91精品一区| 国产精品一区二区三区乱码| 成人精品亚洲人成在线| av不卡一区二区三区| 色呦呦一区二区三区| 欧美在线999| 91精品欧美一区二区三区综合在| 欧美一区二区三区视频在线 | 久久久影视传媒| 国产欧美日韩另类一区| 亚洲欧美综合色| 一区二区在线观看av| 亚洲国产乱码最新视频| 免费在线一区观看| 国产成人福利片| 国产精品羞羞答答xxdd| 中文字幕亚洲不卡| 亚洲一区影音先锋| 蜜臀av在线播放一区二区三区 | 日韩视频免费直播| 国产欧美日韩久久| 亚洲国产中文字幕在线视频综合 | 91精品国产综合久久精品图片| 日韩精品一区二区三区swag| 国产亚洲欧美色| 亚洲午夜激情网站| 精品在线播放午夜| 色综合久久综合中文综合网| 欧美一级艳片视频免费观看| 国产午夜精品一区二区三区嫩草 | 午夜在线电影亚洲一区| 国产一区二区在线免费观看| 91在线精品秘密一区二区| 91精品在线免费观看| 国产精品初高中害羞小美女文| 亚洲国产va精品久久久不卡综合| 激情都市一区二区| 91成人网在线| 国产日韩欧美制服另类| 亚洲一区二区美女| 福利一区二区在线| 91精品国产综合久久久久久久| 中文在线一区二区| 美女视频一区二区| 在线观看精品一区| 欧美激情综合五月色丁香小说| 丝袜美腿亚洲色图| 99国产精品一区| 精品国产一区二区三区忘忧草| 亚洲最大的成人av| 国产成人精品免费视频网站| 欧美老人xxxx18| 亚洲欧美电影院| 国产成人av福利| 欧美va亚洲va| 首页国产欧美日韩丝袜| 91国产精品成人| 国产精品视频免费| 国产麻豆视频一区| 日韩精品一区在线| 日韩精品久久久久久| 在线观看精品一区| 亚洲欧美国产77777| 成人免费va视频| 国产午夜久久久久| 国产永久精品大片wwwapp| 91精品久久久久久久99蜜桃| 欧美极品xxx| 国产一区二区三区在线观看免费视频 | 日韩一级大片在线观看| 一区二区三区四区在线播放| 岛国一区二区三区| 国产视频一区二区三区在线观看| 毛片av一区二区| 日韩欧美成人一区二区| 无码av免费一区二区三区试看| 在线中文字幕一区| 夜夜嗨av一区二区三区| 欧美在线|欧美| 亚洲成在人线免费| 欧美日韩国产首页| 天天操天天色综合| 在线成人午夜影院| 日韩精品五月天| 欧美一级片在线看| 麻豆精品视频在线观看免费| 日韩欧美一级在线播放| 麻豆精品在线播放| 精品剧情v国产在线观看在线| 亚洲精品成人悠悠色影视| 91视频观看视频| 亚洲男人天堂一区| 在线视频欧美精品| 亚洲成a人v欧美综合天堂下载 | 欧美一区二区三区四区高清| 日韩国产高清在线| 欧美va在线播放| 国产91富婆露脸刺激对白| 中文字幕一区二区三区av| 91国产免费看| 日韩va欧美va亚洲va久久| 欧美一级欧美三级| 国产精品中文字幕欧美| 亚洲欧美在线aaa| 欧美怡红院视频| 日本成人在线网站| 久久精品视频在线免费观看| 99re视频精品| 丝袜美腿亚洲色图| 国产三级欧美三级日产三级99 |