Remove pointers vector
sd-bus includes a vtable option SD_BUS_VTABLE_ABSOLUTE_OFFSET[1] which
allows the vector of pointers to be removed entirely. This saves some
memory on interfaces, and allows a one element dereference instead of
two.
Tested: Asio examples work as expected.
[1] https://www.freedesktop.org/software/systemd/man/sd_bus_add_object.html#SD_BUS_VTABLE_ABSOLUTE_OFFSET
Change-Id: I9f3c1463f5efdb11537444d156247c09f97a043e
Signed-off-by: Ed Tanous <edtanous@google.com>
diff --git a/include/sdbusplus/asio/object_server.hpp b/include/sdbusplus/asio/object_server.hpp
index 1ad5ff3..02d2111 100644
--- a/include/sdbusplus/asio/object_server.hpp
+++ b/include/sdbusplus/asio/object_server.hpp
@@ -617,13 +617,13 @@
sd_bus_message* reply, void* userdata,
sd_bus_error* error)
{
- property_callback** func = static_cast<property_callback**>(userdata);
+ property_callback* func = static_cast<property_callback*>(userdata);
auto mesg = message_t(reply);
#ifdef __EXCEPTIONS
try
{
#endif
- return (*func)->on_get_(mesg);
+ return func->on_get_(mesg);
#ifdef __EXCEPTIONS
}
@@ -645,14 +645,14 @@
sd_bus_message* value, void* userdata,
sd_bus_error* error)
{
- property_callback** func = static_cast<property_callback**>(userdata);
+ property_callback* func = static_cast<property_callback*>(userdata);
auto mesg = message_t(value);
#ifdef __EXCEPTIONS
try
{
#endif
- SetPropertyReturnValue status = (*func)->on_set_message_(mesg);
+ SetPropertyReturnValue status = func->on_set_message_(mesg);
if ((status == SetPropertyReturnValue::valueUpdated) ||
(status == SetPropertyReturnValue::sameValueUpdated))
{
@@ -683,13 +683,13 @@
static int method_handler(sd_bus_message* m, void* userdata,
sd_bus_error* error)
{
- method_callback** func = static_cast<method_callback**>(userdata);
+ method_callback* func = static_cast<method_callback*>(userdata);
auto mesg = message_t(m);
#ifdef __EXCEPTIONS
try
{
#endif
- int status = (*func)->call_(mesg);
+ int status = func->call_(mesg);
if (status == 1)
{
return status;
@@ -733,35 +733,33 @@
vtable_.reserve(2 + property_callbacks_.size() +
method_callbacks_.size() + signals_.size());
vtable_.emplace_back(vtable::start());
- pointers.push_back(this);
-
property_callbacks_.shrink_to_fit();
for (auto& element : property_callbacks_)
{
- pointers.push_back(&element);
- size_t pointer_off = (pointers.size() - 1) * sizeof(void*);
if (element.on_set_message_)
{
vtable_.emplace_back(vtable::property_o(
element.name_.c_str(), element.signature_, get_handler,
- set_handler, pointer_off, element.flags_));
+ set_handler, reinterpret_cast<size_t>(&element),
+ element.flags_ | SD_BUS_VTABLE_ABSOLUTE_OFFSET));
}
else
{
vtable_.emplace_back(vtable::property_o(
element.name_.c_str(), element.signature_, get_handler,
- pointer_off, element.flags_));
+ reinterpret_cast<size_t>(&element),
+ element.flags_ | SD_BUS_VTABLE_ABSOLUTE_OFFSET));
}
}
method_callbacks_.shrink_to_fit();
for (auto& element : method_callbacks_)
{
- pointers.push_back(&element);
- size_t pointer_off = (pointers.size() - 1) * sizeof(void*);
- vtable_.emplace_back(vtable::method_o(
- element.name_.c_str(), element.arg_signature_,
- element.return_signature_, method_handler, pointer_off));
+ vtable_.emplace_back(
+ vtable::method_o(element.name_.c_str(), element.arg_signature_,
+ element.return_signature_, method_handler,
+ reinterpret_cast<size_t>(&element),
+ SD_BUS_VTABLE_ABSOLUTE_OFFSET));
}
signals_.shrink_to_fit();
@@ -777,7 +775,7 @@
interface_.emplace(static_cast<sdbusplus::bus_t&>(*conn_),
path_.c_str(), name_.c_str(),
static_cast<const sd_bus_vtable*>(&vtable_[0]),
- pointers.data());
+ nullptr);
conn_->emit_interfaces_added(path_.c_str(),
std::vector<std::string>{name_});
if (!skipPropertyChangedSignal)
@@ -824,8 +822,6 @@
std::vector<property_callback> property_callbacks_;
std::vector<method_callback> method_callbacks_;
- std::vector<void*> pointers;
-
std::vector<sd_bus_vtable> vtable_;
std::optional<sdbusplus::server::interface_t> interface_;
};