forked from OSchip/llvm-project
[mlir] Move diagnostic handlers instead of copying
This also allows using unique_ptr instead of shared_ptr for the CAPI user data. NFCI.
This commit is contained in:
parent
c312f02594
commit
295d032762
|
@ -417,7 +417,7 @@ public:
|
|||
/// The handler type for MLIR diagnostics. This function takes a diagnostic as
|
||||
/// input, and returns success if the handler has fully processed this
|
||||
/// diagnostic. Returns failure otherwise.
|
||||
using HandlerTy = std::function<LogicalResult(Diagnostic &)>;
|
||||
using HandlerTy = llvm::unique_function<LogicalResult(Diagnostic &)>;
|
||||
|
||||
/// A handle to a specific registered handler object.
|
||||
using HandlerID = uint64_t;
|
||||
|
@ -427,7 +427,7 @@ public:
|
|||
/// handlers will process diagnostics first. This function returns a unique
|
||||
/// identifier for the registered handler, which can be used to unregister
|
||||
/// this handler at a later time.
|
||||
HandlerID registerHandler(const HandlerTy &handler);
|
||||
HandlerID registerHandler(HandlerTy handler);
|
||||
|
||||
/// Set the diagnostic handler with a function that returns void. This is a
|
||||
/// convenient wrapper for handlers that always completely process the given
|
||||
|
|
|
@ -59,11 +59,12 @@ MlirDiagnosticHandlerID mlirContextAttachDiagnosticHandler(
|
|||
assert(handler && "unexpected null diagnostic handler");
|
||||
if (deleteUserData == nullptr)
|
||||
deleteUserData = deleteUserDataNoop;
|
||||
std::shared_ptr<void> sharedUserData(userData, deleteUserData);
|
||||
DiagnosticEngine::HandlerID id =
|
||||
unwrap(context)->getDiagEngine().registerHandler(
|
||||
[handler, sharedUserData](Diagnostic &diagnostic) {
|
||||
return unwrap(handler(wrap(diagnostic), sharedUserData.get()));
|
||||
[handler,
|
||||
ownedUserData = std::unique_ptr<void, decltype(deleteUserData)>(
|
||||
userData, deleteUserData)](Diagnostic &diagnostic) {
|
||||
return unwrap(handler(wrap(diagnostic), ownedUserData.get()));
|
||||
});
|
||||
return static_cast<MlirDiagnosticHandlerID>(id);
|
||||
}
|
||||
|
|
|
@ -272,10 +272,10 @@ DiagnosticEngine::~DiagnosticEngine() = default;
|
|||
/// Register a new handler for diagnostics to the engine. This function returns
|
||||
/// a unique identifier for the registered handler, which can be used to
|
||||
/// unregister this handler at a later time.
|
||||
auto DiagnosticEngine::registerHandler(const HandlerTy &handler) -> HandlerID {
|
||||
auto DiagnosticEngine::registerHandler(HandlerTy handler) -> HandlerID {
|
||||
llvm::sys::SmartScopedLock<true> lock(impl->mutex);
|
||||
auto uniqueID = impl->uniqueHandlerId++;
|
||||
impl->handlers.insert({uniqueID, handler});
|
||||
impl->handlers.insert({uniqueID, std::move(handler)});
|
||||
return uniqueID;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue