Permalink
Browse files

upgrade to 1.0.3

  • Loading branch information...
1 parent 87d0742 commit b840218d0e4cdd8aec6d5cb741da5cf406295a89 @benoitc benoitc committed Jun 19, 2011
Showing with 284 additions and 202 deletions.
  1. +8 −0 c_src/erl_nif_compat.h
  2. +29 −0 c_src/snappy/NEWS
  3. +42 −36 c_src/snappy/snappy.cc
  4. +196 −156 c_src/snappy_nif.cc
  5. +3 −4 src/snappy.erl
  6. +6 −6 test/snappy_tests.erl
View
@@ -53,6 +53,9 @@ extern "C" {
#define enif_priv_data_compat enif_get_data
#define enif_make_uint_compat enif_make_ulong
+#define enif_make_existing_atom_compat(E, N, R, Enc) \
+ enif_make_existing_atom(E, N, R)
+
#define enif_make_string_compat(E, B, Enc) \
enif_make_string(E, B)
@@ -74,6 +77,10 @@ extern "C" {
#define enif_make_string_compat enif_make_string
#define enif_make_uint_compat enif_make_uint
+#define enif_make_existing_atom_compat(E, N, R, Enc) \
+ enif_make_existing_atom(E, N, R)
+
+
#endif /* R13B04 */
@@ -109,6 +116,7 @@ extern "C" {
#define enif_priv_data_compat enif_priv_data
#define enif_make_string_compat enif_make_string
+#define enif_make_existing_atom_compat enif_make_existing_atom
#define enif_make_uint_compat enif_make_uint
#endif /* R14 and future releases */
View
@@ -1,3 +1,32 @@
+Snappy v1.0.3, June 2nd 2011:
+
+ * Speeded up the decompressor somewhat; about 3-6% for Core 2,
+ 6-13% for Core i7, and 5-12% for Opteron (all in 64-bit mode).
+
+ * Added compressed format documentation. This text is new,
+ but an earlier version from Zeev Tarantov was used as reference.
+
+ * Only link snappy_unittest against -lz and other autodetected
+ libraries, not libsnappy.so (which doesn't need any such dependency).
+
+ * Fixed some display issues in the microbenchmarks, one of which would
+ frequently make the test crash on GNU/Hurd.
+
+
+Snappy v1.0.2, April 29th 2011:
+
+ * Relicense to a BSD-type license.
+
+ * Added C bindings, contributed by Martin Gieseking.
+
+ * More Win32 fixes, in particular for MSVC.
+
+ * Replace geo.protodata with a newer version.
+
+ * Fix timing inaccuracies in the unit test when comparing Snappy
+ to other algorithms.
+
+
Snappy v1.0.1, March 25th 2011:
This is a maintenance release, mostly containing minor fixes.
View
@@ -653,44 +653,50 @@ class SnappyDecompressor {
// Process the next item found in the input.
// Returns true if successful, false on error or end of input.
template <class Writer>
- bool Step(Writer* writer) {
+ void DecompressAllTags(Writer* writer) {
const char* ip = ip_;
- if (ip_limit_ - ip < 5) {
- if (!RefillTag()) return false;
- ip = ip_;
- }
-
- const unsigned char c = *(reinterpret_cast<const unsigned char*>(ip++));
- const uint32 entry = char_table[c];
- const uint32 trailer = LittleEndian::Load32(ip) & wordmask[entry >> 11];
- ip += entry >> 11;
- const uint32 length = entry & 0xff;
+ for ( ;; ) {
+ if (ip_limit_ - ip < 5) {
+ ip_ = ip;
+ if (!RefillTag()) return;
+ ip = ip_;
+ }
- if ((c & 0x3) == LITERAL) {
- uint32 literal_length = length + trailer;
- uint32 avail = ip_limit_ - ip;
- while (avail < literal_length) {
+ const unsigned char c = *(reinterpret_cast<const unsigned char*>(ip++));
+ const uint32 entry = char_table[c];
+ const uint32 trailer = LittleEndian::Load32(ip) & wordmask[entry >> 11];
+ ip += entry >> 11;
+ const uint32 length = entry & 0xff;
+
+ if ((c & 0x3) == LITERAL) {
+ uint32 literal_length = length + trailer;
+ uint32 avail = ip_limit_ - ip;
+ while (avail < literal_length) {
+ bool allow_fast_path = (avail >= 16);
+ if (!writer->Append(ip, avail, allow_fast_path)) return;
+ literal_length -= avail;
+ reader_->Skip(peeked_);
+ size_t n;
+ ip = reader_->Peek(&n);
+ avail = n;
+ peeked_ = avail;
+ if (avail == 0) return; // Premature end of input
+ ip_limit_ = ip + avail;
+ }
bool allow_fast_path = (avail >= 16);
- if (!writer->Append(ip, avail, allow_fast_path)) return false;
- literal_length -= avail;
- reader_->Skip(peeked_);
- size_t n;
- ip = reader_->Peek(&n);
- avail = n;
- peeked_ = avail;
- if (avail == 0) return false; // Premature end of input
- ip_limit_ = ip + avail;
+ if (!writer->Append(ip, literal_length, allow_fast_path)) {
+ return;
+ }
+ ip += literal_length;
+ } else {
+ // copy_offset/256 is encoded in bits 8..10. By just fetching
+ // those bits, we get copy_offset (since the bit-field starts at
+ // bit 8).
+ const uint32 copy_offset = entry & 0x700;
+ if (!writer->AppendFromSelf(copy_offset + trailer, length)) {
+ return;
+ }
}
- ip_ = ip + literal_length;
- bool allow_fast_path = (avail >= 16);
- return writer->Append(ip, literal_length, allow_fast_path);
- } else {
- ip_ = ip;
- // copy_offset/256 is encoded in bits 8..10. By just fetching
- // those bits, we get copy_offset (since the bit-field starts at
- // bit 8).
- const uint32 copy_offset = entry & 0x700;
- return writer->AppendFromSelf(copy_offset + trailer, length);
}
}
};
@@ -770,7 +776,7 @@ static bool InternalUncompress(Source* r,
writer->SetExpectedLength(uncompressed_len);
// Process the entire input
- while (decompressor.Step(writer)) { }
+ decompressor.DecompressAllTags(writer);
return (decompressor.eof() && writer->CheckLength());
}
@@ -866,7 +872,7 @@ size_t Compress(Source* reader, Sink* writer) {
// A type that writes to a flat array.
// Note that this is not a "ByteSink", but a type that matches the
-// Writer template argument to SnappyDecompressor::Step().
+// Writer template argument to SnappyDecompressor::DecompressAllTags().
class SnappyArrayWriter {
private:
char* base_;
Oops, something went wrong.

0 comments on commit b840218

Please sign in to comment.