/**************************************************************************** Send all waiting data. Return TRUE on success. ****************************************************************************/ static bool conn_compression_flush(struct connection *pconn) { int compression_level = get_compression_level(); uLongf compressed_size = 12 + 1.001 * pconn->compression.queue.size; int error; Bytef compressed[compressed_size]; error = compress2(compressed, &compressed_size, pconn->compression.queue.p, pconn->compression.queue.size, compression_level); fc_assert_ret_val(error == Z_OK, FALSE); if (compressed_size + 2 < pconn->compression.queue.size) { struct data_out dout; log_compress("COMPRESS: compressed %lu bytes to %ld (level %d)", (unsigned long) pconn->compression.queue.size, compressed_size, compression_level); stat_size_uncompressed += pconn->compression.queue.size; stat_size_compressed += compressed_size; if (compressed_size <= JUMBO_BORDER) { unsigned char header[2]; log_compress("COMPRESS: sending %ld as normal", compressed_size); dio_output_init(&dout, header, sizeof(header)); dio_put_uint16(&dout, 2 + compressed_size + COMPRESSION_BORDER); connection_send_data(pconn, header, sizeof(header)); connection_send_data(pconn, compressed, compressed_size); } else { unsigned char header[6]; log_compress("COMPRESS: sending %ld as jumbo", compressed_size); dio_output_init(&dout, header, sizeof(header)); dio_put_uint16(&dout, JUMBO_SIZE); dio_put_uint32(&dout, 6 + compressed_size); connection_send_data(pconn, header, sizeof(header)); connection_send_data(pconn, compressed, compressed_size); } } else { log_compress("COMPRESS: would enlarging %lu bytes to %ld; " "sending uncompressed", (unsigned long) pconn->compression.queue.size, compressed_size); connection_send_data(pconn, pconn->compression.queue.p, pconn->compression.queue.size); stat_size_no_compression += pconn->compression.queue.size; } return pconn->used; }
/**************************************************************************** Send all waiting data. Return TRUE on success. ****************************************************************************/ static bool conn_compression_flush(struct connection *pconn) { int compression_level = get_compression_level(); uLongf compressed_size = 12 + 1.001 * pconn->compression.queue.size; int error; Bytef compressed[compressed_size]; bool jumbo; unsigned long compressed_packet_len; error = compress2(compressed, &compressed_size, pconn->compression.queue.p, pconn->compression.queue.size, compression_level); fc_assert_ret_val(error == Z_OK, FALSE); /* Compression signalling currently assumes a 2-byte packet length; if that * changes, the protocol should probably be changed */ fc_assert_ret_val(data_type_size(pconn->packet_header.length) == 2, FALSE); /* Include normal length field in decision */ jumbo = (compressed_size+2 >= JUMBO_BORDER); compressed_packet_len = compressed_size + (jumbo ? 6 : 2); if (compressed_packet_len < pconn->compression.queue.size) { struct data_out dout; log_compress("COMPRESS: compressed %lu bytes to %ld (level %d)", (unsigned long) pconn->compression.queue.size, compressed_size, compression_level); stat_size_uncompressed += pconn->compression.queue.size; stat_size_compressed += compressed_size; if (!jumbo) { unsigned char header[2]; FC_STATIC_ASSERT(COMPRESSION_BORDER > MAX_LEN_PACKET, uncompressed_compressed_packet_len_overlap); log_compress("COMPRESS: sending %ld as normal", compressed_size); dio_output_init(&dout, header, sizeof(header)); dio_put_uint16(&dout, 2 + compressed_size + COMPRESSION_BORDER); connection_send_data(pconn, header, sizeof(header)); connection_send_data(pconn, compressed, compressed_size); } else { unsigned char header[6]; FC_STATIC_ASSERT(JUMBO_SIZE >= JUMBO_BORDER+COMPRESSION_BORDER, compressed_normal_jumbo_packet_len_overlap); log_compress("COMPRESS: sending %ld as jumbo", compressed_size); dio_output_init(&dout, header, sizeof(header)); dio_put_uint16(&dout, JUMBO_SIZE); dio_put_uint32(&dout, 6 + compressed_size); connection_send_data(pconn, header, sizeof(header)); connection_send_data(pconn, compressed, compressed_size); } } else { log_compress("COMPRESS: would enlarge %lu bytes to %ld; " "sending uncompressed", (unsigned long) pconn->compression.queue.size, compressed_packet_len); connection_send_data(pconn, pconn->compression.queue.p, pconn->compression.queue.size); stat_size_no_compression += pconn->compression.queue.size; } return pconn->used; }