<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
While testing/debugging a language binding for ooRexx I arrived at
testing DBusServer (dbus_server_listen(), etc.).<br>
<br>
The current implementation employs "dbus_server_set_watch_functions()",
but not "dbus_set_timeout_functions()", because there seems to be no
need for it. (Using a server watch loop running on a separate thread
waiting for clients to connect.)<br>
<br>
The test programs are directly derived from those that I used for
testing service and client objects on the session/system bus. There all
programs run correctly in the meantime, i.e. they do not abend, no
matter how many connections I let use the service object. <br>
<br>
For testing the private server functionality these test programs get
adapted to use the given addresses on the service and client sides, and
everything looks fine.<br>
<br>
Except for two things:<br>
<ul>
  <li>the "org.freedesktop.DBus.Local.Disconnected" signal does not
occur, when clients go away (just saw that signal arrive once or twice
so far, while testing for hours),<br>
    <br>
  </li>
  <li>it seems that sometimes abends occur, where rarely a backtrace is
given. One that I got starts out with:<br>
    <pre>*** glibc detected *** /usr/bin/rexx: double free or corruption (fasttop): 0x0000000000da8980 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x78a8f)[0x7f92a0eefa8f]
/lib/x86_64-linux-gnu/libc.so.6(+0x7b1bb)[0x7f92a0ef21bb]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0xf9)[0x7f92a0ef3b19]
/lib/x86_64-linux-gnu/libdbus-1.so.3(+0x28321)[0x7f929e7f1321]
/lib/x86_64-linux-gnu/libdbus-1.so.3(+0x28a98)[0x7f929e7f1a98]
/lib/x86_64-linux-gnu/libdbus-1.so.3(+0x14217)[0x7f929e7dd217]
/lib/x86_64-linux-gnu/libdbus-1.so.3(+0x14c18)[0x7f929e7ddc18]
/lib/x86_64-linux-gnu/libdbus-1.so.3(+0x14f46)[0x7f929e7ddf46]
/lib/x86_64-linux-gnu/libdbus-1.so.3(+0x1295f)[0x7f929e7db95f]
/lib/x86_64-linux-gnu/libdbus-1.so.3(+0x12e35)[0x7f929e7dbe35]
/lib/x86_64-linux-gnu/libdbus-1.so.3(dbus_message_new_method_call+0xfc)[0x7f929e7e0a4c]
/usr/lib/libdbusoorexx.so(DbusBusCallMessage_impl+0x5d0)[0x7f929ea1ed49]
/usr/lib/libdbusoorexx.so(DbusBusCallMessage+0x93)[0x7f929ea1e75f]
/usr/lib/ooRexx/librexx.so.4(_ZN20RexxNativeActivation3runEP10RexxMethodP16RexxNativeMethodP10RexxObjectP10RexxStringPS5_mR15ProtectedObject+0xce)[0x7f92a20d91ae]
/usr/lib/ooRexx/librexx.so.4(_ZN10RexxMethod3runEP12RexxActivityP10RexxObjectP10RexxStringPS3_mR15ProtectedObject+0x71)[0x7f92a2098361]
/usr/lib/ooRexx/librexx.so.4(_ZN10RexxObject22processProtectedMethodEP10RexxStringP10RexxMethodPPS_mR15ProtectedObject+0x7d)[0x7f92a20a3f4d]
/usr/lib/ooRexx/librexx.so.4(_ZN21RexxExpressionMessage8evaluateEP14RexxActivationP19RexxExpressionStack+0x256)[0x7f92a20fed36]
/usr/lib/ooRexx/librexx.so.4(_ZN21RexxInstructionReturn7executeEP14RexxActivationP19RexxExpressionStack+0x44)[0x7f92a210cd44]
/usr/lib/ooRexx/librexx.so.4(_ZN14RexxActivation3runEP10RexxObjectP10RexxStringPS1_mP15RexxInstructionR15ProtectedObject+0x11c)[0x7f92a20d1c9c]
/usr/lib/ooRexx/librexx.so.4(_ZN8RexxCode3runEP12RexxActivityP10RexxMethodP10RexxObjectP10RexxStringPS5_mR15ProtectedObject+0x73)[0x7f92a20d5363]
/usr/lib/ooRexx/librexx.so.4(_ZN10RexxMethod3runEP12RexxActivityP10RexxObjectP10RexxStringPS3_mR15ProtectedObject+0x71)[0x7f92a2098361]

