leveldb
Classes | Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
leveldb::anonymous_namespace{env_posix.cc}::PosixEnv Class Reference
Inheritance diagram for leveldb::anonymous_namespace{env_posix.cc}::PosixEnv:
Inheritance graph
[legend]
Collaboration diagram for leveldb::anonymous_namespace{env_posix.cc}::PosixEnv:
Collaboration graph
[legend]

Classes

struct  BGItem
 

Public Member Functions

 PosixEnv ()
 
virtual ~PosixEnv ()
 
virtual Status NewSequentialFile (const std::string &fname, SequentialFile **result)
 
virtual Status NewRandomAccessFile (const std::string &fname, RandomAccessFile **result)
 
virtual Status NewWritableFile (const std::string &fname, WritableFile **result)
 
virtual Status NewAppendableFile (const std::string &fname, WritableFile **result)
 
virtual bool FileExists (const std::string &fname)
 
virtual Status GetChildren (const std::string &dir, std::vector< std::string > *result)
 
virtual Status DeleteFile (const std::string &fname)
 
virtual Status CreateDir (const std::string &name)
 
virtual Status DeleteDir (const std::string &name)
 
virtual Status GetFileSize (const std::string &fname, uint64_t *size)
 
virtual Status RenameFile (const std::string &src, const std::string &target)
 
virtual Status LockFile (const std::string &fname, FileLock **lock)
 
virtual Status UnlockFile (FileLock *lock)
 
virtual void Schedule (void(*function)(void *), void *arg)
 
virtual void StartThread (void(*function)(void *arg), void *arg)
 
virtual Status GetTestDirectory (std::string *result)
 
virtual Status NewLogger (const std::string &fname, Logger **result)
 
virtual uint64_t NowMicros ()
 
virtual void SleepForMicroseconds (int micros)
 
- Public Member Functions inherited from leveldb::Env
 Env ()
 
virtual ~Env ()
 
virtual void Schedule (void(*function)(void *arg), void *arg)=0
 

Static Public Member Functions

static uint64_t gettid ()
 
- Static Public Member Functions inherited from leveldb::Env
static EnvDefault ()
 

Private Types

typedef std::deque< BGItemBGQueue
 

Private Member Functions

void PthreadCall (const char *label, int result)
 
void BGThread ()
 

Static Private Member Functions

static void * BGThreadWrapper (void *arg)
 

Private Attributes

pthread_mutex_t mu_
 
pthread_cond_t bgsignal_
 
pthread_t bgthread_
 
bool started_bgthread_
 
BGQueue queue_
 
PosixLockTable locks_
 
MmapLimiter mmap_limit_
 

Detailed Description

Definition at line 291 of file env_posix.cc.

Member Typedef Documentation

§ BGQueue

typedef std::deque<BGItem> leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::BGQueue
private

Definition at line 531 of file env_posix.cc.

Constructor & Destructor Documentation

§ PosixEnv()

leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::PosixEnv ( )

Definition at line 538 of file env_posix.cc.

538  : started_bgthread_(false) {
539  PthreadCall("mutex_init", pthread_mutex_init(&mu_, NULL));
540  PthreadCall("cvar_init", pthread_cond_init(&bgsignal_, NULL));
541 }
void PthreadCall(const char *label, int result)
Definition: env_posix.cc:510
Here is the call graph for this function:
Here is the caller graph for this function:

§ ~PosixEnv()

virtual leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::~PosixEnv ( )
inlinevirtual

Definition at line 294 of file env_posix.cc.

294  {
295  char msg[] = "Destroying Env::Default()\n";
296  fwrite(msg, 1, sizeof(msg), stderr);
297  abort();
298  }

Member Function Documentation

§ BGThread()

void leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::BGThread ( )
private

Definition at line 568 of file env_posix.cc.

568  {
569  while (true) {
570  // Wait until there is an item that is ready to run
571  PthreadCall("lock", pthread_mutex_lock(&mu_));
572  while (queue_.empty()) {
573  PthreadCall("wait", pthread_cond_wait(&bgsignal_, &mu_));
574  }
575 
576  void (*function)(void*) = queue_.front().function;
577  void* arg = queue_.front().arg;
578  queue_.pop_front();
579 
580  PthreadCall("unlock", pthread_mutex_unlock(&mu_));
581  (*function)(arg);
582  }
583 }
void PthreadCall(const char *label, int result)
Definition: env_posix.cc:510
Here is the call graph for this function:

