transaction: avoid recursive sdbus calls

The server bindings for transactions use the bus unique_name
to create a transaction ID.  If the bus object is not in RUNNING
state, the unique_name call causes, deep in sd-bus, a call
into sd_bus_process to get the bus up and running since the unique_name
is assigned by the dbus-daemon.

When DBus objects are created there is a call to generate a signal
for object/interface creation.  In sd-bus this creates a message and
calls back into the server bindings to read all of the properties of
the interface.  When the transaction ID is assigned, calling
unique_name, this causes a recursive entry into sd_bus_process which
asserts.

The ideal solution would be to catch all C++ objects that might result
in a recursive call like this and call unique_name before.  This would
currently be on slot, server/match, and server/interface and may be
others in the future.  Instead, I took a simple approach, which is
to get the unique_name immediately after instantiating any bus-object.

Fixes openbmc/openbmc#1072.

Change-Id: I024fd2f46fd08c85317e102dfced88a11e18f9de
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
1 file changed
tree: 6654ee4a8da018512c524fc1d57b1c7ff088f4f9
  1. mapbox/
  2. sdbusplus/
  3. test/
  4. tools/
  5. .gitignore
  6. bootstrap.sh
  7. configure.ac
  8. LICENSE
  9. Makefile.am
  10. README.md
  11. sdbusplus.pc.in
README.md

sdbusplus

sdbusplus is a library and a tool for generating C++ bindings to dbus.

How to use tools/sdbus++

The path of your file will be the interface name. For example, for an interface xyz.openbmc_project.control.Chassis, you would create the following file: xyz/openbmc_project/control/Chassis.interface.yaml. Similary, for errors, you would create xyz/openbmc_project/control/Chassis.errors.yaml.

Generating all the files:

root_dir=$(readlink -f ../phosphor-dbus-interfaces)
desired_interface=xyz.openbmc_project.control.Chassis
file_prefix=chassis_interface
file_exp_prefix=chassis_interface_exceptions
outdir=../phosphor-chassis-control/generated

# Server bindings
python tools/sdbus++ --templatedir=tools/sdbusplus/templates --rootdir=$root_dir interface server-header $desired_interface > $outdir/$file_prefix.hpp
python tools/sdbus++ --templatedir=tools/sdbusplus/templates --rootdir=$root_dir interface server-cpp $desired_interface > $outdir/$file_prefix.cpp

# Exception bindings
python tools/sdbus++ --templatedir=tools/sdbusplus/templates --rootdir=$root_dir error exception-header $desired_interface > $outdir/$file_exp_prefix.hpp
python tools/sdbus++ --templatedir=tools/sdbusplus/templates --rootdir=$root_dir error exception-cpp $desired_interface > $outdir/$file_exp_prefix.cpp

# Docs
python tools/sdbus++ --templatedir=tools/sdbusplus/templates --rootdir=$root_dir interface markdown $desired_interface > $outdir/$file_prefix.md
python tools/sdbus++ --templatedir=tools/sdbusplus/templates --rootdir=$root_dir error markdown $desired_interface > $outdir/$file_exp_prefix.md