diff options
author | Baptiste Daroussin <bapt@FreeBSD.org> | 2017-04-15 19:47:16 +0000 |
---|---|---|
committer | Baptiste Daroussin <bapt@FreeBSD.org> | 2017-04-15 19:47:16 +0000 |
commit | a19eddc34b6e8db043dbf6180c90e9bbe531dc03 (patch) | |
tree | c1a7236f0695eb15e345486c8c85a1889b661ce8 /contrib/pzstd/ErrorHolder.h |
Diffstat (limited to 'contrib/pzstd/ErrorHolder.h')
-rw-r--r-- | contrib/pzstd/ErrorHolder.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/contrib/pzstd/ErrorHolder.h b/contrib/pzstd/ErrorHolder.h new file mode 100644 index 000000000000..188badcadfd3 --- /dev/null +++ b/contrib/pzstd/ErrorHolder.h @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +#pragma once + +#include <atomic> +#include <cassert> +#include <stdexcept> +#include <string> + +namespace pzstd { + +// Coordinates graceful shutdown of the pzstd pipeline +class ErrorHolder { + std::atomic<bool> error_; + std::string message_; + + public: + ErrorHolder() : error_(false) {} + + bool hasError() noexcept { + return error_.load(); + } + + void setError(std::string message) noexcept { + // Given multiple possibly concurrent calls, exactly one will ever succeed. + bool expected = false; + if (error_.compare_exchange_strong(expected, true)) { + message_ = std::move(message); + } + } + + bool check(bool predicate, std::string message) noexcept { + if (!predicate) { + setError(std::move(message)); + } + return !hasError(); + } + + std::string getError() noexcept { + error_.store(false); + return std::move(message_); + } + + ~ErrorHolder() { + assert(!hasError()); + } +}; +} |