§ BGThreadWrapper()

static void* leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::BGThreadWrapper ( void *  arg)
inlinestaticprivate

Definition at line 519 of file env_posix.cc.

519  {
520  reinterpret_cast<PosixEnv*>(arg)->BGThread();
521  return NULL;
522  }
Here is the caller graph for this function:

§ CreateDir()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::CreateDir ( const std::string &  name)
inlinevirtual

Implements leveldb::Env.

Definition at line 393 of file env_posix.cc.

393  {
394  Status result;
395  if (mkdir(name.c_str(), 0755) != 0) {
396  result = IOError(name, errno);
397  }
398  return result;
399  }
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
Here is the call graph for this function:

§ DeleteDir()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::DeleteDir ( const std::string &  name)
inlinevirtual

Implements leveldb::Env.

Definition at line 401 of file env_posix.cc.

401  {
402  Status result;
403  if (rmdir(name.c_str()) != 0) {
404  result = IOError(name, errno);
405  }
406  return result;
407  }
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
Here is the call graph for this function:

§ DeleteFile()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::DeleteFile ( const std::string &  fname)
inlinevirtual

Implements leveldb::Env.

Definition at line 385 of file env_posix.cc.

385  {
386  Status result;
387  if (unlink(fname.c_str()) != 0) {
388  result = IOError(fname, errno);
389  }
390  return result;
391  }
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
Here is the call graph for this function:

§ FileExists()

virtual bool leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::FileExists ( const std::string &  fname)
inlinevirtual

Implements leveldb::Env.

Definition at line 366 of file env_posix.cc.

366  {
367  return access(fname.c_str(), F_OK) == 0;
368  }

§ GetChildren()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::GetChildren ( const std::string &  dir,
std::vector< std::string > *  result 
)
inlinevirtual

Implements leveldb::Env.

Definition at line 370 of file env_posix.cc.

371  {
372  result->clear();
373  DIR* d = opendir(dir.c_str());
374  if (d == NULL) {
375  return IOError(dir, errno);
376  }
377  struct dirent* entry;
378  while ((entry = readdir(d)) != NULL) {
379  result->push_back(entry->d_name);
380  }
381  closedir(d);
382  return Status::OK();
383  }
static Status OK()
Definition: status.h:32
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
Here is the call graph for this function:

§ GetFileSize()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::GetFileSize ( const std::string &  fname,
uint64_t *  size 
)
inlinevirtual

Implements leveldb::Env.

Definition at line 409 of file env_posix.cc.

409  {
410  Status s;
411  struct stat sbuf;
412  if (stat(fname.c_str(), &sbuf) != 0) {
413  *size = 0;
414  s = IOError(fname, errno);
415  } else {
416  *size = sbuf.st_size;
417  }
418  return s;
419  }
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
Here is the call graph for this function:

§ GetTestDirectory()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::GetTestDirectory ( std::string *  result)
inlinevirtual

Implements leveldb::Env.

Definition at line 467 of file env_posix.cc.

467  {
468  const char* env = getenv("TEST_TMPDIR");
469  if (env && env[0] != '\0') {
470  *result = env;
471  } else {
472  char buf[100];
473  snprintf(buf, sizeof(buf), "/tmp/leveldbtest-%d", int(geteuid()));
474  *result = buf;
475  }
476  // Directory may already exist
477  CreateDir(*result);
478  return Status::OK();
479  }
static Status OK()
Definition: status.h:32
virtual Status CreateDir(const std::string &name)
Definition: env_posix.cc:393
Here is the call graph for this function:

§ gettid()

static uint64_t leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::gettid ( )
inlinestatic

Definition at line 481 of file env_posix.cc.

481  {
482  pthread_t tid = pthread_self();
483  uint64_t thread_id = 0;
484  memcpy(&thread_id, &tid, std::min(sizeof(thread_id), sizeof(tid)));
485  return thread_id;
486  }

§ LockFile()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::LockFile ( const std::string &  fname,
FileLock **  lock 
)
inlinevirtual

Implements leveldb::Env.

Definition at line 429 of file env_posix.cc.

