]> git.proxmox.com Git - ceph.git/blob - ceph/src/common/buffer_seastar.cc
import ceph quincy 17.2.4
[ceph.git] / ceph / src / common / buffer_seastar.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2017 Red Hat, Inc.
7 *
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
12 *
13 */
14
15 #include <seastar/core/sharded.hh>
16 #include <seastar/net/packet.hh>
17
18 #include "include/buffer_raw.h"
19 #include "buffer_seastar.h"
20
21 using temporary_buffer = seastar::temporary_buffer<char>;
22
23 namespace ceph::buffer {
24
25 class raw_seastar_foreign_ptr : public raw {
26 seastar::foreign_ptr<temporary_buffer> ptr;
27 public:
28 raw_seastar_foreign_ptr(temporary_buffer&& buf)
29 : raw(buf.get_write(), buf.size()), ptr(std::move(buf)) {}
30 raw* clone_empty() override {
31 return create(len).release();
32 }
33 };
34
35 class raw_seastar_local_ptr : public raw {
36 temporary_buffer buf;
37 public:
38 raw_seastar_local_ptr(temporary_buffer&& buf)
39 : raw(buf.get_write(), buf.size()), buf(std::move(buf)) {}
40 raw* clone_empty() override {
41 return create(len).release();
42 }
43 };
44
45 inline namespace v15_2_0 {
46
47 ceph::unique_leakable_ptr<buffer::raw> create_foreign(temporary_buffer&& buf) {
48 return ceph::unique_leakable_ptr<buffer::raw>(
49 new raw_seastar_foreign_ptr(std::move(buf)));
50 }
51
52 ceph::unique_leakable_ptr<buffer::raw> create(temporary_buffer&& buf) {
53 return ceph::unique_leakable_ptr<buffer::raw>(
54 new raw_seastar_local_ptr(std::move(buf)));
55 }
56
57 } // inline namespace v15_2_0
58
59 // buffer::ptr conversions
60
61 ptr::operator seastar::temporary_buffer<char>() &
62 {
63 return {c_str(), _len, seastar::make_object_deleter(*this)};
64 }
65
66 ptr::operator seastar::temporary_buffer<char>() &&
67 {
68 auto data = c_str();
69 auto length = _len;
70 return {data, length, seastar::make_object_deleter(std::move(*this))};
71 }
72
73 // buffer::list conversions
74
75 list::operator seastar::net::packet() &&
76 {
77 seastar::net::packet p(_num);
78 for (auto& ptr : _buffers) {
79 // append each ptr as a temporary_buffer
80 p = seastar::net::packet(std::move(p), std::move(ptr));
81 }
82 clear();
83 return p;
84 }
85
86 } // namespace ceph::buffer
87
88 namespace {
89
90 using ceph::buffer::raw;
91 class raw_seastar_local_shared_ptr : public raw {
92 temporary_buffer buf;
93 public:
94 raw_seastar_local_shared_ptr(temporary_buffer& buf)
95 : raw(buf.get_write(), buf.size()), buf(buf.share()) {}
96 raw* clone_empty() override {
97 return ceph::buffer::create(len).release();
98 }
99 };
100 }
101
102 buffer::ptr seastar_buffer_iterator::get_ptr(size_t len)
103 {
104 buffer::ptr p{ceph::unique_leakable_ptr<buffer::raw>(
105 new raw_seastar_local_shared_ptr{buf})};
106 p.set_length(len);
107 return p;
108 }
109
110 buffer::ptr const_seastar_buffer_iterator::get_ptr(size_t len)
111 {
112 return buffer::ptr{ buffer::copy(get_pos_add(len), len) };
113 }