Skip to content

Commit

Permalink
Merge pull request #1429 from ahoppen/atomics_on_heap
Browse files Browse the repository at this point in the history
Heap allocate our atomics
  • Loading branch information
ahoppen committed Jun 6, 2024
2 parents da84c30 + 556fd33 commit efd7f99
Show file tree
Hide file tree
Showing 16 changed files with 107 additions and 76 deletions.
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 @@ -194,7 +193,6 @@ let package = Package(
.target(
name: "SemanticIndex",
dependencies: [
"CAtomics",
"LanguageServerProtocol",
"LSPLogging",
"SKCore",
Expand All @@ -219,7 +217,6 @@ let package = Package(
name: "SKCore",
dependencies: [
"BuildServerProtocol",
"CAtomics",
"LanguageServerProtocol",
"LanguageServerProtocolJSONRPC",
"LSPLogging",
Expand Down Expand Up @@ -248,10 +245,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 @@ -351,7 +349,6 @@ let package = Package(
name: "SourceKitLSP",
dependencies: [
"BuildServerProtocol",
"CAtomics",
"LanguageServerProtocol",
"LanguageServerProtocolJSONRPC",
"LSPLogging",
Expand Down Expand Up @@ -379,7 +376,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
2 changes: 1 addition & 1 deletion Sources/InProcessClient/InProcessSourceKitLSPClient.swift
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

0 comments on commit efd7f99

Please sign in to comment.