429  {
430  *lock = NULL;
431  Status result;
432  int fd = open(fname.c_str(), O_RDWR | O_CREAT, 0644);
433  if (fd < 0) {
434  result = IOError(fname, errno);
435  } else if (!locks_.Insert(fname)) {
436  close(fd);
437  result = Status::IOError("lock " + fname, "already held by process");
438  } else if (LockOrUnlock(fd, true) == -1) {
439  result = IOError("lock " + fname, errno);
440  close(fd);
441  locks_.Remove(fname);
442  } else {
443  PosixFileLock* my_lock = new PosixFileLock;
444  my_lock->fd_ = fd;
445  my_lock->name_ = fname;
446  *lock = my_lock;
447  }
448  return result;
449  }
static int LockOrUnlock(int fd, bool lock)
Definition: env_posix.cc:256
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
static Status IOError(const Slice &msg, const Slice &msg2=Slice())
Definition: status.h:47
Here is the call graph for this function:

§ NewAppendableFile()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::NewAppendableFile ( const std::string &  fname,
WritableFile **  result 
)
inlinevirtual

Reimplemented from leveldb::Env.

Definition at line 353 of file env_posix.cc.

354  {
355  Status s;
356  FILE* f = fopen(fname.c_str(), "a");
357  if (f == NULL) {
358  *result = NULL;
359  s = IOError(fname, errno);
360  } else {
361  *result = new PosixWritableFile(fname, f);
362  }
363  return s;
364  }
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
Here is the call graph for this function:

§ NewLogger()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::NewLogger ( const std::string &  fname,
Logger **  result 
)
inlinevirtual

Implements leveldb::Env.

Definition at line 488 of file env_posix.cc.

488  {
489  FILE* f = fopen(fname.c_str(), "w");
490  if (f == NULL) {
491  *result = NULL;
492  return IOError(fname, errno);
493  } else {
494  *result = new PosixLogger(f, &PosixEnv::gettid);
495  return Status::OK();
496  }
497  }
static Status OK()
Definition: status.h:32
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
Here is the call graph for this function:

§ NewRandomAccessFile()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::NewRandomAccessFile ( const std::string &  fname,
RandomAccessFile **  result 
)
inlinevirtual

Implements leveldb::Env.

Definition at line 312 of file env_posix.cc.

313  {
314  *result = NULL;
315  Status s;
316  int fd = open(fname.c_str(), O_RDONLY);
317  if (fd < 0) {
318  s = IOError(fname, errno);
319  } else if (mmap_limit_.Acquire()) {
320  uint64_t size;
321  s = GetFileSize(fname, &size);
322  if (s.ok()) {
323  void* base = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
324  if (base != MAP_FAILED) {
325  *result = new PosixMmapReadableFile(fname, base, size, &mmap_limit_);
326  } else {
327  s = IOError(fname, errno);
328  }
329  }
330  close(fd);
331  if (!s.ok()) {
333  }
334  } else {
335  *result = new PosixRandomAccessFile(fname, fd);
336  }
337  return s;
338  }
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
virtual Status GetFileSize(const std::string &fname, uint64_t *size)
Definition: env_posix.cc:409
Here is the call graph for this function:

§ NewSequentialFile()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::NewSequentialFile ( const std::string &  fname,
SequentialFile **  result 
)
inlinevirtual

Implements leveldb::Env.

Definition at line 300 of file env_posix.cc.

301  {
302  FILE* f = fopen(fname.c_str(), "r");
303  if (f == NULL) {
304  *result = NULL;
305  return IOError(fname, errno);
306  } else {
307  *result = new PosixSequentialFile(fname, f);
308  return Status::OK();
309  }
310  }
static Status OK()
Definition: status.h:32
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
Here is the call graph for this function:

§ NewWritableFile()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::NewWritableFile ( const std::string &  fname,
WritableFile **  result 
)
inlinevirtual

Implements leveldb::Env.

Definition at line 340 of file env_posix.cc.

341  {
342  Status s;
343  FILE* f = fopen(fname.c_str(), "w");
344  if (f == NULL) {
345  *result = NULL;
346  s = IOError(fname, errno);
347  } else {
348  *result = new PosixWritableFile(fname, f);
349  }
350  return s;
351  }
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
Here is the call graph for this function:

§ NowMicros()

virtual uint64_t leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::NowMicros ( )
inlinevirtual

Implements leveldb::Env.

Definition at line 499 of file env_posix.cc.

499  {
500  struct timeval tv;
501  gettimeofday(&tv, NULL);
502  return static_cast<uint64_t>(tv.tv_sec) * 1000000 + tv.tv_usec;
503  }

