From: Arvin Schnell Date: Wed, 6 Aug 2025 07:04:01 +0000 (+0200) Subject: - simplified memory managment X-Git-Tag: v0.13.0~8^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=85d2c0ee088a6e11291b2ea081c30642a417575c;p=thirdparty%2Fsnapper.git - simplified memory managment --- diff --git a/dbus/DBusMessage.cc b/dbus/DBusMessage.cc index ac5cb497..b3b3bb72 100644 --- a/dbus/DBusMessage.cc +++ b/dbus/DBusMessage.cc @@ -86,7 +86,7 @@ namespace DBus Unmarshaller::Unmarshaller(Message& msg) { - iters.push_back(new DBusMessageIter()); + iters.emplace_back(); if (!dbus_message_iter_init(msg.get_message(), top())) SN_THROW(FatalException()); } @@ -94,7 +94,6 @@ namespace DBus Unmarshaller::~Unmarshaller() { - delete iters.back(); iters.pop_back(); assert(iters.empty()); } @@ -103,16 +102,14 @@ namespace DBus void Unmarshaller::open_recurse() { - DBusMessageIter* iter2 = new DBusMessageIter(); - dbus_message_iter_recurse(top(), iter2); - iters.push_back(iter2); + iters.emplace_back(); + dbus_message_iter_recurse(second(), top()); } void Unmarshaller::close_recurse() { - delete iters.back(); iters.pop_back(); dbus_message_iter_next(top()); } @@ -120,14 +117,13 @@ namespace DBus Marshaller::Marshaller(Message& msg) { - iters.push_back(new DBusMessageIter()); + iters.emplace_back(); dbus_message_iter_init_append(msg.get_message(), top()); } Marshaller::~Marshaller() { - delete iters.back(); iters.pop_back(); assert(iters.empty()); } @@ -136,63 +132,54 @@ namespace DBus void Marshaller::open_struct() { - DBusMessageIter* iter2 = new DBusMessageIter(); - if (!dbus_message_iter_open_container(top(), DBUS_TYPE_STRUCT, NULL, iter2)) + iters.emplace_back(); + if (!dbus_message_iter_open_container(second(), DBUS_TYPE_STRUCT, NULL, top())) SN_THROW(FatalException()); - iters.push_back(iter2); } void Marshaller::close_struct() { - DBusMessageIter* iter2 = top(); - iters.pop_back(); - if (!dbus_message_iter_close_container(top(), iter2)) + if (!dbus_message_iter_close_container(second(), top())) SN_THROW(FatalException()); - delete iter2; + iters.pop_back(); } void Marshaller::open_array(const char* signature) { - DBusMessageIter* iter2 = new DBusMessageIter(); - if (!dbus_message_iter_open_container(top(), DBUS_TYPE_ARRAY, signature, iter2)) + iters.emplace_back(); + if (!dbus_message_iter_open_container(second(), DBUS_TYPE_ARRAY, signature, top())) SN_THROW(FatalException()); - iters.push_back(iter2); } void Marshaller::close_array() { - DBusMessageIter* iter2 = top(); - iters.pop_back(); - if (!dbus_message_iter_close_container(top(), iter2)) + if (!dbus_message_iter_close_container(second(), top())) SN_THROW(FatalException()); - delete iter2; + iters.pop_back(); } void Marshaller::open_dict_entry() { - DBusMessageIter* iter2 = new DBusMessageIter(); - if (!dbus_message_iter_open_container(top(), DBUS_TYPE_DICT_ENTRY, 0, iter2)) + iters.emplace_back(); + if (!dbus_message_iter_open_container(second(), DBUS_TYPE_DICT_ENTRY, NULL, top())) SN_THROW(FatalException()); - iters.push_back(iter2); } void Marshaller::close_dict_entry() { - DBusMessageIter* iter2 = top(); - iters.pop_back(); - if (!dbus_message_iter_close_container(top(), iter2)) + if (!dbus_message_iter_close_container(second(), top())) SN_THROW(FatalException()); - delete iter2; + iters.pop_back(); } @@ -482,11 +469,11 @@ namespace DBus { marshaller.open_array("{ss}"); - for (map::const_iterator it = data.begin(); it != data.end() ; ++it) + for (const map::value_type& value : data) { marshaller.open_dict_entry(); - marshaller << it->first << it->second; + marshaller << value.first << value.second; marshaller.close_dict_entry(); } diff --git a/dbus/DBusMessage.h b/dbus/DBusMessage.h index 20205f6a..97c5424c 100644 --- a/dbus/DBusMessage.h +++ b/dbus/DBusMessage.h @@ -177,19 +177,26 @@ namespace DBus template <> struct TypeInfo { static const char* signature; }; + // Note: mashalling functions below are not exception safe: If an FatalException is + // thrown the internal state may be broken afterwards. + + class Marshalling { public: - DBusMessageIter* top() { return iters.back(); } + DBusMessageIter* top() { return &iters.back(); } + DBusMessageIter* second() { return &iters[iters.size() - 2]; } int get_type() { return dbus_message_iter_get_arg_type(top()); } string get_signature(); protected: - vector iters; + // According to the DBus documentation DBusMessageIter can be copied by assignment + // or memcpy(). So we are fine even if the vector gets resized. + vector iters; }; @@ -288,9 +295,9 @@ namespace DBus { marshaller.open_array(TypeInfo::signature); - for (typename vector::const_iterator it = data.begin(); it != data.end(); ++it) + for (const Type& value : data) { - marshaller << *it; + marshaller << value; } marshaller.close_array();