Merge branch 'dev' of github.com:facebook/zstd into dev

dev
Yann Collet 2016-09-07 14:54:54 +02:00
commit 5c6d244973
8 changed files with 57 additions and 21 deletions

View File

@ -45,7 +45,13 @@ build_script:
ECHO make %CLANG_PARAMS% && ECHO make %CLANG_PARAMS% &&
make %CLANG_PARAMS% && make %CLANG_PARAMS% &&
COPY tests\fuzzer.exe tests\fuzzer_clang.exe && COPY tests\fuzzer.exe tests\fuzzer_clang.exe &&
make clean make clean &&
ECHO *** &&
ECHO *** Building pzstd for %PLATFORM% &&
ECHO *** &&
ECHO make -C contrib\pzstd pzstd &&
make -C contrib\pzstd pzstd &&
make -C contrib\pzstd clean
) )
- if [%COMPILER%]==[gcc] ( - if [%COMPILER%]==[gcc] (
ECHO *** && ECHO *** &&

View File

@ -10,6 +10,7 @@
#include <cstdio> #include <cstdio>
#include <cstring> #include <cstring>
#include <thread>
namespace pzstd { namespace pzstd {
@ -103,6 +104,7 @@ bool Options::parse(int argc, const char** argv) {
numThreads = parseUnsigned(argv[i]); numThreads = parseUnsigned(argv[i]);
if (numThreads == 0) { if (numThreads == 0) {
std::fprintf(stderr, "Invalid argument: # of threads must be > 0.\n"); std::fprintf(stderr, "Invalid argument: # of threads must be > 0.\n");
return false;
} }
break; break;
case 'p': case 'p':
@ -169,13 +171,18 @@ bool Options::parse(int argc, const char** argv) {
if (compressionLevel > maxCLevel) { if (compressionLevel > maxCLevel) {
std::fprintf( std::fprintf(
stderr, "Invalid compression level %u.\n", compressionLevel); stderr, "Invalid compression level %u.\n", compressionLevel);
return false;
} }
} }
// Check that numThreads is set // Check that numThreads is set
if (numThreads == 0) { if (numThreads == 0) {
std::fprintf(stderr, "Invalid arguments: # of threads not specified.\n"); numThreads = std::thread::hardware_concurrency();
if (numThreads == 0) {
std::fprintf(stderr, "Invalid arguments: # of threads not specified "
"and unable to determine hardware concurrency.\n");
return false; return false;
} }
}
return true; return true;
} }
} }

View File

