mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-12 21:30:45 +01:00
Thread safe crc32 table initialization
The lazy generated table was not entirely thread safe under the C++ (11) memory model, as pointed out by TSAN. Bug: webrtc:10627 Change-Id: I0fe1cc7c10ca218a92c710a6382b64d7827f3a6a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/136980 Reviewed-by: Amit Hilbuch <amithi@webrtc.org> Commit-Queue: Steve Anton <steveanton@webrtc.org> Cr-Commit-Position: refs/heads/master@{#27954}
This commit is contained in:
parent
9a7970de28
commit
0f1a7ba23c
1 changed files with 4 additions and 5 deletions
|
@ -19,11 +19,9 @@ namespace rtc {
|
|||
// CRC32 polynomial, in reversed form.
|
||||
// See RFC 1952, or http://en.wikipedia.org/wiki/Cyclic_redundancy_check
|
||||
static const uint32_t kCrc32Polynomial = 0xEDB88320;
|
||||
static uint32_t kCrc32Table[256] = {0};
|
||||
|
||||
static void EnsureCrc32TableInited() {
|
||||
if (kCrc32Table[arraysize(kCrc32Table) - 1])
|
||||
return; // already inited
|
||||
static uint32_t* LoadCrc32Table() {
|
||||
static uint32_t kCrc32Table[256];
|
||||
for (uint32_t i = 0; i < arraysize(kCrc32Table); ++i) {
|
||||
uint32_t c = i;
|
||||
for (size_t j = 0; j < 8; ++j) {
|
||||
|
@ -35,10 +33,11 @@ static void EnsureCrc32TableInited() {
|
|||
}
|
||||
kCrc32Table[i] = c;
|
||||
}
|
||||
return kCrc32Table;
|
||||
}
|
||||
|
||||
uint32_t UpdateCrc32(uint32_t start, const void* buf, size_t len) {
|
||||
EnsureCrc32TableInited();
|
||||
static uint32_t* kCrc32Table = LoadCrc32Table();
|
||||
|
||||
uint32_t c = start ^ 0xFFFFFFFF;
|
||||
const uint8_t* u = static_cast<const uint8_t*>(buf);
|
||||
|
|
Loading…
Reference in a new issue