Make file backed strings dup the provided file descriptor.
Reviewed By: mhorowitz Differential Revision: D4326645 fbshipit-source-id: 2741f1fead4f42ae76787f8a70c1e787445b827d
This commit is contained in:
parent
349bbb54f7
commit
fa082796a5
|
@ -9,6 +9,7 @@
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include <folly/Memory.h>
|
#include <folly/Memory.h>
|
||||||
|
#include <folly/ScopeGuard.h>
|
||||||
|
|
||||||
namespace facebook {
|
namespace facebook {
|
||||||
namespace react {
|
namespace react {
|
||||||
|
@ -51,7 +52,7 @@ std::unique_ptr<const JSBigOptimizedBundleString> JSBigOptimizedBundleString::fr
|
||||||
uint8_t encoding;
|
uint8_t encoding;
|
||||||
struct stat fileInfo;
|
struct stat fileInfo;
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
SCOPE_FAIL { CHECK(fd == -1 || ::close(fd) == 0); };
|
SCOPE_EXIT { CHECK(fd == -1 || ::close(fd) == 0); };
|
||||||
|
|
||||||
{
|
{
|
||||||
auto metaPath = bundlePath + UNPACKED_META_PATH_SUFFIX;
|
auto metaPath = bundlePath + UNPACKED_META_PATH_SUFFIX;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -9,6 +10,7 @@
|
||||||
|
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
#include <folly/Exception.h>
|
||||||
#include <folly/dynamic.h>
|
#include <folly/dynamic.h>
|
||||||
|
|
||||||
#include "JSModulesUnbundle.h"
|
#include "JSModulesUnbundle.h"
|
||||||
|
@ -152,9 +154,13 @@ class JSBigFileString : public JSBigString {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
JSBigFileString(int fd, size_t size, off_t offset = 0)
|
JSBigFileString(int fd, size_t size, off_t offset = 0)
|
||||||
: m_fd {fd}
|
: m_fd {-1}
|
||||||
, m_data {nullptr}
|
, m_data {nullptr}
|
||||||
{
|
{
|
||||||
|
folly::checkUnixError(
|
||||||
|
m_fd = dup(fd),
|
||||||
|
"Could not duplicate file descriptor");
|
||||||
|
|
||||||
// Offsets given to mmap must be page aligend. We abstract away that
|
// Offsets given to mmap must be page aligend. We abstract away that
|
||||||
// restriction by sending a page aligned offset to mmap, and keeping track
|
// restriction by sending a page aligned offset to mmap, and keeping track
|
||||||
// of the offset within the page that we must alter the mmap pointer by to
|
// of the offset within the page that we must alter the mmap pointer by to
|
||||||
|
@ -216,11 +222,15 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
JSBigOptimizedBundleString(int fd, size_t size, const uint8_t sha1[20], Encoding encoding) :
|
JSBigOptimizedBundleString(int fd, size_t size, const uint8_t sha1[20], Encoding encoding) :
|
||||||
m_fd(fd),
|
m_fd(-1),
|
||||||
m_size(size),
|
m_size(size),
|
||||||
m_encoding(encoding),
|
m_encoding(encoding),
|
||||||
m_str(nullptr)
|
m_str(nullptr)
|
||||||
{
|
{
|
||||||
|
folly::checkUnixError(
|
||||||
|
m_fd = dup(fd),
|
||||||
|
"Could not duplicate file descriptor");
|
||||||
|
|
||||||
memcpy(m_hash, sha1, 20);
|
memcpy(m_hash, sha1, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,6 @@ TEST(JSBigFileString, MapWholeFileTest) {
|
||||||
JSBigFileString bigStr {fd, size};
|
JSBigFileString bigStr {fd, size};
|
||||||
|
|
||||||
// Test
|
// Test
|
||||||
ASSERT_EQ(fd, bigStr.fd());
|
|
||||||
ASSERT_STREQ(data.c_str(), bigStr.c_str());
|
ASSERT_STREQ(data.c_str(), bigStr.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +52,6 @@ TEST(JSBigFileString, MapPartTest) {
|
||||||
JSBigFileString bigStr {fd, needle.size(), offset};
|
JSBigFileString bigStr {fd, needle.size(), offset};
|
||||||
|
|
||||||
// Test
|
// Test
|
||||||
ASSERT_EQ(fd, bigStr.fd());
|
|
||||||
ASSERT_EQ(needle.length(), bigStr.size());
|
ASSERT_EQ(needle.length(), bigStr.size());
|
||||||
for (unsigned int i = 0; i < needle.length(); ++i) {
|
for (unsigned int i = 0; i < needle.length(); ++i) {
|
||||||
ASSERT_EQ(needle[i], bigStr.c_str()[i]);
|
ASSERT_EQ(needle[i], bigStr.c_str()[i]);
|
||||||
|
|
Loading…
Reference in New Issue