]> git.proxmox.com Git - ceph.git/blame - ceph/src/rocksdb/include/rocksdb/cleanable.h
import quincy beta 17.1.0
[ceph.git] / ceph / src / rocksdb / include / rocksdb / cleanable.h
CommitLineData
7c673cae 1// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
11fdf7f2
TL
2// This source code is licensed under both the GPLv2 (found in the
3// COPYING file in the root directory) and Apache 2.0 License
4// (found in the LICENSE.Apache file in the root directory).
7c673cae
FG
5// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
6// Use of this source code is governed by a BSD-style license that can be
7// found in the LICENSE file. See the AUTHORS file for names of contributors.
7c673cae 8
11fdf7f2 9#pragma once
7c673cae 10
f67539c2
TL
11#include "rocksdb/rocksdb_namespace.h"
12
13namespace ROCKSDB_NAMESPACE {
7c673cae
FG
14
15class Cleanable {
16 public:
17 Cleanable();
11fdf7f2
TL
18 // No copy constructor and copy assignment allowed.
19 Cleanable(Cleanable&) = delete;
20 Cleanable& operator=(Cleanable&) = delete;
21
f67539c2
TL
22 ~Cleanable();
23
11fdf7f2
TL
24 // Move constructor and move assignment is allowed.
25 Cleanable(Cleanable&&);
26 Cleanable& operator=(Cleanable&&);
27
7c673cae
FG
28 // Clients are allowed to register function/arg1/arg2 triples that
29 // will be invoked when this iterator is destroyed.
30 //
31 // Note that unlike all of the preceding methods, this method is
32 // not abstract and therefore clients should not override it.
33 typedef void (*CleanupFunction)(void* arg1, void* arg2);
34 void RegisterCleanup(CleanupFunction function, void* arg1, void* arg2);
35 void DelegateCleanupsTo(Cleanable* other);
11fdf7f2 36 // DoCleanup and also resets the pointers for reuse
7c673cae
FG
37 inline void Reset() {
38 DoCleanup();
39 cleanup_.function = nullptr;
40 cleanup_.next = nullptr;
41 }
42
43 protected:
44 struct Cleanup {
45 CleanupFunction function;
46 void* arg1;
47 void* arg2;
48 Cleanup* next;
49 };
50 Cleanup cleanup_;
51 // It also becomes the owner of c
52 void RegisterCleanup(Cleanup* c);
53
54 private:
55 // Performs all the cleanups. It does not reset the pointers. Making it
56 // private
57 // to prevent misuse
58 inline void DoCleanup() {
59 if (cleanup_.function != nullptr) {
60 (*cleanup_.function)(cleanup_.arg1, cleanup_.arg2);
61 for (Cleanup* c = cleanup_.next; c != nullptr;) {
62 (*c->function)(c->arg1, c->arg2);
63 Cleanup* next = c->next;
64 delete c;
65 c = next;
66 }
67 }
68 }
69};
70
f67539c2 71} // namespace ROCKSDB_NAMESPACE