]>
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 | ||
494da23a TL |
44 | inline namespace v14_2_0 { |
45 | ||
46 | raw* create_foreign(temporary_buffer&& buf) { | |
47 | return new raw_seastar_foreign_ptr(std::move(buf)); | |
48 | } | |
49 | ||
11fdf7f2 TL |
50 | raw* create(temporary_buffer&& buf) { |
51 | return new raw_seastar_local_ptr(std::move(buf)); | |
52 | } | |
53 | ||
494da23a TL |
54 | } // inline namespace v14_2_0 |
55 | ||
11fdf7f2 TL |
56 | // buffer::ptr conversions |
57 | ||
58 | ptr::operator seastar::temporary_buffer<char>() & | |
59 | { | |
60 | return {c_str(), _len, seastar::make_object_deleter(*this)}; | |
61 | } | |
62 | ||
63 | ptr::operator seastar::temporary_buffer<char>() && | |
64 | { | |
65 | auto data = c_str(); | |
66 | auto length = _len; | |
67 | return {data, length, seastar::make_object_deleter(std::move(*this))}; | |
68 | } | |
69 | ||
70 | // buffer::list conversions | |
71 | ||
72 | list::operator seastar::net::packet() && | |
73 | { | |
74 | seastar::net::packet p; | |
75 | p.reserve(_buffers.size()); | |
76 | for (auto& ptr : _buffers) { | |
77 | // append each ptr as a temporary_buffer | |
78 | p = seastar::net::packet(std::move(p), std::move(ptr)); | |
79 | } | |
80 | clear(); | |
81 | return p; | |
82 | } | |
83 | ||
84 | } // namespace ceph::buffer | |
85 | ||
86 | namespace { | |
87 | ||
88 | using ceph::buffer::raw; | |
89 | class raw_seastar_local_shared_ptr : public raw { | |
90 | temporary_buffer buf; | |
91 | public: | |
92 | raw_seastar_local_shared_ptr(temporary_buffer& buf) | |
93 | : raw(buf.get_write(), buf.size()), buf(buf.share()) {} | |
94 | raw* clone_empty() override { | |
95 | return ceph::buffer::create(len).release(); | |
96 | } | |
97 | }; | |
98 | } | |
99 | ||
100 | buffer::ptr seastar_buffer_iterator::get_ptr(size_t len) | |
101 | { | |
102 | buffer::raw* r = new raw_seastar_local_shared_ptr{buf}; | |
103 | buffer::ptr p{r}; | |
104 | p.set_length(len); | |
105 | return p; | |
106 | } | |
107 | ||
108 | buffer::ptr const_seastar_buffer_iterator::get_ptr(size_t len) | |
109 | { | |
110 | return buffer::ptr{ buffer::copy(get_pos_add(len), len) }; | |
111 | } |