Files
swift-mirror/stdlib/public/stubs/ThreadLocalStorage.cpp
Alastair Houghton 6d1b6dbd1c [Threading] Fix the Linux build.
A few fixes specifically for the Linux build.

rdar://90776105
2022-06-07 07:39:52 +01:00

71 lines
1.8 KiB
C++

//===--- ThreadLocalStorage.cpp -------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#include <cstring>
#include "SwiftShims/ThreadLocalStorage.h"
#include "swift/Threading/ThreadLocalStorage.h"
#include "swift/Runtime/Debug.h"
SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_API
void _stdlib_destroyTLS(void *);
SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_API
void *_stdlib_createTLS(void);
SWIFT_RUNTIME_STDLIB_INTERNAL
void *
_swift_stdlib_threadLocalStorageGet(void) {
#if SWIFT_THREADING_NONE
// If there's no threading, we can just keep a static variable.
static void *value = _stdlib_createTLS();
return value;
#elif SWIFT_THREADING_USE_RESERVED_TLS_KEYS
// If we have reserved keys, use those
void *value = swift::tls_get(SWIFT_STDLIB_TLS_KEY);
if (value)
return value;
static swift::once_t token;
swift::tls_init_once(token, SWIFT_STDLIB_TLS_KEY, [](void *pointer) {
_stdlib_destroyTLS(pointer);
});
value = _stdlib_createTLS();
swift::tls_set(SWIFT_STDLIB_TLS_KEY, value);
return value;
#else // Threaded, but not using reserved keys
// Register a key and use it
static swift::tls_key key;
static swift::once_t token;
swift::tls_alloc_once(token, key, [](void *pointer) {
_stdlib_destroyTLS(pointer);
});
void *value = swift::tls_get(key);
if (!value) {
value = _stdlib_createTLS();
swift::tls_set(key, value);
}
return value;
#endif
}