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
)) {}
32 class raw_seastar_local_ptr
: public raw
{
35 raw_seastar_local_ptr(temporary_buffer
&& buf
)
36 : raw(buf
.get_write(), buf
.size()), buf(std::move(buf
)) {}
39 inline namespace v15_2_0
{
41 ceph::unique_leakable_ptr
<buffer::raw
> create(temporary_buffer
&& buf
) {
42 return ceph::unique_leakable_ptr
<buffer::raw
>(
43 new raw_seastar_foreign_ptr(std::move(buf
)));
46 ceph::unique_leakable_ptr
<buffer::raw
> create_local(temporary_buffer
&& buf
) {
47 return ceph::unique_leakable_ptr
<buffer::raw
>(
48 new raw_seastar_local_ptr(std::move(buf
)));
51 } // inline namespace v15_2_0
53 // buffer::ptr conversions
55 ptr::operator seastar::temporary_buffer
<char>() &
57 return {c_str(), _len
, seastar::make_object_deleter(*this)};
60 ptr::operator seastar::temporary_buffer
<char>() &&
64 return {data
, length
, seastar::make_object_deleter(std::move(*this))};
67 // buffer::list conversions
69 list::operator seastar::net::packet() &&
71 seastar::net::packet
p(_num
);
72 for (auto& ptr
: _buffers
) {
73 // append each ptr as a temporary_buffer
74 p
= seastar::net::packet(std::move(p
), std::move(ptr
));
80 } // namespace ceph::buffer
84 using ceph::buffer::raw
;
85 class raw_seastar_local_shared_ptr
: public raw
{
88 raw_seastar_local_shared_ptr(temporary_buffer
& buf
)
89 : raw(buf
.get_write(), buf
.size()), buf(buf
.share()) {}
93 buffer::ptr
seastar_buffer_iterator::get_ptr(size_t len
)
95 buffer::ptr p
{ceph::unique_leakable_ptr
<buffer::raw
>(
96 new raw_seastar_local_shared_ptr
{buf
})};
101 buffer::ptr
const_seastar_buffer_iterator::get_ptr(size_t len
)
103 return buffer::ptr
{ buffer::copy(get_pos_add(len
), len
) };