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));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章