         }
     }
 
-    func preconditionInEventLoop(file: StaticString, line: UInt) {
+    public func preconditionInEventLoop(_ message: @autoclosure() -> String, file: StaticString, line: UInt) {
+        /// `dispatchPrecondition(condition:)` is unable to accept an error message for the failure case, and we
+        /// can not safely rely on `self.inEventLoop` in this implementation. Any message provided by the caller
+        /// must therefore be ignored. We do not foresee ever being able to fix this behavior, given the design
+        /// constraints of the respective subsystems.
         dispatchPrecondition(condition: .onQueue(self.loop))
+    }
+
+    public func preconditionNotInEventLoop(_ message: @autoclosure() -> String = "", file: StaticString, line: UInt) {
+        /// As in our counterpart method, we can't do anything with the `message` parameter. See above for details.
+        dispatchPrecondition(condition: .notOnQueue(self.loop))
     }
 }
 

    /// implementation *could* return `true`, but this version will be unable to prove that and will return `false`.
    /// If you need to write an assertion about being in the event loop that must be correct, use SwiftNIO 1.11 or
    /// later and call `preconditionInEventLoop` and `assertInEventLoop`.
    public var inEventLoop: Bool {
        return DispatchQueue.getSpecific(key: self.inQueueKey) == self.loopID
    }

    case closed
}

@available(OSX 10.14, iOS 12.0, tvOS 12.0, watchOS 6.0, *)
internal class NIOTSEventLoop: QoSEventLoop {
    private let loop: DispatchQueue
