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));