§ PthreadCall()

void leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::PthreadCall ( const char *  label,
int  result 
)
inlineprivate

Definition at line 510 of file env_posix.cc.

510  {
511  if (result != 0) {
512  fprintf(stderr, "pthread %s: %s\n", label, strerror(result));
513  abort();
514  }
515  }
Here is the caller graph for this function:

§ RenameFile()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::RenameFile ( const std::string &  src,
const std::string &  target 
)
inlinevirtual

Implements leveldb::Env.

Definition at line 421 of file env_posix.cc.

421  {
422  Status result;
423  if (rename(src.c_str(), target.c_str()) != 0) {
424  result = IOError(src, errno);
425  }
426  return result;
427  }
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
Here is the call graph for this function:

§ Schedule()

void leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::Schedule ( void(*)(void *)  function,
void *  arg 
)
virtual

Definition at line 543 of file env_posix.cc.

543  {
544  PthreadCall("lock", pthread_mutex_lock(&mu_));
545 
546  // Start background thread if necessary
547  if (!started_bgthread_) {
548  started_bgthread_ = true;
549  PthreadCall(
550  "create thread",
551  pthread_create(&bgthread_, NULL, &PosixEnv::BGThreadWrapper, this));
552  }
553 
554  // If the queue is currently empty, the background thread may currently be
555  // waiting.
556  if (queue_.empty()) {
557  PthreadCall("signal", pthread_cond_signal(&bgsignal_));
558  }
559 
560  // Add to priority queue
561  queue_.push_back(BGItem());
562  queue_.back().function = function;
563  queue_.back().arg = arg;
564 
565  PthreadCall("unlock", pthread_mutex_unlock(&mu_));
566 }
void PthreadCall(const char *label, int result)
Definition: env_posix.cc:510
Here is the call graph for this function:

§ SleepForMicroseconds()

virtual void leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::SleepForMicroseconds ( int  micros)
inlinevirtual

Implements leveldb::Env.

Definition at line 505 of file env_posix.cc.

505  {
506  usleep(micros);
507  }

§ StartThread()

void leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::StartThread ( void(*)(void *arg)  function,
void *  arg 
)
virtual

Implements leveldb::Env.

Definition at line 598 of file env_posix.cc.

598  {
599  pthread_t t;
600  StartThreadState* state = new StartThreadState;
601  state->user_function = function;
602  state->arg = arg;
603  PthreadCall("start thread",
604  pthread_create(&t, NULL, &StartThreadWrapper, state));
605 }
void PthreadCall(const char *label, int result)
Definition: env_posix.cc:510
static void * StartThreadWrapper(void *arg)
Definition: env_posix.cc:591
Here is the call graph for this function:

§ UnlockFile()

virtual Status leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::UnlockFile ( FileLock lock)
inlinevirtual

Implements leveldb::Env.

Definition at line 451 of file env_posix.cc.

451  {
452  PosixFileLock* my_lock = reinterpret_cast<PosixFileLock*>(lock);
453  Status result;
454  if (LockOrUnlock(my_lock->fd_, false) == -1) {
455  result = IOError("unlock", errno);
456  }
457  locks_.Remove(my_lock->name_);
458  close(my_lock->fd_);
459  delete my_lock;
460  return result;
461  }
static int LockOrUnlock(int fd, bool lock)
Definition: env_posix.cc:256
static Status IOError(const std::string &context, int err_number)
Definition: env_posix.cc:31
Here is the call graph for this function:

Member Data Documentation

§ bgsignal_

pthread_cond_t leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::bgsignal_
private

Definition at line 525 of file env_posix.cc.

§ bgthread_

pthread_t leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::bgthread_
private

Definition at line 526 of file env_posix.cc.

§ locks_

PosixLockTable leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::locks_
private

Definition at line 534 of file env_posix.cc.

§ mmap_limit_

MmapLimiter leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::mmap_limit_
private

Definition at line 535 of file env_posix.cc.

§ mu_

pthread_mutex_t leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::mu_
private

Definition at line 524 of file env_posix.cc.

§ queue_

BGQueue leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::queue_
private

Definition at line 532 of file env_posix.cc.

§ started_bgthread_

bool leveldb::anonymous_namespace{env_posix.cc}::PosixEnv::started_bgthread_
private

Definition at line 527 of file env_posix.cc.


The documentation for this class was generated from the following file: