Seastar
High performance C++ framework for concurrent servers
defer.hh
1 /*
2  * This file is open source software, licensed to you under the terms
3  * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4  * distributed with this work for additional information regarding copyright
5  * ownership. You may not use this file except in compliance with the License.
6  *
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing,
12  * software distributed under the License is distributed on an
13  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14  * KIND, either express or implied. See the License for the
15  * specific language governing permissions and limitations
16  * under the License.
17  */
18 /*
19  * Copyright (C) 2014 Cloudius Systems, Ltd.
20  */
21 
22 #pragma once
23 
24 #include "modules.hh"
25 #ifndef SEASTAR_MODULE
26 #include <type_traits>
27 #include <utility>
28 #endif
29 #include <seastar/util/modules.hh>
30 #include <seastar/util/concepts.hh>
31 
32 
33 #ifdef SEASTAR_DEFERRED_ACTION_REQUIRE_NOEXCEPT
34 #define SEASTAR_DEFERRED_ACTION_NOEXCEPT noexcept
35 #else
36 #define SEASTAR_DEFERRED_ACTION_NOEXCEPT
37 #endif
38 
39 SEASTAR_CONCEPT(
40 template <typename Func>
41 concept deferrable_action = requires (Func func) {
42  { func() } SEASTAR_DEFERRED_ACTION_NOEXCEPT -> std::same_as<void>;
43 };
44 )
45 
46 namespace seastar {
47 
48 template <typename Func>
49 SEASTAR_CONCEPT( requires deferrable_action<Func> )
50 class [[nodiscard]] deferred_action {
51  Func _func;
52  bool _cancelled = false;
53 public:
54  static_assert(std::is_nothrow_move_constructible_v<Func>, "Func(Func&&) must be noexcept");
55  deferred_action(Func&& func) noexcept : _func(std::move(func)) {}
56  deferred_action(deferred_action&& o) noexcept : _func(std::move(o._func)), _cancelled(o._cancelled) {
57  o._cancelled = true;
58  }
59  deferred_action& operator=(deferred_action&& o) noexcept {
60  if (this != &o) {
61  this->~deferred_action();
62  new (this) deferred_action(std::move(o));
63  }
64  return *this;
65  }
66  deferred_action(const deferred_action&) = delete;
67  ~deferred_action() { if (!_cancelled) { _func(); }; }
68  void cancel() { _cancelled = true; }
69 };
70 
71 SEASTAR_MODULE_EXPORT
72 template <typename Func>
73 SEASTAR_CONCEPT( requires deferrable_action<Func> )
74 inline
76 defer(Func&& func) {
77  return deferred_action<Func>(std::forward<Func>(func));
78 }
79 
80 }
Definition: defer.hh:50
Seastar API namespace.
Definition: abort_on_ebadf.hh:26