... cut ... 

/usr/lib/ooRexx/librexx.so.4(_ZN8RexxCode3runEP12RexxActivityP10RexxMethodP10RexxObjectP10RexxStringPS5_mR15ProtectedObject+0x73)[0x7f92a20d5363]
/usr/lib/ooRexx/librexx.so.4(_ZN10RexxMethod3runEP12RexxActivityP10RexxObjectP10RexxStringPS3_mR15ProtectedObject+0x71)[0x7f92a2098361]
/usr/lib/ooRexx/librexx.so.4(_ZN10RexxObject11messageSendEP10RexxStringPPS_mR15ProtectedObject+0xd3)[0x7f92a20a47d3]
/usr/lib/ooRexx/librexx.so.4(_ZN21RexxExpressionMessage8evaluateEP14RexxActivationP19RexxExpressionStack+0x256)[0x7f92a20fed36]
/usr/lib/ooRexx/librexx.so.4(_ZN25RexxInstructionAssignment7executeEP14RexxActivationP19RexxExpressionStack+0xf8)[0x7f92a2102298]
/usr/lib/ooRexx/librexx.so.4(_ZN14RexxActivation3runEP10RexxObjectP10RexxStringPS1_mP15RexxInstructionR15ProtectedObject+0x11c)[0x7f92a20d1c9c]
/usr/lib/ooRexx/librexx.so.4(_ZN14RexxActivation8dispatchEv+0x5b)[0x7f92a20d2a4b]
/usr/lib/ooRexx/librexx.so.4(_ZN12RexxActivity9runThreadEv+0x13e)[0x7f92a20f589e]
/usr/lib/ooRexx/librexx.so.4(_Z9threadFncPv+0x9)[0x7f92a2123999]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x6d8c)[0x7f92a19b2d8c]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7f92a0f5d04d]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:01 8398528                            /usr/bin/rexx
00601000-00602000 rw-p 00001000 08:01 8398528                            /usr/bin/rexx
00d8e000-00daf000 rw-p 00000000 00:00 0                                  [heap]
7f9298000000-7f9298021000 rw-p 00000000 00:00 0 
7f9298021000-7f929c000000 ---p 00000000 00:00 0 
7f929e540000-7f929e541000 ---p 00000000 00:00 0 
7f929e541000-7f929e5c1000 rw-p 00000000 00:00 0 
7f929e5c1000-7f929e5c8000 r-xp 00000000 08:01 14421729                   /lib/x86_64-linux-gnu/librt-2.13.soAborted
rony@rony-linux:/mnt/root_e/rony/dev/dbus20110602/tutorials-dbus/c-api/work/dbusoorexx/tests$ 
    </pre>
  </li>
</ul>
Now it is not clear where the root of such errors is, hence I would
like to make sure what happens here, especially relating to the remark
in the DBus documentation:<br>
<blockquote>
  <dl class="todo">
    <dt><b><a class="el"
 href="http://dbus.freedesktop.org/doc/api/html/todo.html#_todo000047">Todo:</a></b></dt>
    <dd>
      <p class="startdd">Thread safety hasn't been tested much for <a
 class="el"
 href="http://dbus.freedesktop.org/doc/api/html/structDBusServer.html"
 title="Internals of DBusServer object.">DBusServer</a> </p>
      <p class="enddd">Need notification to apps of disconnection, may
matter for some transports </p>
    </dd>
  </dl>
