/* * Copyright 2024, gRPC Authors All rights reserved. * * 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. */ import Atomics /// An ID which is unique within this process. struct ProcessUniqueID: Hashable, Sendable, CustomStringConvertible { private static let source = ManagedAtomic(UInt64(0)) private let rawValue: UInt64 init() { self.rawValue = Self.source.loadThenWrappingIncrement(ordering: .relaxed) } var description: String { String(describing: self.rawValue) } } /// A process-unique ID for a subchannel. package struct SubchannelID: Hashable, Sendable, CustomStringConvertible { private let id = ProcessUniqueID() package init() {} package var description: String { "subchan_\(self.id)" } } /// A process-unique ID for a load-balancer. struct LoadBalancerID: Hashable, Sendable, CustomStringConvertible { private let id = ProcessUniqueID() var description: String { "lb_\(self.id)" } } /// A process-unique ID for an entry in a queue. struct QueueEntryID: Hashable, Sendable, CustomStringConvertible { private let id = ProcessUniqueID() var description: String { "q_entry_\(self.id)" } }