@ -34,7 +34,7 @@ using std::size_t;
size_t pzstdMain(const Options& options, ErrorHolder& errorHolder) { size_t pzstdMain(const Options& options, ErrorHolder& errorHolder) {
// Open the input file and attempt to determine its size // Open the input file and attempt to determine its size
FILE* inputFd = stdin; FILE* inputFd = stdin;
size_t inputSize = 0; std::uintmax_t inputSize = 0;
if (options.inputFile != "-") { if (options.inputFile != "-") {
inputFd = std::fopen(options.inputFile.c_str(), "rb"); inputFd = std::fopen(options.inputFile.c_str(), "rb");
if (!errorHolder.check(inputFd != nullptr, "Failed to open input file")) { if (!errorHolder.check(inputFd != nullptr, "Failed to open input file")) {
@ -155,7 +155,7 @@ static void compress(
ZSTD_parameters parameters) { ZSTD_parameters parameters) {
auto guard = makeScopeGuard([&] { out->finish(); }); auto guard = makeScopeGuard([&] { out->finish(); });
// Initialize the CCtx // Initialize the CCtx
std::unique_ptr<ZSTD_CStream, size_t (&)(ZSTD_CStream*)> ctx( std::unique_ptr<ZSTD_CStream, size_t (*)(ZSTD_CStream*)> ctx(
ZSTD_createCStream(), ZSTD_freeCStream); ZSTD_createCStream(), ZSTD_freeCStream);
if (!errorHolder.check(ctx != nullptr, "Failed to allocate ZSTD_CStream")) { if (!errorHolder.check(ctx != nullptr, "Failed to allocate ZSTD_CStream")) {
return; return;
@ -217,14 +217,17 @@ static void compress(
* @param numThreads The number of threads available to run compression jobs on * @param numThreads The number of threads available to run compression jobs on
* @param params The zstd parameters to be used for compression * @param params The zstd parameters to be used for compression
*/ */
static size_t static size_t calculateStep(
calculateStep(size_t size, size_t numThreads, const ZSTD_parameters& params) { std::uintmax_t size,
size_t step = 1ul << (params.cParams.windowLog + 2); size_t numThreads,
const ZSTD_parameters &params) {
size_t step = size_t{1} << (params.cParams.windowLog + 2);
// If file size is known, see if a smaller step will spread work more evenly // If file size is known, see if a smaller step will spread work more evenly
if (size != 0) { if (size != 0) {
size_t newStep = size / numThreads; const std::uintmax_t newStep = size / std::uintmax_t{numThreads};
if (newStep != 0) { if (newStep != 0 &&
step = std::min(step, newStep); newStep <= std::uintmax_t{std::numeric_limits<size_t>::max()}) {
step = std::min(step, size_t{newStep});
} }
} }
return step; return step;
@ -268,7 +271,7 @@ void asyncCompressChunks(
WorkQueue<std::shared_ptr<BufferWorkQueue>>& chunks, WorkQueue<std::shared_ptr<BufferWorkQueue>>& chunks,
ThreadPool& executor, ThreadPool& executor,
FILE* fd, FILE* fd,
size_t size, std::uintmax_t size,
size_t numThreads, size_t numThreads,
ZSTD_parameters params) { ZSTD_parameters params) {
auto chunksGuard = makeScopeGuard([&] { chunks.finish(); }); auto chunksGuard = makeScopeGuard([&] { chunks.finish(); });
@ -311,7 +314,7 @@ static void decompress(
std::shared_ptr<BufferWorkQueue> out) { std::shared_ptr<BufferWorkQueue> out) {
auto guard = makeScopeGuard([&] { out->finish(); }); auto guard = makeScopeGuard([&] { out->finish(); });
// Initialize the DCtx // Initialize the DCtx
std::unique_ptr<ZSTD_DStream, size_t (&)(ZSTD_DStream*)> ctx( std::unique_ptr<ZSTD_DStream, size_t (*)(ZSTD_DStream*)> ctx(
ZSTD_createDStream(), ZSTD_freeDStream); ZSTD_createDStream(), ZSTD_freeDStream);
if (!errorHolder.check(ctx != nullptr, "Failed to allocate ZSTD_DStream")) { if (!errorHolder.check(ctx != nullptr, "Failed to allocate ZSTD_DStream")) {
return; return;

View File

@ -19,6 +19,7 @@
#undef ZSTD_STATIC_LINKING_ONLY #undef ZSTD_STATIC_LINKING_ONLY
#include <cstddef> #include <cstddef>
#include <cstdint>
#include <memory> #include <memory>
namespace pzstd { namespace pzstd {
@ -52,7 +53,7 @@ void asyncCompressChunks(
WorkQueue<std::shared_ptr<BufferWorkQueue>>& chunks, WorkQueue<std::shared_ptr<BufferWorkQueue>>& chunks,
ThreadPool& executor, ThreadPool& executor,
FILE* fd, FILE* fd,
std::size_t size, std::uintmax_t size,
std::size_t numThreads, std::size_t numThreads,
ZSTD_parameters parameters); ZSTD_parameters parameters);

View File

@ -118,11 +118,11 @@ TEST(Options, ValidInputs) {
} }
} }
TEST(Options, BadNumThreads) { TEST(Options, NumThreads) {
{ {
Options options; Options options;
std::array<const char*, 3> args = {{nullptr, "-o", "-"}}; std::array<const char*, 3> args = {{nullptr, "-o", "-"}};
EXPECT_FALSE(options.parse(args.size(), args.data())); EXPECT_TRUE(options.parse(args.size(), args.data()));
} }
{ {
Options options; Options options;

View File

@ -11,6 +11,7 @@
#include "utils/Range.h" #include "utils/Range.h"
#include <sys/stat.h> #include <sys/stat.h>
#include <cerrno>
#include <cstdint> #include <cstdint>
#include <system_error> #include <system_error>
@ -20,12 +21,21 @@
namespace pzstd { namespace pzstd {
using file_status = struct stat; #if defined(_MSC_VER)
using file_status = struct ::_stat64;
#else
using file_status = struct ::stat;
#endif
/// http://en.cppreference.com/w/cpp/filesystem/status /// http://en.cppreference.com/w/cpp/filesystem/status
inline file_status status(StringPiece path, std::error_code& ec) noexcept { inline file_status status(StringPiece path, std::error_code& ec) noexcept {
file_status status; file_status status;
if (stat(path.data(), &status)) { #if defined(_MSC_VER)
const auto error = ::_stat64(path.data(), &status);
#else
const auto error = ::stat(path.data(), &status);
#endif
if (error) {
ec.assign(errno, std::generic_category()); ec.assign(errno, std::generic_category());
} else { } else {
ec.clear(); ec.clear();
@ -35,7 +45,13 @@ inline file_status status(StringPiece path, std::error_code& ec) noexcept {
/// http://en.cppreference.com/w/cpp/filesystem/is_regular_file /// http://en.cppreference.com/w/cpp/filesystem/is_regular_file
inline bool is_regular_file(file_status status) noexcept { inline bool is_regular_file(file_status status) noexcept {
#if defined(S_ISREG)
return S_ISREG(status.st_mode); return S_ISREG(status.st_mode);
#elif !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG)
return (status.st_mode & S_IFMT) == S_IFREG;
#else
static_assert(false, "No POSIX stat() support.");
#endif
} }
/// http://en.cppreference.com/w/cpp/filesystem/is_regular_file /// http://en.cppreference.com/w/cpp/filesystem/is_regular_file

View File

@ -299,8 +299,8 @@ ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* outp
#define ZSTD_HASHLOG3_MAX 17 #define ZSTD_HASHLOG3_MAX 17
#define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1) #define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1)
#define ZSTD_SEARCHLOG_MIN 1 #define ZSTD_SEARCHLOG_MIN 1
#define ZSTD_SEARCHLENGTH_MAX 7 #define ZSTD_SEARCHLENGTH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */
#define ZSTD_SEARCHLENGTH_MIN 3 #define ZSTD_SEARCHLENGTH_MIN 3 /* only for ZSTD_btopt, other strategies are limited to 4 */
#define ZSTD_TARGETLENGTH_MIN 4 #define ZSTD_TARGETLENGTH_MIN 4
#define ZSTD_TARGETLENGTH_MAX 999 #define ZSTD_TARGETLENGTH_MAX 999

View File

@ -732,7 +732,10 @@ static int FIO_decompressDstFile(dRess_t ress,
result = FIO_decompressSrcFile(ress, srcFileName); result = FIO_decompressSrcFile(ress, srcFileName);
if (fclose(ress.dstFile)) EXM_THROW(38, "Write error : cannot properly close %s", dstFileName); if (fclose(ress.dstFile)) EXM_THROW(38, "Write error : cannot properly close %s", dstFileName);
if (result != 0) if (remove(dstFileName)) result=1; /* don't do anything if remove fails */ if ( (result != 0)
&& strcmp(dstFileName, nulmark) /* special case : don't remove() /dev/null (#316) */
&& remove(dstFileName) )
result=1; /* don't do anything special if remove fails */
return result; return result;
} }