天天看點

leveldb源碼學習——系統函數封裝Env

Env是一個接口類,提供了基本的系統通路接口,如操作檔案,線程等。

leveldb在util中實作了PosixEnv,實作上述接口

首先定義了幾個基本類型

SequentialFile,提供順序讀方法的接口類

RandomAccessFile,提供随機讀方法的接口類

WritableFile, 提供順序寫方法的接口類

Env接口類定義了以下接口

  • 建立檔案句柄讀檔案
    • 順序讀句柄
    • 随機讀句柄
    • -
  • 建立檔案句柄寫檔案
    • 建立順序寫句柄,已經存在此檔案,删除
    • 建立append寫句柄,已經存在,則append
    • -
  • 建立/删除檔案夾
  • 檔案lock/unlock

posix 的實作

posix實作了Env的含義分兩個方面:1,實作了Posix版本的RandomAccessFile,SequentialFile等,2,實作了PosixEnv類,繼承Env

  • 順序讀檔案

    FILE* file

    fread來提供read

  • random讀檔案

    兩種,第一種使用fd/pread

    int fd

    第二種,使用mmap,直接取記憶體映射

  • 寫檔案

    FILE *file

    fwirte提供寫

另外,Env定義了在背景運作線程執行背景任務的接口

PosixEnv::Schedule(void (function)(void), void* arg)

這個函數會将function和arg包裝成為一個BGItem,放到一個隊列中,在這之前啟動(如果已經存在,就不啟動)一個背景程序,是任務的消費者,死循環的來消費此隊列中的任務。

當使用pthread_create來建立一個線程,并使用對象方法來作為入口函數時,沒有辦法傳遞this指針,是以應該定義一個static function,接收this指針,然後執行對應的成員方法

class PosixEnv {
    //...
    static void* BGThreadWrapper(void* arg) {                                                                                                            
        reinterpret_cast<PosixEnv*>(arg)->BGThread();
        return NULL;
    }
    void BGThread() {
        while(true) {
        } 
    }
}

pthread_create(&bgthread_, NULL, &PosixEnv::BGThreadWrapper, this));