Skip to content

Commit

Permalink
Provide hints to compilers about error paths being unlikely.
Browse files Browse the repository at this point in the history
Given that Squash itself doesn't contain too many hot code paths this
is unlikely to provide a significant performance boost, but every bit
helps.

#140
  • Loading branch information
nemequ committed Oct 24, 2015
1 parent bc114d2 commit d63f45f
Show file tree
Hide file tree
Showing 36 changed files with 162 additions and 162 deletions.
16 changes: 8 additions & 8 deletions plugins/brieflz/squash-brieflz.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,14 +144,14 @@ squash_brieflz_decompress_buffer (SquashCodec* codec,

size = read_varuint64 (src, compressed_size, &original_size);

if (size == 0) {
if (SQUASH_UNLIKELY(size == 0)) {
return squash_error (SQUASH_FAILED);
}

src += size;
compressed_size -= size;

if (original_size > *decompressed_size) {
if (SQUASH_UNLIKELY(original_size > *decompressed_size)) {
return squash_error (SQUASH_BUFFER_FULL);
}

Expand All @@ -164,7 +164,7 @@ squash_brieflz_decompress_buffer (SquashCodec* codec,
size = blz_depack_safe (src, (unsigned long) compressed_size,
decompressed, (unsigned long) original_size);

if (size != original_size) {
if (SQUASH_UNLIKELY(size != original_size)) {
return squash_error (SQUASH_FAILED);
}

Expand Down Expand Up @@ -195,22 +195,22 @@ squash_brieflz_compress_buffer (SquashCodec* codec,
return squash_error (SQUASH_RANGE);
#endif

if ((unsigned long) *compressed_size
< squash_brieflz_get_max_compressed_size (codec, uncompressed_size)) {
if (SQUASH_UNLIKELY((unsigned long) *compressed_size
< squash_brieflz_get_max_compressed_size (codec, uncompressed_size))) {
return squash_error (SQUASH_BUFFER_FULL);
}

size = write_varuint64 (dst, *compressed_size, uncompressed_size);

if (size == 0) {
if (SQUASH_UNLIKELY(size == 0)) {
return squash_error (SQUASH_BUFFER_FULL);
}

dst += size;

workmem = malloc (blz_workmem_size ((unsigned long) uncompressed_size));

if (workmem == NULL) {
if (SQUASH_UNLIKELY(workmem == NULL)) {
return squash_error (SQUASH_MEMORY);
}

Expand All @@ -234,7 +234,7 @@ SquashStatus
squash_plugin_init_codec (SquashCodec* codec, SquashCodecImpl* impl) {
const char* name = squash_codec_get_name (codec);

if (strcmp ("brieflz", name) == 0) {
if (SQUASH_LIKELY(strcmp ("brieflz", name) == 0)) {
impl->get_uncompressed_size = squash_brieflz_get_uncompressed_size;
impl->get_max_compressed_size = squash_brieflz_get_max_compressed_size;
impl->decompress_buffer = squash_brieflz_decompress_buffer;
Expand Down
12 changes: 6 additions & 6 deletions plugins/brotli/squash-brotli.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -222,9 +222,9 @@ squash_brotli_compress_stream (SquashStream* stream, SquashOperation operation)

end_of_input = s->base_object.avail_in == 0;
bool is_last = (operation == SQUASH_OPERATION_FINISH) && end_of_input;
if (!s->compressor->WriteBrotliData(is_last,
s->should_flush && end_of_input,
&s->remaining_out, &s->next_out)) {
if (SQUASH_UNLIKELY(!s->compressor->WriteBrotliData(is_last,
s->should_flush && end_of_input,
&s->remaining_out, &s->next_out))) {
return squash_error (SQUASH_FAILED);
}
if (is_last) {
Expand All @@ -251,7 +251,7 @@ squash_brotli_decompress_stream (SquashStream* stream, SquashOperation operation
s->finished = true;
return SQUASH_OK;
}
if (res == BROTLI_RESULT_NEEDS_MORE_OUTPUT || res == BROTLI_RESULT_NEEDS_MORE_INPUT) {
if (SQUASH_LIKELY(res == BROTLI_RESULT_NEEDS_MORE_OUTPUT || res == BROTLI_RESULT_NEEDS_MORE_INPUT)) {
return (res == BROTLI_RESULT_NEEDS_MORE_OUTPUT) ? SQUASH_PROCESSING : SQUASH_OK;
}
return squash_error (SQUASH_FAILED);
Expand Down Expand Up @@ -307,7 +307,7 @@ squash_brotli_compress_buffer (SquashCodec* codec,
int res = brotli::BrotliCompressBuffer (params,
uncompressed_size, uncompressed,
compressed_size, compressed);
return (res == 1) ? SQUASH_OK : squash_error (SQUASH_FAILED);
return SQUASH_LIKELY(res == 1) ? SQUASH_OK : squash_error (SQUASH_FAILED);
} catch (const std::bad_alloc& e) {
return squash_error (SQUASH_MEMORY);
} catch (...) {
Expand Down Expand Up @@ -337,7 +337,7 @@ extern "C" SquashStatus
squash_plugin_init_codec (SquashCodec* codec, SquashCodecImpl* impl) {
const char* name = squash_codec_get_name (codec);

if (strcmp ("brotli", name) == 0) {
if (SQUASH_LIKELY(strcmp ("brotli", name) == 0)) {
impl->options = squash_brotli_options;
impl->get_max_compressed_size = squash_brotli_get_max_compressed_size;
impl->create_stream = squash_brotli_create_stream;
Expand Down
12 changes: 6 additions & 6 deletions plugins/bsc/squash-bsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,13 +149,13 @@ squash_bsc_compress_buffer (SquashCodec* codec,
return squash_error (SQUASH_RANGE);
#endif

if (*compressed_size < (uncompressed_size + LIBBSC_HEADER_SIZE))
if (SQUASH_UNLIKELY(*compressed_size < (uncompressed_size + LIBBSC_HEADER_SIZE)))
return squash_error (SQUASH_BUFFER_FULL);

const int res = bsc_compress (uncompressed, compressed, (int) uncompressed_size,
lzp_hash_size, lzp_min_len, block_sorter, coder, features);

if (res < 0) {
if (SQUASH_UNLIKELY(res < 0)) {
return squash_error (SQUASH_FAILED);
}

Expand Down Expand Up @@ -188,14 +188,14 @@ squash_bsc_decompress_buffer (SquashCodec* codec,

int res = bsc_block_info (compressed, (int) compressed_size, &p_block_size, &p_data_size, LIBBSC_DEFAULT_FEATURES);

if (p_block_size != (int) compressed_size)
if (SQUASH_UNLIKELY(p_block_size != (int) compressed_size))
return squash_error (SQUASH_FAILED);
if (p_data_size > (int) *decompressed_size)
if (SQUASH_UNLIKELY(p_data_size > (int) *decompressed_size))
return squash_error (SQUASH_BUFFER_FULL);

res = bsc_decompress (compressed, p_block_size, decompressed, p_data_size, features);

if (res < 0)
if (SQUASH_UNLIKELY(res < 0))
return squash_error (SQUASH_FAILED);

#if SIZE_MAX < INT_MAX
Expand All @@ -214,7 +214,7 @@ squash_plugin_init_codec (SquashCodec* codec, SquashCodecImpl* impl) {

const char* name = squash_codec_get_name (codec);

if (strcmp ("bsc", name) == 0) {
if (SQUASH_LIKELY(strcmp ("bsc", name) == 0)) {
impl->options = squash_bsc_options;
impl->get_uncompressed_size = squash_lzg_get_uncompressed_size;
impl->get_max_compressed_size = squash_bsc_get_max_compressed_size;
Expand Down
6 changes: 3 additions & 3 deletions plugins/copy/squash-copy.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ squash_copy_compress_buffer (SquashCodec* codec,
size_t uncompressed_size,
const uint8_t uncompressed[SQUASH_ARRAY_PARAM(uncompressed_size)],
SquashOptions* options) {
if (*compressed_size < uncompressed_size)
if (SQUASH_UNLIKELY(*compressed_size < uncompressed_size))
return squash_error (SQUASH_BUFFER_FULL);

memcpy (compressed, uncompressed, uncompressed_size);
Expand All @@ -135,7 +135,7 @@ squash_copy_decompress_buffer (SquashCodec* codec,
size_t compressed_size,
const uint8_t compressed[SQUASH_ARRAY_PARAM(compressed_size)],
SquashOptions* options) {
if (*decompressed_size < compressed_size)
if (SQUASH_UNLIKELY(*decompressed_size < compressed_size))
return squash_error (SQUASH_BUFFER_FULL);

memcpy (decompressed, compressed, compressed_size);
Expand All @@ -148,7 +148,7 @@ SquashStatus
squash_plugin_init_codec (SquashCodec* codec, SquashCodecImpl* impl) {
const char* name = squash_codec_get_name (codec);

if (strcmp ("copy", name) == 0) {
if (SQUASH_LIKELY(strcmp ("copy", name) == 0)) {
impl->info = SQUASH_CODEC_INFO_CAN_FLUSH;
impl->get_uncompressed_size = squash_copy_get_uncompressed_size;
impl->get_max_compressed_size = squash_copy_get_max_compressed_size;
Expand Down
6 changes: 3 additions & 3 deletions plugins/crush/squash-crush.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@ squash_crush_splice (SquashCodec* codec,

if (data.last_res < 0)
return data.last_res;
else if (res != 0)
return SQUASH_FAILED;
else if (SQUASH_UNLIKELY(res != 0))
return squash_error (SQUASH_FAILED);
else
return SQUASH_OK;
}
Expand All @@ -129,7 +129,7 @@ SquashStatus
squash_plugin_init_codec (SquashCodec* codec, SquashCodecImpl* impl) {
const char* name = squash_codec_get_name (codec);

if (strcmp ("crush", name) == 0) {
if (SQUASH_LIKELY(strcmp ("crush", name) == 0)) {
impl->options = squash_crush_options;
impl->splice = squash_crush_splice;
impl->get_max_compressed_size = squash_crush_get_max_compressed_size;
Expand Down
6 changes: 3 additions & 3 deletions plugins/csc/squash-csc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ squash_csc_splice (SquashCodec* codec,

CSCEnc_WriteProperties (&props, props_buf, 0);
size_t bytes_written = squash_csc_writer ((void*) &out_stream, props_buf, CSC_PROP_SIZE);
if (bytes_written != CSC_PROP_SIZE)
if (SQUASH_UNLIKELY(bytes_written != CSC_PROP_SIZE))
return squash_error (SQUASH_FAILED);

CSCEncHandle comp = CSCEnc_Create (&props, (ISeqOutStream*) &out_stream);
Expand All @@ -138,7 +138,7 @@ squash_csc_splice (SquashCodec* codec,
} else {
size_t prop_l = CSC_PROP_SIZE;
squash_csc_reader ((void*) &in_stream, props_buf, &prop_l);
if (prop_l != CSC_PROP_SIZE)
if (SQUASH_UNLIKELY(prop_l != CSC_PROP_SIZE))
return squash_error (SQUASH_FAILED);

CSCDec_ReadProperties (&props, props_buf);
Expand Down Expand Up @@ -177,7 +177,7 @@ extern "C" SquashStatus
squash_plugin_init_codec (SquashCodec* codec, SquashCodecImpl* impl) {
const char* name = squash_codec_get_name (codec);

if (strcmp ("csc", name) == 0) {
if (SQUASH_LIKELY(strcmp ("csc", name) == 0)) {
impl->info = SQUASH_CODEC_INFO_RUN_IN_THREAD;
impl->options = squash_csc_options;
impl->splice = squash_csc_splice;
Expand Down
6 changes: 3 additions & 3 deletions plugins/density/squash-density.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ squash_density_process_stream (SquashStream* stream, SquashOperation operation)
s->buffer_active = false;
s->state = density_stream_prepare (s->stream, (uint8_t*) stream->next_in, s->active_input_size, stream->next_out, stream->avail_out);
}
if (s->state != DENSITY_STREAM_STATE_READY)
if (SQUASH_UNLIKELY(s->state != DENSITY_STREAM_STATE_READY))
return squash_error (SQUASH_FAILED);
}

Expand Down Expand Up @@ -316,7 +316,7 @@ squash_density_process_stream (SquashStream* stream, SquashOperation operation)
} else {
s->state = density_stream_decompress_init (s->stream, NULL);
}
if (s->state != DENSITY_STREAM_STATE_READY)
if (SQUASH_UNLIKELY(s->state != DENSITY_STREAM_STATE_READY))
return squash_error (SQUASH_FAILED);
s->next = SQUASH_DENSITY_ACTION_CONTINUE;
break;
Expand Down Expand Up @@ -411,7 +411,7 @@ SquashStatus
squash_plugin_init_codec (SquashCodec* codec, SquashCodecImpl* impl) {
const char* name = squash_codec_get_name (codec);

if (strcmp ("density", name) == 0) {
if (SQUASH_LIKELY(strcmp ("density", name) == 0)) {
impl->options = squash_density_options;
impl->create_stream = squash_density_create_stream;
impl->process_stream = squash_density_process_stream;
Expand Down
6 changes: 3 additions & 3 deletions plugins/doboz/squash-doboz.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,13 @@ squash_doboz_status (doboz::Result status) {
res = SQUASH_OK;
break;
case doboz::RESULT_ERROR_BUFFER_TOO_SMALL:
res = SQUASH_BUFFER_FULL;
res = squash_error (SQUASH_BUFFER_FULL);
break;
case doboz::RESULT_ERROR_CORRUPTED_DATA:
res = SQUASH_FAILED;
res = squash_error (SQUASH_FAILED);
break;
case doboz::RESULT_ERROR_UNSUPPORTED_VERSION:
res = SQUASH_FAILED;
res = squash_error (SQUASH_FAILED);
break;
}

Expand Down
10 changes: 5 additions & 5 deletions plugins/fari/squash-fari.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,13 @@ squash_fari_decompress_buffer (SquashCodec* codec,
return SQUASH_OK;
break;
case 1:
return SQUASH_MEMORY;
return squash_error (SQUASH_MEMORY);
break;
case 2:
return SQUASH_BUFFER_FULL;
return squash_error (SQUASH_BUFFER_FULL);
break;
default:
return SQUASH_FAILED;
return squash_error (SQUASH_FAILED);
break;
}
}
Expand All @@ -77,14 +77,14 @@ squash_fari_compress_buffer (SquashCodec* codec,
int fari_e = fa_compress ((const unsigned char*) uncompressed, (unsigned char*) compressed,
uncompressed_size, compressed_size);

return fari_e == 0 ? SQUASH_OK : SQUASH_FAILED;
return SQUASH_LIKELY(fari_e == 0) ? SQUASH_OK : SQUASH_FAILED;
}

SquashStatus
squash_plugin_init_codec (SquashCodec* codec, SquashCodecImpl* impl) {
const char* name = squash_codec_get_name (codec);

if (strcmp ("fari", name) == 0) {
if (SQUASH_LIKELY(strcmp ("fari", name) == 0)) {
impl->get_max_compressed_size = squash_fari_get_max_compressed_size;
impl->decompress_buffer = squash_fari_decompress_buffer;
impl->compress_buffer_unsafe = squash_fari_compress_buffer;
Expand Down
8 changes: 4 additions & 4 deletions plugins/fastlz/squash-fastlz.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,9 @@ squash_fastlz_decompress_buffer (SquashCodec* codec,
(void*) decompressed,
(int) *decompressed_size);

if (fastlz_e < 0) {
if (SQUASH_UNLIKELY(fastlz_e < 0)) {
return squash_error (SQUASH_FAILED);
} else if (fastlz_e == 0) {
} else if (SQUASH_UNLIKELY(fastlz_e == 0)) {
return SQUASH_BUFFER_FULL;
} else {
#if SIZE_MAX < INT_MAX
Expand Down Expand Up @@ -116,14 +116,14 @@ squash_fastlz_compress_buffer (SquashCodec* codec,

*compressed_size = (size_t) fastlz_e;

return (fastlz_e == 0) ? squash_error (SQUASH_FAILED) : SQUASH_OK;
return SQUASH_UNLIKELY(fastlz_e == 0) ? squash_error (SQUASH_FAILED) : SQUASH_OK;
}

SquashStatus
squash_plugin_init_codec (SquashCodec* codec, SquashCodecImpl* impl) {
const char* name = squash_codec_get_name (codec);

if (strcmp ("fastlz", name) == 0) {
if (SQUASH_LIKELY(strcmp ("fastlz", name) == 0)) {
impl->options = squash_fastlz_options;
impl->get_max_compressed_size = squash_fastlz_get_max_compressed_size;
impl->decompress_buffer = squash_fastlz_decompress_buffer;
Expand Down
14 changes: 7 additions & 7 deletions plugins/gipfeli/squash-gipfeli.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,24 +106,24 @@ squash_gipfeli_decompress_buffer (SquashCodec* codec,
util::compression::ByteArraySource source((const char*) compressed, compressed_size);
SquashStatus res = SQUASH_OK;

if (compressor == NULL)
if (SQUASH_UNLIKELY(compressor == NULL))
return squash_error (SQUASH_MEMORY);

std::string compressed_str((const char*) compressed, compressed_size);
size_t uncompressed_size;
if (!compressor->GetUncompressedLength (compressed_str, &uncompressed_size)) {
if (SQUASH_UNLIKELY(!compressor->GetUncompressedLength (compressed_str, &uncompressed_size))) {
res = squash_error (SQUASH_FAILED);
goto cleanup;
}

if (uncompressed_size > *decompressed_size) {
if (SQUASH_UNLIKELY(uncompressed_size > *decompressed_size)) {
res = squash_error (SQUASH_BUFFER_FULL);
goto cleanup;
} else {
*decompressed_size = uncompressed_size;
}

if (!compressor->UncompressStream (&source, &sink)) {
if (SQUASH_UNLIKELY(!compressor->UncompressStream (&source, &sink))) {
res = squash_error (SQUASH_FAILED);
}

Expand Down Expand Up @@ -159,7 +159,7 @@ squash_gipfeli_compress_buffer (SquashCodec* codec,

delete compressor;

if (res == SQUASH_OK && *compressed_size == 0)
if (SQUASH_UNLIKELY(res == SQUASH_OK && *compressed_size == 0))
res = squash_error (SQUASH_FAILED);

return res;
Expand Down Expand Up @@ -190,7 +190,7 @@ squash_gipfeli_compress_buffer_unsafe (SquashCodec* codec,

delete compressor;

if (res == SQUASH_OK && *compressed_size == 0)
if (SQUASH_UNLIKELY(res == SQUASH_OK && *compressed_size == 0))
res = squash_error (SQUASH_FAILED);

return res;
Expand All @@ -200,7 +200,7 @@ extern "C" SquashStatus
squash_plugin_init_codec (SquashCodec* codec, SquashCodecImpl* impl) {
const char* name = squash_codec_get_name (codec);

if (strcmp ("gipfeli", name) == 0) {
if (SQUASH_LIKELY(strcmp ("gipfeli", name) == 0)) {
impl->get_uncompressed_size = squash_gipfeli_get_uncompressed_size;
impl->get_max_compressed_size = squash_gipfeli_get_max_compressed_size;
impl->decompress_buffer = squash_gipfeli_decompress_buffer;
Expand Down
Loading

0 comments on commit d63f45f

Please sign in to comment.