Compare commits
10 Commits
fcf1982acc
...
77c78fad94
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
77c78fad94 | ||
|
|
6af9287fbd | ||
|
|
de19405e58 | ||
|
|
4dd78f2deb | ||
|
|
b395cf7a4f | ||
|
|
fa07e8a945 | ||
|
|
49087d4e14 | ||
|
|
a688be4b77 | ||
|
|
a6b9f87f82 | ||
|
|
32ded457c0 |
@@ -30,7 +30,7 @@ package(default_visibility = ["//visibility:public"])
|
||||
|
||||
licenses(["notice"])
|
||||
|
||||
SNAPPY_VERSION = (1, 1, 10)
|
||||
SNAPPY_VERSION = (1, 2, 2)
|
||||
|
||||
config_setting(
|
||||
name = "windows",
|
||||
|
||||
@@ -26,8 +26,8 @@
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
cmake_minimum_required(VERSION 3.1)
|
||||
project(Snappy VERSION 1.2.1 LANGUAGES C CXX)
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
project(Snappy VERSION 1.2.2 LANGUAGES C CXX)
|
||||
|
||||
# C++ standard can be overridden when this is used as a sub-project.
|
||||
if(NOT CMAKE_CXX_STANDARD)
|
||||
@@ -38,7 +38,7 @@ if(NOT CMAKE_CXX_STANDARD)
|
||||
endif(NOT CMAKE_CXX_STANDARD)
|
||||
|
||||
# https://github.com/izenecloud/cmake/blob/master/SetCompilerWarningAll.cmake
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||
if(MSVC)
|
||||
# Use the highest warning level for Visual Studio.
|
||||
set(CMAKE_CXX_WARNING_LEVEL 4)
|
||||
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
|
||||
@@ -55,7 +55,7 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||
# Disable RTTI.
|
||||
string(REGEX REPLACE "/GR" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR-")
|
||||
else(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||
else(MSVC)
|
||||
# Use -Wall for clang and gcc.
|
||||
if(NOT CMAKE_CXX_FLAGS MATCHES "-Wall")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
|
||||
@@ -85,7 +85,7 @@ else(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||
# Disable RTTI.
|
||||
string(REGEX REPLACE "-frtti" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
|
||||
endif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||
endif(MSVC)
|
||||
|
||||
# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to make
|
||||
# it prominent in the GUI.
|
||||
@@ -206,10 +206,13 @@ int main() {
|
||||
|
||||
check_cxx_source_compiles("
|
||||
#include <arm_neon.h>
|
||||
#include <stdint.h>
|
||||
int main() {
|
||||
uint8_t val = 3, dup[8];
|
||||
uint8x16_t v = vld1q_dup_u8(&val);
|
||||
vst1q_u8(dup, v);
|
||||
uint8x16_t v1 = vld1q_dup_u8(&val);
|
||||
uint8x16_t v2 = vqtbl1q_u8(v1, v1);
|
||||
vst1q_u8(dup, v1);
|
||||
vst1q_u8(dup, v2);
|
||||
return 0;
|
||||
}" SNAPPY_HAVE_NEON)
|
||||
|
||||
@@ -258,9 +261,7 @@ target_sources(snappy
|
||||
"snappy-stubs-internal.cc"
|
||||
"snappy.cc"
|
||||
"${PROJECT_BINARY_DIR}/config.h"
|
||||
|
||||
# Only CMake 3.3+ supports PUBLIC sources in targets exported by "install".
|
||||
$<$<VERSION_GREATER:CMAKE_VERSION,3.2>:PUBLIC>
|
||||
PUBLIC
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/snappy-c.h>
|
||||
$<INSTALL_INTERFACE:include/snappy-c.h>
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/snappy-sinksource.h>
|
||||
@@ -297,6 +298,9 @@ if(SNAPPY_BUILD_TESTS OR SNAPPY_BUILD_BENCHMARKS)
|
||||
|
||||
# Test files include snappy-test.h, HAVE_CONFIG_H must be defined.
|
||||
target_compile_definitions(snappy_test_support PUBLIC -DHAVE_CONFIG_H)
|
||||
if(BUILD_SHARED_LIBS)
|
||||
set_target_properties(snappy_test_support PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
||||
endif(BUILD_SHARED_LIBS)
|
||||
|
||||
target_link_libraries(snappy_test_support snappy)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
module(
|
||||
name = "snappy",
|
||||
version = "1.2.1",
|
||||
version = "1.2.2",
|
||||
compatibility_level = 1,
|
||||
)
|
||||
|
||||
|
||||
15
NEWS
15
NEWS
@@ -1,3 +1,18 @@
|
||||
Snappy v1.2.2, Mar 26th 2025:
|
||||
|
||||
* We added a new compression level in v1.2.1 which compresses a bit
|
||||
denser but slower. Decompression speed should be even faster with it.
|
||||
|
||||
* We fixed a very old issue of data corruption when compressed size
|
||||
exceeds 4GB. This can happen when you compress data close to 4GB
|
||||
and it's incompressible, for example, random data.
|
||||
|
||||
* Started to use minimum CMake 3.10 because older ones are not
|
||||
planned to be supported.
|
||||
|
||||
* Various other small fixes and performance improvements (especially
|
||||
for clang).
|
||||
|
||||
Snappy v1.1.10, Mar 8th 2023:
|
||||
|
||||
* Performance improvements
|
||||
|
||||
69
config.h
Normal file
69
config.h
Normal file
@@ -0,0 +1,69 @@
|
||||
#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
|
||||
#define THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
|
||||
|
||||
/* Define to 1 if the compiler supports __attribute__((always_inline)). */
|
||||
#define HAVE_ATTRIBUTE_ALWAYS_INLINE 1
|
||||
|
||||
/* Define to 1 if the compiler supports __builtin_ctz and friends. */
|
||||
#define HAVE_BUILTIN_CTZ 1
|
||||
|
||||
/* Define to 1 if the compiler supports __builtin_expect. */
|
||||
#define HAVE_BUILTIN_EXPECT 1
|
||||
|
||||
/* Define to 1 if the compiler supports __builtin_prefetch. */
|
||||
#define HAVE_BUILTIN_PREFETCH 1
|
||||
|
||||
/* Define to 1 if you have a definition for mmap() in <sys/mman.h>. */
|
||||
#define HAVE_FUNC_MMAP 1
|
||||
|
||||
/* Define to 1 if you have a definition for sysconf() in <unistd.h>. */
|
||||
#define HAVE_FUNC_SYSCONF 1
|
||||
|
||||
/* Define to 1 if you have the `lzo2' library (-llzo2). */
|
||||
#define HAVE_LIBLZO2 0
|
||||
|
||||
/* Define to 1 if you have the `z' library (-lz). */
|
||||
#define HAVE_LIBZ 1
|
||||
|
||||
/* Define to 1 if you have the `lz4' library (-llz4). */
|
||||
#define HAVE_LIBLZ4 0
|
||||
|
||||
/* Define to 1 if you have the <sys/mman.h> header file. */
|
||||
#define HAVE_SYS_MMAN_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/resource.h> header file. */
|
||||
#define HAVE_SYS_RESOURCE_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#define HAVE_SYS_TIME_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/uio.h> header file. */
|
||||
#define HAVE_SYS_UIO_H 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to 1 if you have the <windows.h> header file. */
|
||||
#define HAVE_WINDOWS_H 0
|
||||
|
||||
/* Define to 1 if you target processors with SSSE3+ and have <tmmintrin.h>. */
|
||||
#define SNAPPY_HAVE_SSSE3 1
|
||||
|
||||
/* Define to 1 if you target processors with SSE4.2 and have <crc32intrin.h>. */
|
||||
#define SNAPPY_HAVE_X86_CRC32 1
|
||||
|
||||
/* Define to 1 if you target processors with BMI2+ and have <bmi2intrin.h>. */
|
||||
#define SNAPPY_HAVE_BMI2 0
|
||||
|
||||
/* Define to 1 if you target processors with NEON and have <arm_neon.h>. */
|
||||
#define SNAPPY_HAVE_NEON 0
|
||||
|
||||
/* Define to 1 if you have <arm_neon.h> and <arm_acle.h> and want to optimize
|
||||
compression speed by using __crc32cw from <arm_acle.h>. */
|
||||
#define SNAPPY_HAVE_NEON_CRC32 0
|
||||
|
||||
/* Define to 1 if your processor stores words with the most significant byte
|
||||
first (like Motorola and SPARC, unlike Intel and VAX). */
|
||||
#define SNAPPY_IS_BIG_ENDIAN 0
|
||||
|
||||
#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
|
||||
66
snappy-stubs-public.h
Normal file
66
snappy-stubs-public.h
Normal file
@@ -0,0 +1,66 @@
|
||||
// Copyright 2011 Google Inc. All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Various type stubs for the open-source version of Snappy.
|
||||
//
|
||||
// This file cannot include config.h, as it is included from snappy.h,
|
||||
// which is a public header. Instead, snappy-stubs-public.h is generated by
|
||||
// from snappy-stubs-public.h.in at configure time.
|
||||
|
||||
#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_
|
||||
#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
// Original cmake configure baked HAVE_SYS_UIO_H=1 on the Linux host that
|
||||
// pre-generated this header; gate it on _WIN32 so cross-compiles to Windows
|
||||
// fall back to the iovec definition below.
|
||||
#if !defined(_WIN32) // HAVE_SYS_UIO_H
|
||||
#include <sys/uio.h>
|
||||
#endif // HAVE_SYS_UIO_H
|
||||
|
||||
#define SNAPPY_MAJOR 1
|
||||
#define SNAPPY_MINOR 2
|
||||
#define SNAPPY_PATCHLEVEL 2
|
||||
#define SNAPPY_VERSION \
|
||||
((SNAPPY_MAJOR << 16) | (SNAPPY_MINOR << 8) | SNAPPY_PATCHLEVEL)
|
||||
|
||||
namespace snappy {
|
||||
|
||||
#if defined(_WIN32) // !HAVE_SYS_UIO_H
|
||||
// Windows does not have an iovec type, yet the concept is universally useful.
|
||||
// It is simple to define it ourselves, so we put it inside our own namespace.
|
||||
struct iovec {
|
||||
void* iov_base;
|
||||
size_t iov_len;
|
||||
};
|
||||
#endif // !HAVE_SYS_UIO_H
|
||||
|
||||
} // namespace snappy
|
||||
|
||||
#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_
|
||||
10
snappy.cc
10
snappy.cc
@@ -1499,7 +1499,7 @@ class SnappyDecompressor {
|
||||
// If ip < ip_limit_min_maxtaglen_ it's safe to read kMaxTagLength from
|
||||
// buffer.
|
||||
const char* ip_limit_min_maxtaglen_;
|
||||
uint32_t peeked_; // Bytes peeked from reader (need to skip)
|
||||
uint64_t peeked_; // Bytes peeked from reader (need to skip)
|
||||
bool eof_; // Hit end of input without an error?
|
||||
char scratch_[kMaximumTagLength]; // See RefillTag().
|
||||
|
||||
@@ -1690,7 +1690,8 @@ constexpr uint32_t CalculateNeeded(uint8_t tag) {
|
||||
#if __cplusplus >= 201402L
|
||||
constexpr bool VerifyCalculateNeeded() {
|
||||
for (int i = 0; i < 1; i++) {
|
||||
if (CalculateNeeded(i) != (char_table[i] >> 11) + 1) return false;
|
||||
if (CalculateNeeded(i) != static_cast<uint32_t>((char_table[i] >> 11)) + 1)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -1726,7 +1727,7 @@ bool SnappyDecompressor::RefillTag() {
|
||||
assert(needed <= sizeof(scratch_));
|
||||
|
||||
// Read more bytes from reader if needed
|
||||
uint32_t nbuf = ip_limit_ - ip;
|
||||
uint64_t nbuf = ip_limit_ - ip;
|
||||
if (nbuf < needed) {
|
||||
// Stitch together bytes from ip and reader to form the word
|
||||
// contents. We store the needed bytes in "scratch_". They
|
||||
@@ -1739,7 +1740,7 @@ bool SnappyDecompressor::RefillTag() {
|
||||
size_t length;
|
||||
const char* src = reader_->Peek(&length);
|
||||
if (length == 0) return false;
|
||||
uint32_t to_add = std::min<uint32_t>(needed - nbuf, length);
|
||||
uint64_t to_add = std::min<uint64_t>(needed - nbuf, length);
|
||||
std::memcpy(scratch_ + nbuf, src, to_add);
|
||||
nbuf += to_add;
|
||||
reader_->Skip(to_add);
|
||||
@@ -1802,6 +1803,7 @@ size_t Compress(Source* reader, Sink* writer, CompressionOptions options) {
|
||||
int token = 0;
|
||||
size_t written = 0;
|
||||
size_t N = reader->Available();
|
||||
assert(N <= 0xFFFFFFFFu);
|
||||
const size_t uncompressed_size = N;
|
||||
char ulength[Varint::kMax32];
|
||||
char* p = Varint::Encode32(ulength, N);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include <algorithm>
|
||||
#include <cinttypes>
|
||||
#include <cmath>
|
||||
#include <cstdlib>
|
||||
#include <random>
|
||||
@@ -484,6 +485,18 @@ TEST(Snappy, MaxBlowup) {
|
||||
Verify(input);
|
||||
}
|
||||
|
||||
// Issue #201, when output is more than 4GB, we had a data corruption bug.
|
||||
// We cannot run this test always because of CI constraints.
|
||||
TEST(Snappy, DISABLED_MoreThan4GB) {
|
||||
std::mt19937 rng;
|
||||
std::uniform_int_distribution<int> uniform_byte(0, 255);
|
||||
std::string input;
|
||||
input.resize((1ull << 32) - 1);
|
||||
for (uint64_t i = 0; i < ((1ull << 32) - 1); ++i)
|
||||
input[i] = static_cast<char>(uniform_byte(rng));
|
||||
Verify(input);
|
||||
}
|
||||
|
||||
TEST(Snappy, RandomData) {
|
||||
std::minstd_rand0 rng(snappy::GetFlag(FLAGS_test_random_seed));
|
||||
std::uniform_int_distribution<int> uniform_0_to_3(0, 3);
|
||||
|
||||
Reference in New Issue
Block a user