blob: ed80c3130e10c87be24a8376a4ed8079c3eea34b [file] [log] [blame]
/**
* Copyright 2016 Yahoo Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ChecksumProvider.h"
#include <assert.h>
#include "crc32c_sse42.h"
#include "crc32c_sw.h"
namespace pulsar {
bool isCrc32cSupported = crc32cSupported();
bool crc32cSupported() {
return crc32c_initialize();
}
/**
* computes crc32c checksum: uses sse4.2 hardware-instruction to compute crc32c if machine supports else it computes using sw algo
* @param
* previousChecksum = in case of incremental-checksum-computation pass previous computed else pass 0 in other case.
* data = for which checksum will be computed
* length = length of data from offset
*/
uint32_t computeChecksum(uint32_t previousChecksum, const void * data, int length) {
if (isCrc32cSupported) {
return crc32cHw(previousChecksum, data, length);
} else {
return crc32cSw(previousChecksum, data, length);
}
}
/**
* Computes crc32c using hardware sse4.2 instruction
*/
uint32_t crc32cHw(uint32_t previousChecksum, const void * data, int length) {
assert(isCrc32cSupported);
return crc32c(previousChecksum, data, length, 0);
}
/**
* Computes crc32c using sw crc-table algo
*/
uint32_t crc32cSw(uint32_t previousChecksum, const void * data, int length) {
return crc32c_sw(previousChecksum, data, length);
}
}