1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2017 Red Hat, Inc.
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.
15 #include <seastar/core/sharded.hh>
16 #include <seastar/net/packet.hh>
18 #include "include/buffer_raw.h"
19 #include "buffer_seastar.h"
21 using temporary_buffer
= seastar::temporary_buffer
<char>;
23 namespace ceph::buffer
{
25 class raw_seastar_foreign_ptr
: public raw
{
26 seastar::foreign_ptr
<temporary_buffer
> ptr
;
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();
35 class raw_seastar_local_ptr
: public raw
{
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();
45 inline namespace v15_2_0
{
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
)));
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
)));
57 } // inline namespace v15_2_0
59 // buffer::ptr conversions
61 ptr::operator seastar::temporary_buffer
<char>() &
63 return {c_str(), _len
, seastar::make_object_deleter(*this)};
66 ptr::operator seastar::temporary_buffer
<char>() &&
70 return {data
, length
, seastar::make_object_deleter(std::move(*this))};
73 // buffer::list conversions
75 list::operator seastar::net::packet() &&
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
));
86 } // namespace ceph::buffer
90 using ceph::buffer::raw
;
91 class raw_seastar_local_shared_ptr
: public raw
{
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();
102 buffer::ptr
seastar_buffer_iterator::get_ptr(size_t len
)
104 buffer::ptr p
{ceph::unique_leakable_ptr
<buffer::raw
>(
105 new raw_seastar_local_shared_ptr
{buf
})};
110 buffer::ptr
const_seastar_buffer_iterator::get_ptr(size_t len
)
112 return buffer::ptr
{ buffer::copy(get_pos_add(len
), len
) };