]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
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 | ||
17 | #include "include/buffer_raw.h" | |
18 | #include "buffer_seastar.h" | |
19 | ||
20 | using temporary_buffer = seastar::temporary_buffer<char>; | |
21 | ||
22 | namespace ceph::buffer { | |
23 | ||
24 | class raw_seastar_foreign_ptr : public raw { | |
25 | seastar::foreign_ptr<temporary_buffer> ptr; | |
26 | public: | |
27 | raw_seastar_foreign_ptr(temporary_buffer&& buf) | |
28 | : raw(buf.get_write(), buf.size()), ptr(std::move(buf)) {} | |
29 | raw* clone_empty() override { | |
30 | return create(len).release(); | |
31 | } | |
32 | }; | |
33 | ||
11fdf7f2 TL |
34 | class raw_seastar_local_ptr : public raw { |
35 | temporary_buffer buf; | |
36 | public: | |
37 | raw_seastar_local_ptr(temporary_buffer&& buf) | |
38 | : raw(buf.get_write(), buf.size()), buf(std::move(buf)) {} | |
39 | raw* clone_empty() override { | |
40 | return create(len).release(); | |
41 | } | |
42 | }; | |
43 | ||
9f95a23c | 44 | inline namespace v15_2_0 { |
494da23a | 45 | |
9f95a23c TL |
46 | ceph::unique_leakable_ptr<buffer::raw> create_foreign(temporary_buffer&& buf) { |
47 | return ceph::unique_leakable_ptr<buffer::raw>( | |
48 | new raw_seastar_foreign_ptr(std::move(buf))); | |
494da23a TL |
49 | } |
50 | ||
9f95a23c TL |
51 | ceph::unique_leakable_ptr<buffer::raw> create(temporary_buffer&& buf) { |
52 | return ceph::unique_leakable_ptr<buffer::raw>( | |
53 | new raw_seastar_local_ptr(std::move(buf))); | |
11fdf7f2 TL |
54 | } |
55 | ||
9f95a23c | 56 | } // inline namespace v15_2_0 |
494da23a | 57 | |
11fdf7f2 TL |
58 | // buffer::ptr conversions |
59 | ||
60 | ptr::operator seastar::temporary_buffer<char>() & | |
61 | { | |
62 | return {c_str(), _len, seastar::make_object_deleter(*this)}; | |
63 | } | |
64 | ||
65 | ptr::operator seastar::temporary_buffer<char>() && | |
66 | { | |
67 | auto data = c_str(); | |
68 | auto length = _len; | |
69 | return {data, length, seastar::make_object_deleter(std::move(*this))}; | |
70 | } | |
71 | ||
72 | // buffer::list conversions | |
73 | ||
74 | list::operator seastar::net::packet() && | |
75 | { | |
76 | seastar::net::packet p; | |
9f95a23c | 77 | p.reserve(_num); |
11fdf7f2 TL |
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 | { | |
9f95a23c TL |
104 | buffer::ptr p{ceph::unique_leakable_ptr<buffer::raw>( |
105 | new raw_seastar_local_shared_ptr{buf})}; | |
11fdf7f2 TL |
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 | } |