// Licensed to the LF AI & Data foundation under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you 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. #pragma once #include #include #include "log/Log.h" namespace milvus { template class MilvusPromise : public folly::Promise { public: MilvusPromise() : folly::Promise() { } explicit MilvusPromise(const std::string& context) : folly::Promise(), context_(context) { } MilvusPromise(folly::futures::detail::EmptyConstruct, const std::string& context) noexcept : folly::Promise(folly::Promise::makeEmpty()), context_(context) { } ~MilvusPromise() { if (!this->isFulfilled()) { LOG_WARN( "PROMISE: Unfulfilled promise is being deleted. Context: {}", context_); } } explicit MilvusPromise(MilvusPromise&& other) : folly::Promise(std::move(other)), context_(std::move(other.context_)) { } MilvusPromise& operator=(MilvusPromise&& other) noexcept { folly::Promise::operator=(std::move(other)); context_ = std::move(other.context_); return *this; } static MilvusPromise MakeEmpty(const std::string& context = "") noexcept { return MilvusPromise(folly::futures::detail::EmptyConstruct{}, context); } private: /// Optional parameter to understand where this promise was created. std::string context_; }; using ContinuePromise = MilvusPromise; using ContinueFuture = folly::SemiFuture; } // namespace milvus