</blockquote>
cf.
<a class="moz-txt-link-rfc2396E" href="http://dbus.freedesktop.org/doc/api/html/group__DBusServer.html#details">&lt;http://dbus.freedesktop.org/doc/api/html/group__DBusServer.html#details&gt;</a>.<br>
<br>
<br>
[The language binding library, when loaded, does a
"dbus_threads_init_default()".]<br>
<br>
---<br>
<br>
As my skills in using gdb and setting up debug environments in general
are more than rusty (too many years have gone by), I would appreciate
any help, pointers which would help me locate the source of these
abends when using DBusServer. Hence fool-proof directions of setting up
such an environment would be highly appreciated!<br>
<br>
[I am more than wary doing anything with the installed dbus on my own
as I already got my fingers badly burned two months ago, when I started
out with the dbus language binding project and changed a system
configuration with the effect, that I had to install Ubuntu from
scratch, as our Linux gurus where also not able to help get XWindows up
and running anymore. That was the reason why I started the initial
development in virtual machines, such that such bad side-effects would
not harm the real system. Of course, I learned afterwards that I made a
silly mistake and now I would know how to correct that error. But
debugging also dbus itself is terra incognita for me, so "once burned,
always shy" is currently restricting my will to experiment, besides
time restrictions which are more and more piling up. The hope is that
dbus developers in the know however, would know what to do to keep
everything within limits.]<br>
<br>
Of course, it would be fantastic if anyone of the DBus developers who
has any insight to DBusServer would step forward (privately or via the
list) and help debug this. If it is a problem in DBusServer it might be
that it is not a big one, given that the system/session DBus servers
appear to be rock-solid; in addition it would be very important for
long running private servers to learn about disconnected clients, so it
should be the case that DBusServer reliably sends the respective
"Disconnected" signals.<br>
<br>
Any takers, helpers, ideas ?<br>
<br>
---rony<br>
<br>
<br>
On 08.08.2011 21:02, rony wrote:
<blockquote cite="mid:4E4032DF.1030004@wu.ac.at" type="cite">
  <pre wrap="">Hi Havoc,

thank you very much for your information!

On 08.08.2011 02:58, Havoc Pennington wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">On Sun, Aug 7, 2011 at 2:05 PM, rony <a class="moz-txt-link-rfc2396E" href="mailto:rony@wu.ac.at">&lt;rony@wu.ac.at&gt;</a> wrote:
  
    </pre>
    <blockquote type="cite">
      <pre wrap="">When setting up a private DBUS server, it is possible to accept/get
connections to clients.

Is there a way to find out as a server, when a client went away?

Or with other words: how could one determine the connection that got
shut down at the client side (in order to close that connection on the
server) while the server goes on waiting on new clients?
    
      </pre>
    </blockquote>
    <pre wrap="">You should get a Disconnected message on the server side in this case.
(A disconnect looks the same on both client and server side, if I
remember correctly and nothing has changed.)
  
    </pre>
  </blockquote>
  <pre wrap="">In the past couple of hours I have tried to go after that.

At one point (about two hours ago) I was surprised, because indeed I got
a signal from "org.freedesktop.DBus.Local" (object path
"/org/freedesktop/DBus/Local") and a member named "Disconnected"! Then I
started to change the code to cater for the Disconnect signals (to
inform the Rexx DBus server object about the client's disconnection),
but ever since it did not appear anymore. Not really sure why, as to the
best of my knowledge I have not done anything that could possibly impact
DBus.

To reassure you or anyone else: the language binding implementation has
its own message loop for connections using
"dbus_connection_read_write(conn,milliTimeout)" and dumping all received
messages does not yield the "Disconnect" signal message! (This is on
DBus 1.4.6, 64-bit Ubuntu.)

[The implementation of the language binding has for each connection an
own message loop running on its own thread, each employing
dbus_connection_read_write(); in addition, if a private server is
created in addition a watch-loop runs (for allowing clients to connect
to the server instance) on its own thread as well.]

So, I am really stumped and would be very greatful for any ideas, hints
that could direct me where to look and what to go after! It would be
very helpful to learn from DBus when a connection from a client to the
server got disconnected.

TIA,

---rony

_______________________________________________
dbus mailing list
<a class="moz-txt-link-abbreviated" href="mailto:dbus@lists.freedesktop.org">dbus@lists.freedesktop.org</a>
<a class="moz-txt-link-freetext" href="http://lists.freedesktop.org/mailman/listinfo/dbus">http://lists.freedesktop.org/mailman/listinfo/dbus</a>

  </pre>
</blockquote>
</body>
</html>