snappy 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +2 -2
- data/README.md +17 -1
- data/ext/extconf.rb +13 -11
- data/lib/snappy/version.rb +1 -1
- data/snappy.gemspec +1 -0
- data/vendor/snappy/CMakeLists.txt +150 -27
- data/vendor/snappy/CONTRIBUTING.md +9 -4
- data/vendor/snappy/NEWS +12 -0
- data/vendor/snappy/README.md +52 -35
- data/vendor/snappy/cmake/config.h.in +28 -24
- data/vendor/snappy/snappy-internal.h +189 -25
- data/vendor/snappy/snappy-sinksource.cc +26 -9
- data/vendor/snappy/snappy-sinksource.h +11 -11
- data/vendor/snappy/snappy-stubs-internal.cc +1 -1
- data/vendor/snappy/snappy-stubs-internal.h +227 -308
- data/vendor/snappy/snappy-stubs-public.h.in +0 -11
- data/vendor/snappy/snappy-test.cc +88 -198
- data/vendor/snappy/snappy-test.h +102 -285
- data/vendor/snappy/snappy.cc +1176 -410
- data/vendor/snappy/snappy.h +19 -4
- data/vendor/snappy/snappy_benchmark.cc +378 -0
- data/vendor/snappy/snappy_compress_fuzzer.cc +3 -2
- data/vendor/snappy/snappy_test_data.cc +57 -0
- data/vendor/snappy/snappy_test_data.h +68 -0
- data/vendor/snappy/snappy_test_tool.cc +471 -0
- data/vendor/snappy/snappy_uncompress_fuzzer.cc +3 -2
- data/vendor/snappy/snappy_unittest.cc +170 -666
- metadata +7 -2
@@ -36,8 +36,6 @@
|
|
36
36
|
#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_
|
37
37
|
|
38
38
|
#include <cstddef>
|
39
|
-
#include <cstdint>
|
40
|
-
#include <string>
|
41
39
|
|
42
40
|
#if ${HAVE_SYS_UIO_H_01} // HAVE_SYS_UIO_H
|
43
41
|
#include <sys/uio.h>
|
@@ -51,15 +49,6 @@
|
|
51
49
|
|
52
50
|
namespace snappy {
|
53
51
|
|
54
|
-
using int8 = std::int8_t;
|
55
|
-
using uint8 = std::uint8_t;
|
56
|
-
using int16 = std::int16_t;
|
57
|
-
using uint16 = std::uint16_t;
|
58
|
-
using int32 = std::int32_t;
|
59
|
-
using uint32 = std::uint32_t;
|
60
|
-
using int64 = std::int64_t;
|
61
|
-
using uint64 = std::uint64_t;
|
62
|
-
|
63
52
|
#if !${HAVE_SYS_UIO_H_01} // !HAVE_SYS_UIO_H
|
64
53
|
// Windows does not have an iovec type, yet the concept is universally useful.
|
65
54
|
// It is simple to define it ourselves, so we put it inside our own namespace.
|
@@ -28,23 +28,74 @@
|
|
28
28
|
//
|
29
29
|
// Various stubs for the unit tests for the open-source version of Snappy.
|
30
30
|
|
31
|
-
#ifdef HAVE_CONFIG_H
|
32
|
-
#include "config.h"
|
33
|
-
#endif
|
34
|
-
|
35
|
-
#ifdef HAVE_WINDOWS_H
|
36
|
-
// Needed to be able to use std::max without workarounds in the source code.
|
37
|
-
// https://support.microsoft.com/en-us/help/143208/prb-using-stl-in-windows-program-can-cause-min-max-conflicts
|
38
|
-
#define NOMINMAX
|
39
|
-
#include <windows.h>
|
40
|
-
#endif
|
41
|
-
|
42
31
|
#include "snappy-test.h"
|
43
32
|
|
44
33
|
#include <algorithm>
|
34
|
+
#include <cstdarg>
|
35
|
+
#include <cstdio>
|
36
|
+
#include <cstdlib>
|
37
|
+
#include <iostream>
|
38
|
+
#include <string>
|
39
|
+
|
40
|
+
namespace file {
|
41
|
+
|
42
|
+
OptionsStub::OptionsStub() = default;
|
43
|
+
OptionsStub::~OptionsStub() = default;
|
44
|
+
|
45
|
+
const OptionsStub &Defaults() {
|
46
|
+
static OptionsStub defaults;
|
47
|
+
return defaults;
|
48
|
+
}
|
49
|
+
|
50
|
+
StatusStub::StatusStub() = default;
|
51
|
+
StatusStub::StatusStub(const StatusStub &) = default;
|
52
|
+
StatusStub &StatusStub::operator=(const StatusStub &) = default;
|
53
|
+
StatusStub::~StatusStub() = default;
|
54
|
+
|
55
|
+
bool StatusStub::ok() { return true; }
|
56
|
+
|
57
|
+
StatusStub GetContents(const std::string &filename, std::string *output,
|
58
|
+
const OptionsStub & /* options */) {
|
59
|
+
std::FILE *fp = std::fopen(filename.c_str(), "rb");
|
60
|
+
if (fp == nullptr) {
|
61
|
+
std::perror(filename.c_str());
|
62
|
+
std::exit(1);
|
63
|
+
}
|
45
64
|
|
46
|
-
|
47
|
-
|
65
|
+
output->clear();
|
66
|
+
while (!std::feof(fp)) {
|
67
|
+
char buffer[4096];
|
68
|
+
size_t bytes_read = std::fread(buffer, 1, sizeof(buffer), fp);
|
69
|
+
if (bytes_read == 0 && std::ferror(fp)) {
|
70
|
+
std::perror("fread");
|
71
|
+
std::exit(1);
|
72
|
+
}
|
73
|
+
output->append(buffer, bytes_read);
|
74
|
+
}
|
75
|
+
|
76
|
+
std::fclose(fp);
|
77
|
+
return StatusStub();
|
78
|
+
}
|
79
|
+
|
80
|
+
StatusStub SetContents(const std::string &file_name, const std::string &content,
|
81
|
+
const OptionsStub & /* options */) {
|
82
|
+
std::FILE *fp = std::fopen(file_name.c_str(), "wb");
|
83
|
+
if (fp == nullptr) {
|
84
|
+
std::perror(file_name.c_str());
|
85
|
+
std::exit(1);
|
86
|
+
}
|
87
|
+
|
88
|
+
size_t bytes_written = std::fwrite(content.data(), 1, content.size(), fp);
|
89
|
+
if (bytes_written != content.size()) {
|
90
|
+
std::perror("fwrite");
|
91
|
+
std::exit(1);
|
92
|
+
}
|
93
|
+
|
94
|
+
std::fclose(fp);
|
95
|
+
return StatusStub();
|
96
|
+
}
|
97
|
+
|
98
|
+
} // namespace file
|
48
99
|
|
49
100
|
namespace snappy {
|
50
101
|
|
@@ -56,212 +107,51 @@ std::string ReadTestDataFile(const std::string& base, size_t size_limit) {
|
|
56
107
|
prefix = std::string(srcdir) + "/";
|
57
108
|
}
|
58
109
|
file::GetContents(prefix + "testdata/" + base, &contents, file::Defaults()
|
59
|
-
).
|
110
|
+
).ok();
|
60
111
|
if (size_limit > 0) {
|
61
112
|
contents = contents.substr(0, size_limit);
|
62
113
|
}
|
63
114
|
return contents;
|
64
115
|
}
|
65
116
|
|
66
|
-
std::string ReadTestDataFile(const std::string& base) {
|
67
|
-
return ReadTestDataFile(base, 0);
|
68
|
-
}
|
69
|
-
|
70
117
|
std::string StrFormat(const char* format, ...) {
|
71
|
-
char
|
72
|
-
va_list ap;
|
118
|
+
char buffer[4096];
|
119
|
+
std::va_list ap;
|
73
120
|
va_start(ap, format);
|
74
|
-
vsnprintf(
|
121
|
+
std::vsnprintf(buffer, sizeof(buffer), format, ap);
|
75
122
|
va_end(ap);
|
76
|
-
return
|
123
|
+
return buffer;
|
77
124
|
}
|
78
125
|
|
79
|
-
|
80
|
-
int64 benchmark_real_time_us = 0;
|
81
|
-
int64 benchmark_cpu_time_us = 0;
|
82
|
-
std::string* benchmark_label = nullptr;
|
83
|
-
int64 benchmark_bytes_processed = 0;
|
84
|
-
|
85
|
-
void ResetBenchmarkTiming() {
|
86
|
-
benchmark_real_time_us = 0;
|
87
|
-
benchmark_cpu_time_us = 0;
|
88
|
-
}
|
126
|
+
LogMessage::~LogMessage() { std::cerr << std::endl; }
|
89
127
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
#else // WIN32
|
94
|
-
struct timeval benchmark_start_real;
|
95
|
-
struct rusage benchmark_start_cpu;
|
96
|
-
#endif // WIN32
|
97
|
-
|
98
|
-
void StartBenchmarkTiming() {
|
99
|
-
#ifdef WIN32
|
100
|
-
QueryPerformanceCounter(&benchmark_start_real);
|
101
|
-
FILETIME dummy;
|
102
|
-
CHECK(GetProcessTimes(
|
103
|
-
GetCurrentProcess(), &dummy, &dummy, &dummy, &benchmark_start_cpu));
|
104
|
-
#else
|
105
|
-
gettimeofday(&benchmark_start_real, NULL);
|
106
|
-
if (getrusage(RUSAGE_SELF, &benchmark_start_cpu) == -1) {
|
107
|
-
perror("getrusage(RUSAGE_SELF)");
|
108
|
-
exit(1);
|
109
|
-
}
|
110
|
-
#endif
|
111
|
-
benchmark_running = true;
|
128
|
+
LogMessage &LogMessage::operator<<(const std::string &message) {
|
129
|
+
std::cerr << message;
|
130
|
+
return *this;
|
112
131
|
}
|
113
132
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
}
|
118
|
-
|
119
|
-
#ifdef WIN32
|
120
|
-
LARGE_INTEGER benchmark_stop_real;
|
121
|
-
LARGE_INTEGER benchmark_frequency;
|
122
|
-
QueryPerformanceCounter(&benchmark_stop_real);
|
123
|
-
QueryPerformanceFrequency(&benchmark_frequency);
|
124
|
-
|
125
|
-
double elapsed_real = static_cast<double>(
|
126
|
-
benchmark_stop_real.QuadPart - benchmark_start_real.QuadPart) /
|
127
|
-
benchmark_frequency.QuadPart;
|
128
|
-
benchmark_real_time_us += elapsed_real * 1e6 + 0.5;
|
129
|
-
|
130
|
-
FILETIME benchmark_stop_cpu, dummy;
|
131
|
-
CHECK(GetProcessTimes(
|
132
|
-
GetCurrentProcess(), &dummy, &dummy, &dummy, &benchmark_stop_cpu));
|
133
|
-
|
134
|
-
ULARGE_INTEGER start_ulargeint;
|
135
|
-
start_ulargeint.LowPart = benchmark_start_cpu.dwLowDateTime;
|
136
|
-
start_ulargeint.HighPart = benchmark_start_cpu.dwHighDateTime;
|
137
|
-
|
138
|
-
ULARGE_INTEGER stop_ulargeint;
|
139
|
-
stop_ulargeint.LowPart = benchmark_stop_cpu.dwLowDateTime;
|
140
|
-
stop_ulargeint.HighPart = benchmark_stop_cpu.dwHighDateTime;
|
141
|
-
|
142
|
-
benchmark_cpu_time_us +=
|
143
|
-
(stop_ulargeint.QuadPart - start_ulargeint.QuadPart + 5) / 10;
|
144
|
-
#else // WIN32
|
145
|
-
struct timeval benchmark_stop_real;
|
146
|
-
gettimeofday(&benchmark_stop_real, NULL);
|
147
|
-
benchmark_real_time_us +=
|
148
|
-
1000000 * (benchmark_stop_real.tv_sec - benchmark_start_real.tv_sec);
|
149
|
-
benchmark_real_time_us +=
|
150
|
-
(benchmark_stop_real.tv_usec - benchmark_start_real.tv_usec);
|
151
|
-
|
152
|
-
struct rusage benchmark_stop_cpu;
|
153
|
-
if (getrusage(RUSAGE_SELF, &benchmark_stop_cpu) == -1) {
|
154
|
-
perror("getrusage(RUSAGE_SELF)");
|
155
|
-
exit(1);
|
156
|
-
}
|
157
|
-
benchmark_cpu_time_us += 1000000 * (benchmark_stop_cpu.ru_utime.tv_sec -
|
158
|
-
benchmark_start_cpu.ru_utime.tv_sec);
|
159
|
-
benchmark_cpu_time_us += (benchmark_stop_cpu.ru_utime.tv_usec -
|
160
|
-
benchmark_start_cpu.ru_utime.tv_usec);
|
161
|
-
#endif // WIN32
|
162
|
-
|
163
|
-
benchmark_running = false;
|
133
|
+
LogMessage &LogMessage::operator<<(int number) {
|
134
|
+
std::cerr << number;
|
135
|
+
return *this;
|
164
136
|
}
|
165
137
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
138
|
+
#ifdef _MSC_VER
|
139
|
+
// ~LogMessageCrash calls std::abort() and therefore never exits. This is by
|
140
|
+
// design, so temporarily disable warning C4722.
|
141
|
+
#pragma warning(push)
|
142
|
+
#pragma warning(disable : 4722)
|
143
|
+
#endif
|
172
144
|
|
173
|
-
|
174
|
-
|
145
|
+
LogMessageCrash::~LogMessageCrash() {
|
146
|
+
std::cerr << std::endl;
|
147
|
+
std::abort();
|
175
148
|
}
|
176
149
|
|
177
|
-
|
178
|
-
|
179
|
-
int64 cpu_time_us;
|
180
|
-
};
|
181
|
-
|
182
|
-
struct BenchmarkCompareCPUTime {
|
183
|
-
bool operator() (const BenchmarkRun& a, const BenchmarkRun& b) const {
|
184
|
-
return a.cpu_time_us < b.cpu_time_us;
|
185
|
-
}
|
186
|
-
};
|
187
|
-
|
188
|
-
void Benchmark::Run() {
|
189
|
-
for (int test_case_num = start_; test_case_num <= stop_; ++test_case_num) {
|
190
|
-
// Run a few iterations first to find out approximately how fast
|
191
|
-
// the benchmark is.
|
192
|
-
const int kCalibrateIterations = 100;
|
193
|
-
ResetBenchmarkTiming();
|
194
|
-
StartBenchmarkTiming();
|
195
|
-
(*function_)(kCalibrateIterations, test_case_num);
|
196
|
-
StopBenchmarkTiming();
|
197
|
-
|
198
|
-
// Let each test case run for about 200ms, but at least as many
|
199
|
-
// as we used to calibrate.
|
200
|
-
// Run five times and pick the median.
|
201
|
-
const int kNumRuns = 5;
|
202
|
-
const int kMedianPos = kNumRuns / 2;
|
203
|
-
int num_iterations = 0;
|
204
|
-
if (benchmark_real_time_us > 0) {
|
205
|
-
num_iterations = 200000 * kCalibrateIterations / benchmark_real_time_us;
|
206
|
-
}
|
207
|
-
num_iterations = std::max(num_iterations, kCalibrateIterations);
|
208
|
-
BenchmarkRun benchmark_runs[kNumRuns];
|
209
|
-
|
210
|
-
for (int run = 0; run < kNumRuns; ++run) {
|
211
|
-
ResetBenchmarkTiming();
|
212
|
-
StartBenchmarkTiming();
|
213
|
-
(*function_)(num_iterations, test_case_num);
|
214
|
-
StopBenchmarkTiming();
|
215
|
-
|
216
|
-
benchmark_runs[run].real_time_us = benchmark_real_time_us;
|
217
|
-
benchmark_runs[run].cpu_time_us = benchmark_cpu_time_us;
|
218
|
-
}
|
219
|
-
|
220
|
-
std::string heading = StrFormat("%s/%d", name_.c_str(), test_case_num);
|
221
|
-
std::string human_readable_speed;
|
222
|
-
|
223
|
-
std::nth_element(benchmark_runs,
|
224
|
-
benchmark_runs + kMedianPos,
|
225
|
-
benchmark_runs + kNumRuns,
|
226
|
-
BenchmarkCompareCPUTime());
|
227
|
-
int64 real_time_us = benchmark_runs[kMedianPos].real_time_us;
|
228
|
-
int64 cpu_time_us = benchmark_runs[kMedianPos].cpu_time_us;
|
229
|
-
if (cpu_time_us <= 0) {
|
230
|
-
human_readable_speed = "?";
|
231
|
-
} else {
|
232
|
-
int64 bytes_per_second =
|
233
|
-
benchmark_bytes_processed * 1000000 / cpu_time_us;
|
234
|
-
if (bytes_per_second < 1024) {
|
235
|
-
human_readable_speed =
|
236
|
-
StrFormat("%dB/s", static_cast<int>(bytes_per_second));
|
237
|
-
} else if (bytes_per_second < 1024 * 1024) {
|
238
|
-
human_readable_speed = StrFormat(
|
239
|
-
"%.1fkB/s", bytes_per_second / 1024.0f);
|
240
|
-
} else if (bytes_per_second < 1024 * 1024 * 1024) {
|
241
|
-
human_readable_speed = StrFormat(
|
242
|
-
"%.1fMB/s", bytes_per_second / (1024.0f * 1024.0f));
|
243
|
-
} else {
|
244
|
-
human_readable_speed = StrFormat(
|
245
|
-
"%.1fGB/s", bytes_per_second / (1024.0f * 1024.0f * 1024.0f));
|
246
|
-
}
|
247
|
-
}
|
248
|
-
|
249
|
-
fprintf(stderr,
|
250
|
-
#ifdef WIN32
|
251
|
-
"%-18s %10I64d %10I64d %10d %s %s\n",
|
252
|
-
#else
|
253
|
-
"%-18s %10lld %10lld %10d %s %s\n",
|
150
|
+
#ifdef _MSC_VER
|
151
|
+
#pragma warning(pop)
|
254
152
|
#endif
|
255
|
-
heading.c_str(),
|
256
|
-
static_cast<long long>(real_time_us * 1000 / num_iterations),
|
257
|
-
static_cast<long long>(cpu_time_us * 1000 / num_iterations),
|
258
|
-
num_iterations,
|
259
|
-
human_readable_speed.c_str(),
|
260
|
-
benchmark_label->c_str());
|
261
|
-
}
|
262
|
-
}
|
263
153
|
|
264
|
-
#
|
154
|
+
#if HAVE_LIBZ
|
265
155
|
|
266
156
|
ZLib::ZLib()
|
267
157
|
: comp_init_(false),
|