]>
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> | |
f67539c2 | 16 | #include <seastar/net/packet.hh> |
11fdf7f2 TL |
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)) {} | |
11fdf7f2 TL |
30 | }; |
31 | ||
11fdf7f2 TL |
32 | class raw_seastar_local_ptr : public raw { |
33 | temporary_buffer buf; | |
34 | public: | |
35 | raw_seastar_local_ptr(temporary_buffer&& buf) | |
36 | : raw(buf.get_write(), buf.size()), buf(std::move(buf)) {} | |
11fdf7f2 TL |
37 | }; |
38 | ||
9f95a23c | 39 | inline namespace v15_2_0 { |
494da23a | 40 | |
1e59de90 | 41 | ceph::unique_leakable_ptr<buffer::raw> create(temporary_buffer&& buf) { |
9f95a23c TL |
42 | return ceph::unique_leakable_ptr<buffer::raw>( |
43 | new raw_seastar_foreign_ptr(std::move(buf))); | |
494da23a TL |
44 | } |
45 | ||
1e59de90 | 46 | ceph::unique_leakable_ptr<buffer::raw> create_local(temporary_buffer&& buf) { |
9f95a23c TL |
47 | return ceph::unique_leakable_ptr<buffer::raw>( |
48 | new raw_seastar_local_ptr(std::move(buf))); | |
11fdf7f2 TL |
49 | } |
50 | ||
9f95a23c | 51 | } // inline namespace v15_2_0 |
494da23a | 52 | |
11fdf7f2 TL |
53 | // buffer::ptr conversions |
54 | ||
55 | ptr::operator seastar::temporary_buffer<char>() & | |
56 | { | |
57 | return {c_str(), _len, seastar::make_object_deleter(*this)}; | |
58 | } | |
59 | ||
60 | ptr::operator seastar::temporary_buffer<char>() && | |
61 | { | |
62 | auto data = c_str(); | |
63 | auto length = _len; | |
64 | return {data, length, seastar::make_object_deleter(std::move(*this))}; | |
65 | } | |
66 | ||
67 | // buffer::list conversions | |
68 | ||
69 | list::operator seastar::net::packet() && | |
70 | { | |
f67539c2 | 71 | seastar::net::packet p(_num); |
11fdf7f2 TL |
72 | for (auto& ptr : _buffers) { |
73 | // append each ptr as a temporary_buffer | |
74 | p = seastar::net::packet(std::move(p), std::move(ptr)); | |
75 | } | |
76 | clear(); | |
77 | return p; | |
78 | } | |
79 | ||
80 | } // namespace ceph::buffer | |
81 | ||
82 | namespace { | |
83 | ||
84 | using ceph::buffer::raw; | |
85 | class raw_seastar_local_shared_ptr : public raw { | |
86 | temporary_buffer buf; | |
87 | public: | |
88 | raw_seastar_local_shared_ptr(temporary_buffer& buf) | |
89 | : raw(buf.get_write(), buf.size()), buf(buf.share()) {} | |
11fdf7f2 TL |
90 | }; |
91 | } | |
92 | ||
93 | buffer::ptr seastar_buffer_iterator::get_ptr(size_t len) | |
94 | { | |
9f95a23c TL |
95 | buffer::ptr p{ceph::unique_leakable_ptr<buffer::raw>( |
96 | new raw_seastar_local_shared_ptr{buf})}; | |
11fdf7f2 TL |
97 | p.set_length(len); |
98 | return p; | |
99 | } | |
100 | ||
101 | buffer::ptr const_seastar_buffer_iterator::get_ptr(size_t len) | |
102 | { | |
103 | return buffer::ptr{ buffer::copy(get_pos_add(len), len) }; | |
104 | } |