Skip to content
Permalink
Browse files
upgrade to 1.0.3
  • Loading branch information
benoitc committed Jun 19, 2011
1 parent 87d0742 commit b840218d0e4cdd8aec6d5cb741da5cf406295a89
Showing 6 changed files with 284 additions and 202 deletions.
@@ -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 */
@@ -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.
@@ -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_;

0 comments on commit b840218

Please sign in to comment.