X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FFile.cpp;h=9fb755a8468e37a2c212f18f8369ef3faa211803;hp=3c961aaae45f6dd1c2c6100a4256a6d334f5cf68;hb=d017a3ffa0acf3389a1ee585a035c01cd9e51d07;hpb=257ff9ff793e7f8f69731c91630540088c43c349 diff --git a/folly/File.cpp b/folly/File.cpp index 3c961aaa..9fb755a8 100644 --- a/folly/File.cpp +++ b/folly/File.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2013 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,15 +14,16 @@ * limitations under the License. */ -#include "folly/File.h" +#include -#include -#include -#include "folly/Exception.h" -#include "folly/FileUtil.h" -#include "folly/Format.h" -#include "folly/ScopeGuard.h" +#include +#include +#include +#include +#include +#include +#include #include @@ -30,15 +31,12 @@ namespace folly { -File::File() - : fd_(-1) - , ownsFd_(false) -{} +File::File() noexcept : fd_(-1), ownsFd_(false) {} -File::File(int fd, bool ownsFd) - : fd_(fd) - , ownsFd_(ownsFd) -{} +File::File(int fd, bool ownsFd) noexcept : fd_(fd), ownsFd_(ownsFd) { + CHECK_GE(fd, -1) << "fd must be -1 or non-negative"; + CHECK(fd != -1 || !ownsFd) << "cannot own -1"; +} File::File(const char* name, int flags, mode_t mode) : fd_(::open(name, flags, mode)) @@ -50,10 +48,15 @@ File::File(const char* name, int flags, mode_t mode) ownsFd_ = true; } -File::File(File&& other) +File::File(const std::string& name, int flags, mode_t mode) + : File(name.c_str(), flags, mode) {} + +File::File(StringPiece name, int flags, mode_t mode) + : File(name.str(), flags, mode) {} + +File::File(File&& other) noexcept : fd_(other.fd_) , ownsFd_(other.ownsFd_) { - other.release(); } @@ -64,7 +67,11 @@ File& File::operator=(File&& other) { } File::~File() { - closeNoThrow(); // ignore error + auto fd = fd_; + if (!closeNoThrow()) { // ignore most errors + DCHECK_NE(errno, EBADF) << "closing fd " << fd << ", it may already " + << "have been closed. Another time, this might close the wrong FD."; + } } /* static */ File File::temporary() { @@ -73,15 +80,17 @@ File::~File() { checkFopenError(tmpFile, "tmpfile() failed"); SCOPE_EXIT { fclose(tmpFile); }; - int fd = dup(fileno(tmpFile)); + int fd = ::dup(fileno(tmpFile)); checkUnixError(fd, "dup() failed"); return File(fd, true); } -void File::release() { +int File::release() noexcept { + int released = fd_; fd_ = -1; ownsFd_ = false; + return released; } void File::swap(File& other) { @@ -94,6 +103,17 @@ void swap(File& a, File& b) { a.swap(b); } +File File::dup() const { + if (fd_ != -1) { + int fd = ::dup(fd_); + checkUnixError(fd, "dup() failed"); + + return File(fd, true); + } + + return File(); +} + void File::close() { if (!closeNoThrow()) { throwSystemError("close() failed"); @@ -118,7 +138,9 @@ void File::doLock(int op) { bool File::doTryLock(int op) { int r = flockNoInt(fd_, op | LOCK_NB); // flock returns EWOULDBLOCK if already locked - if (r == -1 && errno == EWOULDBLOCK) return false; + if (r == -1 && errno == EWOULDBLOCK) { + return false; + } checkUnixError(r, "flock() failed (try_lock)"); return true; } @@ -128,4 +150,4 @@ void File::unlock() { } void File::unlock_shared() { unlock(); } -} // namespace folly +} // namespace folly