commit | bee1a6a3b233495fc48265626ca3a7952a43363f | [log] [tgz] |
---|---|---|
author | Patrick Williams <patrick@stwcx.xyz> | Thu Feb 16 16:06:51 2017 -0600 |
committer | Patrick Williams <patrick@stwcx.xyz> | Thu Feb 16 16:06:53 2017 -0600 |
tree | 6654ee4a8da018512c524fc1d57b1c7ff088f4f9 | |
parent | 16e175311d55045fa6709c0b91cc0f0ec5e2b3a5 [diff] |
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>
sdbusplus is a library and a tool for generating C++ bindings to dbus.
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