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來提供readrandom讀文件
兩種,第一種使用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));