Skip to content

Heap allocate our atomics #1429

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,6 @@ let package = Package(
.target(
name: "InProcessClient",
dependencies: [
"CAtomics",
"LanguageServerProtocol",
"LSPLogging",
"SKCore",
Expand Down Expand Up @@ -193,7 +192,6 @@ let package = Package(
.target(
name: "SemanticIndex",
dependencies: [
"CAtomics",
"LanguageServerProtocol",
"LSPLogging",
"SKCore",
Expand All @@ -218,7 +216,6 @@ let package = Package(
name: "SKCore",
dependencies: [
"BuildServerProtocol",
"CAtomics",
"LanguageServerProtocol",
"LanguageServerProtocolJSONRPC",
"LSPLogging",
Expand Down Expand Up @@ -247,10 +244,11 @@ let package = Package(
.target(
name: "SKSupport",
dependencies: [
.product(name: "SwiftToolsSupport-auto", package: "swift-tools-support-core"),
"CAtomics",
"LanguageServerProtocol",
"LSPLogging",
"SwiftExtensions",
.product(name: "SwiftToolsSupport-auto", package: "swift-tools-support-core"),
],
exclude: ["CMakeLists.txt"],
swiftSettings: [.enableExperimentalFeature("StrictConcurrency")]
Expand Down Expand Up @@ -350,7 +348,6 @@ let package = Package(
name: "SourceKitLSP",
dependencies: [
"BuildServerProtocol",
"CAtomics",
"LanguageServerProtocol",
"LanguageServerProtocolJSONRPC",
"LSPLogging",
Expand Down Expand Up @@ -378,7 +375,6 @@ let package = Package(
name: "SourceKitLSPTests",
dependencies: [
"BuildServerProtocol",
"CAtomics",
"LSPLogging",
"LSPTestSupport",
"LanguageServerProtocol",
Expand Down
71 changes: 12 additions & 59 deletions Sources/CAtomics/include/CAtomics.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,79 +16,32 @@
#include <stdbool.h>
#include <stdint.h>
#include <sys/types.h>

// MARK: - AtomicBool

typedef struct {
_Atomic(bool) value;
} AtomicBool;

__attribute__((swift_name("AtomicBool.init(initialValue:)")))
static inline AtomicBool atomic_bool_create(bool initialValue) {
AtomicBool atomic;
atomic.value = initialValue;
return atomic;
}

__attribute__((swift_name("getter:AtomicBool.value(self:)")))
static inline bool atomic_bool_get(AtomicBool *atomic) {
return atomic->value;
}

__attribute__((swift_name("setter:AtomicBool.value(self:_:)")))
static inline void atomic_bool_set(AtomicBool *atomic, bool newValue) {
atomic->value = newValue;
}

// MARK: - AtomicUInt8
#include <stdlib.h>

typedef struct {
_Atomic(uint8_t) value;
} AtomicUInt8;
_Atomic(uint32_t) value;
} CAtomicUInt32;

__attribute__((swift_name("AtomicUInt8.init(initialValue:)")))
static inline AtomicUInt8 atomic_uint8_create(uint8_t initialValue) {
AtomicUInt8 atomic;
atomic.value = initialValue;
static inline CAtomicUInt32 *_Nonnull atomic_uint32_create(uint32_t initialValue) {
CAtomicUInt32 *atomic = malloc(sizeof(CAtomicUInt32));
atomic->value = initialValue;
return atomic;
}

__attribute__((swift_name("getter:AtomicUInt8.value(self:)")))
static inline uint8_t atomic_uint8_get(AtomicUInt8 *atomic) {
static inline uint32_t atomic_uint32_get(CAtomicUInt32 *_Nonnull atomic) {
return atomic->value;
}

__attribute__((swift_name("setter:AtomicUInt8.value(self:_:)")))
static inline void atomic_uint8_set(AtomicUInt8 *atomic, uint8_t newValue) {
static inline void atomic_uint32_set(CAtomicUInt32 *_Nonnull atomic, uint32_t newValue) {
atomic->value = newValue;
}

// MARK: AtomicInt

typedef struct {
_Atomic(int) value;
} AtomicUInt32;

__attribute__((swift_name("AtomicUInt32.init(initialValue:)")))
static inline AtomicUInt32 atomic_int_create(uint32_t initialValue) {
AtomicUInt32 atomic;
atomic.value = initialValue;
return atomic;
}

__attribute__((swift_name("getter:AtomicUInt32.value(self:)")))
static inline uint32_t atomic_int_get(AtomicUInt32 *atomic) {
return atomic->value;
}

__attribute__((swift_name("setter:AtomicUInt32.value(self:_:)")))
static inline void atomic_uint32_set(AtomicUInt32 *atomic, uint32_t newValue) {
atomic->value = newValue;
static inline uint32_t atomic_uint32_fetch_and_increment(CAtomicUInt32 *_Nonnull atomic) {
return atomic->value++;
}

__attribute__((swift_name("AtomicUInt32.fetchAndIncrement(self:)")))
static inline uint32_t atomic_uint32_fetch_and_increment(AtomicUInt32 *atomic) {
return atomic->value++;
static inline void atomic_uint32_destroy(CAtomicUInt32 *_Nonnull atomic) {
free(atomic);
}

#endif // SOURCEKITLSP_CATOMICS_H
1 change: 0 additions & 1 deletion Sources/InProcessClient/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ set_target_properties(InProcessClient PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_Swift_MODULE_DIRECTORY})

target_link_libraries(InProcessClient PUBLIC
CAtomics
LanguageServerProtocol
LSPLogging
SKCore
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
//
//===----------------------------------------------------------------------===//

import CAtomics
import LanguageServerProtocol
import SKCore
import SKSupport
import SourceKitLSP

/// Launches a `SourceKitLSPServer` in-process and allows sending messages to it.
Expand Down
1 change: 0 additions & 1 deletion Sources/SKCore/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ set_target_properties(SKCore PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_Swift_MODULE_DIRECTORY})
target_link_libraries(SKCore PUBLIC
BuildServerProtocol
CAtomics
LanguageServerProtocol
LanguageServerProtocolJSONRPC
LSPLogging
Expand Down
1 change: 0 additions & 1 deletion Sources/SKCore/TaskScheduler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
//
//===----------------------------------------------------------------------===//

import CAtomics
import Foundation
import LSPLogging
import SKSupport
Expand Down
84 changes: 84 additions & 0 deletions Sources/SKSupport/Atomics.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2024 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
//
//===----------------------------------------------------------------------===//

import CAtomics

#if compiler(>=6.2)
#warning("We should be able to use atomics in the stdlib when we raise the deployment target to require Swift 6")
#endif

public class AtomicBool {
private let atomic: UnsafeMutablePointer<CAtomicUInt32>

public init(initialValue: Bool) {
self.atomic = atomic_uint32_create(initialValue ? 1 : 0)
}

deinit {
atomic_uint32_destroy(atomic)
}

public var value: Bool {
get {
atomic_uint32_get(atomic) != 0
}
set {
atomic_uint32_set(atomic, newValue ? 1 : 0)
}
}
}

public class AtomicUInt8 {
private let atomic: UnsafeMutablePointer<CAtomicUInt32>

public init(initialValue: UInt8) {
self.atomic = atomic_uint32_create(UInt32(initialValue))
}

deinit {
atomic_uint32_destroy(atomic)
}

public var value: UInt8 {
get {
UInt8(atomic_uint32_get(atomic))
}
set {
atomic_uint32_set(atomic, UInt32(newValue))
}
}
}

public class AtomicUInt32 {
private let atomic: UnsafeMutablePointer<CAtomicUInt32>

public init(initialValue: UInt32) {
self.atomic = atomic_uint32_create(initialValue)
}

public var value: UInt32 {
get {
atomic_uint32_get(atomic)
}
set {
atomic_uint32_set(atomic, newValue)
}
}

deinit {
atomic_uint32_destroy(atomic)
}

public func fetchAndIncrement() -> UInt32 {
return atomic_uint32_fetch_and_increment(atomic)
}
}
4 changes: 4 additions & 0 deletions Sources/SKSupport/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@

add_library(SKSupport STATIC
Atomics.swift
BuildConfiguration.swift
ByteString.swift
Connection+Send.swift
Expand All @@ -17,6 +18,9 @@ add_library(SKSupport STATIC
)
set_target_properties(SKSupport PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_Swift_MODULE_DIRECTORY})
target_link_libraries(SKSupport PUBLIC
CAtomics
)
target_link_libraries(SKSupport PRIVATE
LanguageServerProtocol
LSPLogging
Expand Down
1 change: 0 additions & 1 deletion Sources/SKSwiftPMWorkspace/SwiftPMBuildSystem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import Basics
import Build
import BuildServerProtocol
import CAtomics
import Dispatch
import Foundation
import LSPLogging
Expand Down
1 change: 0 additions & 1 deletion Sources/SKTestSupport/TestSourceKitLSPClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
//
//===----------------------------------------------------------------------===//

import CAtomics
import Foundation
import InProcessClient
import LSPTestSupport
Expand Down
1 change: 1 addition & 0 deletions Sources/SemanticIndex/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ add_library(SemanticIndex STATIC
set_target_properties(SemanticIndex PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_Swift_MODULE_DIRECTORY})
target_link_libraries(SemanticIndex PRIVATE
LanguageServerProtocol
LSPLogging
SKCore
SwiftExtensions
Expand Down
2 changes: 1 addition & 1 deletion Sources/SemanticIndex/PreparationTaskDescription.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@
//
//===----------------------------------------------------------------------===//

import CAtomics
import Foundation
import LSPLogging
import LanguageServerProtocol
import SKCore
import SKSupport

import struct TSCBasic.AbsolutePath
import class TSCBasic.Process
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
//
//===----------------------------------------------------------------------===//

import CAtomics
import Foundation
import LSPLogging
import LanguageServerProtocol
Expand Down
1 change: 0 additions & 1 deletion Sources/SourceKitLSP/SourceKitLSPServer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
//===----------------------------------------------------------------------===//

import BuildServerProtocol
import CAtomics
import Dispatch
import Foundation
import IndexStoreDB
Expand Down
2 changes: 1 addition & 1 deletion Tests/SourceKitDTests/SourceKitDRegistryTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
//
//===----------------------------------------------------------------------===//

import CAtomics
import LSPTestSupport
import SKSupport
import SourceKitD
import TSCBasic
import XCTest
Expand Down
2 changes: 1 addition & 1 deletion Tests/SourceKitLSPTests/PullDiagnosticsTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
//
//===----------------------------------------------------------------------===//

import CAtomics
import LSPTestSupport
import LanguageServerProtocol
import SKSupport
import SKTestSupport
import SourceKitLSP
import XCTest
Expand Down