[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freedesktop-dbus
Subject:    dbus message queue latency time is not constant for same data payload
From:       deepak jewargi <djewargi () gmail ! com>
Date:       2023-05-23 4:38:39
Message-ID: CABLtkZdgUWRg1LbcvgKXpvRPz=KhQqsRL-Jr-AmkT_D5DYdsvg () mail ! gmail ! com
[Download RAW message or body]

Hi All,


I have implemented a dbus application using dbus-1 API's on linux
platform and testing profiling on ubuntu machine . Get issue as mentioned
below

Following are the challenges facing

1. I have implemented dbus communication using signaling , dbus
initialization ,  dbus publish  and dbus subscribe
2. When I started testing on the linux ubuntu machine for profiling of
dbus message Transmit from one process and receiver  another process using
dbus signaling, It's working fine for the first 15 minutes , latency time
is on average 500 microSeconds. After 30 minutes,  20 -30 messages are
getting latency of  80 milliseconds . Each message transmitted at 1
millisecond delay
Latency time between transmitting from one process and receiving at another
process is not constant for the same payload message.
3. Is any benchmark for message transmit and receiver timeline (latency
time)

/**
 * Initialize dbus.pass the unique application name as argument. this name will
 * be used to identify the dbus object and path name in the later calls.
 * @param appname unique application identifier name.
 * @return 0 on success error code otherwise.
 */
int dbus_client_init (char *appname)
{
    struct timespec   wait = {0};

    flogd("dbustest.log","%s:%d Entry",__func__,__LINE__);
    DBusError err;
    int rc = 0;
    printf("appname=%s\n",appname);

    // lock mutex
    wait.tv_sec = 0;
    wait.tv_nsec = MS_TO_NS(MILLI_SEC);  // 500 msec

    //pthread_mutex_lock (&init_dbus_mutex);
   if(pthread_mutex_timedlock(&init_dbus_mutex, &wait) == 0)
    {
        flogd("dbustest.log","%s:%d Entry",__func__,__LINE__);
        if (init_dbus_flag == false)
        {
            // initialize the errors
                    dbus_error_init(&err);

        // connect to the system bus and check for errors
        txconn = dbus_bus_get(DBUS_BUS_SESSION, &err);
        if (dbus_error_is_set(&err))
        {
           flogd("dbustest.log","%s:%d txbus: Connection Error (%s)"
,__func__,__LINE__, err.message);
            dbus_error_free(&err);
            pthread_mutex_unlock (&init_dbus_mutex);
            return -1;
        }
        if (NULL == txconn)
        {
            dbus_error_free(&err);
            pthread_mutex_unlock (&init_dbus_mutex);
            return -1;
        }

        // request our name on the bus
        sprintf(txbusname + strlen(txbusname), "%s", appname);
        rc = dbus_bus_request_name(txconn, txbusname,
DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
        if (dbus_error_is_set(&err) || rc == -1)
        {
           flogd("dbustest.log", "%s:%d txbus: Name Error (%s)"
,__func__,__LINE__, err.message);
            dbus_error_free(&err);
            pthread_mutex_unlock (&init_dbus_mutex);
            return -1;
        }

        // connect to the system bus and check for errors
        rxconn = dbus_bus_get(DBUS_BUS_SESSION, &err);
        if (dbus_error_is_set(&err))
        {
           flogd("dbustest.log","%s:%d rxbus: Connection Error (%s)"
,__func__,__LINE__, err.message);
            dbus_error_free(&err);
            pthread_mutex_unlock (&init_dbus_mutex);
            return -1;
        }
        if (NULL == rxconn)
        {
            dbus_error_free(&err);
            pthread_mutex_unlock (&init_dbus_mutex);
            return -1;
        }

        // request our name on the bus
//        sprintf(rxbusname + strlen(rxbusname), "%d", getpid());
        sprintf(rxbusname + strlen(rxbusname), "%s", appname);
        printf("%s\n",rxbusname);
        rc = dbus_bus_request_name(rxconn, rxbusname,
DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
        if (dbus_error_is_set(&err) || rc == -1)
        {
           flogd("dbustest.log", "%s:%d rxbus: Name Error (%s)"
,__func__,__LINE__, err.message);
            dbus_error_free(&err);
            pthread_mutex_unlock (&init_dbus_mutex);
            return -1;
        }

            dbus_error_free(&err);
            init_dbus_flag = true;
        }
        else
        {
            flogv("dbustest.log","%s:%d Dbus was already initialized"
,__func__,__LINE__);
        }

        pthread_mutex_unlock (&init_dbus_mutex);
    }
    else
    {
        flogd("dbustest.log","%s:%d Exit (no errors)",__func__,__LINE__);
        return -1;
    }
    return 0;
}

int dbus_client_publish (char *method, void *payload, int payloadlen)
{
   DBusMessage *msg;
   DBusMessageIter args;
   DBusMessageIter subiter;
   DBusError err;

   int returnValue = -1;
   int SignalRetryCount = 0;
   int SendRetryCount = 0;
   int maxRetries = 3;
   int successConnect = 0;
   int successSend = 0;

   char *pload = (char*) payload;

   if(pload != NULL)
   {
      // initialize the errors
      dbus_error_init (&err);

      while (SignalRetryCount < maxRetries && !successConnect)
      {

         // create a new method call and check for errors
         msg = dbus_message_new_signal (DBUS_OBJECT_NAME,
// object name of the signal
                                        DBUS_INTERFACE_NAME,
// interface name of the signal
                                        method); // name of the signal

         if(NULL == msg)
         {
            dbus_error_free (&err);

            SignalRetryCount++;
         }
         else
         {
            // append arguments
            dbus_message_iter_init_append (msg, &args);


// For appending args, doc says to use the following 3 for container types.
            // We can view the cmd buffer as a char buffer and send
            dbus_message_iter_open_container (&args, DBUS_TYPE_ARRAY, "y"
, &subiter);
            dbus_message_iter_append_fixed_array (&subiter,
DBUS_TYPE_BYTE, &pload, payloadlen);

            dbus_message_iter_close_container (&args, &subiter);

            // We probably don't need a reply

// flogv("dbustest.log","%s:%d dbus_connection_send called",__func__,__LINE__);

            while (SendRetryCount < maxRetries && !successSend)
            {
               if(!dbus_connection_send (txconn, msg, NULL))
               {

//  flogd("dbustest.log","%s:%d Out Of Memory!",__func__,__LINE__);
                  SendRetryCount++;
               }
               else
               {
                  successConnect = 1;
                  successSend = 1;
                  returnValue = 0;
                  break;
               }
            }
         }
      }

      dbus_connection_flush (txconn);

      // free message
      dbus_message_unref (msg);
      dbus_error_free (&err);

      //flogd("dbustest.log","%s:%d Exit (no errors)",__func__,__LINE__);
   }

   // print ( dbus_client_publish, returnValue)

   return returnValue;
}
/* This API subscribes for a particular busname/interface/method. The
callback would
 * be called once the subscribed information is available.
 *Note: subscribe = listen => server bus name (e.g., mqtt.server.cmdhndlr).
 *
 * method:    method name you want to listen to.
 * cb:        callback to be called once the subscribed information is
available.
 * return:    0 on success, -1 on failure.
 */
int dbus_client_subscribe (int num_pairs, ...)
{
    flogd("dbustest.log","%s:%d Entry",__func__,__LINE__);
    int i;
    va_list vargs;
    rx_thread_args_t *args;

    if (num_pairs > 32)
        return -1;

    args = (rx_thread_args_t *) malloc (sizeof(rx_thread_args_t));
    if (args == NULL)
        return -1;

    args->num_pairs = num_pairs;
    va_start(vargs, num_pairs);
    for (i = 0; i < num_pairs; i++)
    {
        char *m = va_arg(vargs, char *);
        sprintf (args->mthod_cb[i].method, "%s", m);
        args->mthod_cb[i].cb = va_arg(vargs, void *);
    }
    va_end(vargs);

    if
 (pthread_create (&dbus_client_rx_thread, NULL, dbus_client_receive_thread, (
void *)args) != 0)
    {
        floge("dbustest.log",
"%s:%d Client Error: Rx Thread creation failed; errno = %d (%s)"
,__func__,__LINE__, errno, strerror(errno));
        return -1;
    }


/* TODO: Detach dbus_client_receive_thread. (or exit self in the created thread)
     * Cannot be joined here as it will block the client process.
     */
    flogd("dbustest.log","%s:%d exit",__func__,__LINE__);
    return 0;
}

Please correct me, if anything is missing in my implementation.


Regards,
Deepak Jewargi

[Attachment #3 (text/html)]

<div dir="ltr">Hi All, <div><br></div><div><br></div><div>I have implemented a dbus \
application using dbus-1 API&#39;s on linux platform and testing profiling on ubuntu \
machine . Get issue as mentioned below </div><div><br></div><div>Following are the \
challenges facing </div><div><br></div><div>1. I have implemented dbus communication \
using signaling , dbus initialization ,  dbus publish  and dbus \
subscribe</div><div>2. When I started testing on the linux ubuntu machine for \
profiling of  dbus message Transmit from one process and receiver  another process \
using dbus signaling, It&#39;s working fine for the first 15 minutes , latency time \
is on average 500 microSeconds. After 30 minutes,  20 -30 messages are getting \
latency of  80 milliseconds . Each message transmitted at 1 millisecond \
delay</div><div>Latency time between transmitting from one process and receiving at \
another process is not constant for the same payload message. <br></div><div>3. Is \
any benchmark for message transmit and receiver timeline (latency time) \
<br></div><div><br></div><div><div \
style="color:rgb(0,0,0);background-color:rgb(255,255,254);font-family:Consolas,&quot;Courier \
New&quot;,monospace;font-size:12px;line-height:16px;white-space:pre"><div><span \
style="color:rgb(0,114,0)">/**</span></div><div><span style="color:rgb(0,114,0)"> * \
Initialize dbus.pass the unique application name as argument. this name \
will</span></div><div><span style="color:rgb(0,114,0)"> * be used to identify the \
dbus object and path name in the later calls.</span></div><div><span \
style="color:rgb(0,114,0)"> * @param appname unique application identifier \
name.</span></div><div><span style="color:rgb(0,114,0)"> * @return 0 on success error \
code otherwise.</span></div><div><span style="color:rgb(0,114,0)"> \
*/</span></div><div><span style="color:rgb(0,0,255)">int</span> dbus_client_init \
(<span style="color:rgb(0,0,255)">char</span> *appname)</div><div>{</div><div>    \
<span style="color:rgb(0,0,255)">struct</span> timespec   wait = {<span \
style="color:rgb(0,114,0)">0</span>};</div><br><div>    flogd(<span \
style="color:rgb(163,21,21)">&quot;dbustest.log&quot;</span>,<span \
style="color:rgb(163,21,21)">&quot;%s:%d \
Entry&quot;</span>,__func__,__LINE__);</div><div>    DBusError err;</div><div>    \
<span style="color:rgb(0,0,255)">int</span> rc = <span \
style="color:rgb(0,114,0)">0</span>;</div><div>    printf(<span \
style="color:rgb(163,21,21)">&quot;appname=%s\n&quot;</span>,appname);</div><br><div> \
<span style="color:rgb(0,114,0)">// lock mutex</span></div><div>    wait.tv_sec = \
<span style="color:rgb(0,114,0)">0</span>;</div><div>    wait.tv_nsec = \
MS_TO_NS(MILLI_SEC);  <span style="color:rgb(0,114,0)">// 500 \
msec</span></div><br><div>    <span style="color:rgb(0,114,0)">//pthread_mutex_lock \
(&amp;init_dbus_mutex);</span></div><div>   <span \
style="color:rgb(0,0,255)">if</span>(pthread_mutex_timedlock(&amp;init_dbus_mutex, \
&amp;wait) == <span style="color:rgb(0,114,0)">0</span>)</div><div>    {</div><div>   \
flogd(<span style="color:rgb(163,21,21)">&quot;dbustest.log&quot;</span>,<span \
style="color:rgb(163,21,21)">&quot;%s:%d \
Entry&quot;</span>,__func__,__LINE__);</div><div>        <span \
style="color:rgb(0,0,255)">if</span> (init_dbus_flag == <span \
style="color:rgb(0,0,255)">false</span>)</div><div>        {</div><div>            \
<span style="color:rgb(0,114,0)">// initialize the errors</span></div><div>           \
dbus_error_init(&amp;err);</div><br><div>        <span style="color:rgb(0,114,0)">// \
connect to the system bus and check for errors</span></div><div>        txconn = \
dbus_bus_get(DBUS_BUS_SESSION, &amp;err);</div><div>        <span \
style="color:rgb(0,0,255)">if</span> (dbus_error_is_set(&amp;err))</div><div>        \
{</div><div>           flogd(<span \
style="color:rgb(163,21,21)">&quot;dbustest.log&quot;</span>,<span \
style="color:rgb(163,21,21)">&quot;%s:%d txbus: Connection Error \
(%s)&quot;</span>,__func__,__LINE__, err.message);</div><div>            \
dbus_error_free(&amp;err);</div><div>            pthread_mutex_unlock \
(&amp;init_dbus_mutex);</div><div>            <span \
style="color:rgb(0,0,255)">return</span> -<span \
style="color:rgb(0,114,0)">1</span>;</div><div>        }</div><div>        <span \
style="color:rgb(0,0,255)">if</span> (NULL == txconn)</div><div>        {</div><div>  \
dbus_error_free(&amp;err);</div><div>            pthread_mutex_unlock \
(&amp;init_dbus_mutex);</div><div>            <span \
style="color:rgb(0,0,255)">return</span> -<span \
style="color:rgb(0,114,0)">1</span>;</div><div>        }</div><br><div>        <span \
style="color:rgb(0,114,0)">// request our name on the bus</span></div><div>        \
sprintf(txbusname + strlen(txbusname), <span \
style="color:rgb(163,21,21)">&quot;%s&quot;</span>, appname);</div><div>        rc = \
dbus_bus_request_name(txconn, txbusname, DBUS_NAME_FLAG_REPLACE_EXISTING , \
&amp;err);</div><div>        <span style="color:rgb(0,0,255)">if</span> \
(dbus_error_is_set(&amp;err) || rc == -<span \
style="color:rgb(0,114,0)">1</span>)</div><div>        {</div><div>           \
flogd(<span style="color:rgb(163,21,21)">&quot;dbustest.log&quot;</span>, <span \
style="color:rgb(163,21,21)">&quot;%s:%d txbus: Name Error \
(%s)&quot;</span>,__func__,__LINE__, err.message);</div><div>            \
dbus_error_free(&amp;err);</div><div>            pthread_mutex_unlock \
(&amp;init_dbus_mutex);</div><div>            <span \
style="color:rgb(0,0,255)">return</span> -<span \
style="color:rgb(0,114,0)">1</span>;</div><div>        }</div><br><div>        <span \
style="color:rgb(0,114,0)">// connect to the system bus and check for \
errors</span></div><div>        rxconn = dbus_bus_get(DBUS_BUS_SESSION, \
&amp;err);</div><div>        <span style="color:rgb(0,0,255)">if</span> \
(dbus_error_is_set(&amp;err))</div><div>        {</div><div>           flogd(<span \
style="color:rgb(163,21,21)">&quot;dbustest.log&quot;</span>,<span \
style="color:rgb(163,21,21)">&quot;%s:%d rxbus: Connection Error \
(%s)&quot;</span>,__func__,__LINE__, err.message);</div><div>            \
dbus_error_free(&amp;err);</div><div>            pthread_mutex_unlock \
(&amp;init_dbus_mutex);</div><div>            <span \
style="color:rgb(0,0,255)">return</span> -<span \
style="color:rgb(0,114,0)">1</span>;</div><div>        }</div><div>        <span \
style="color:rgb(0,0,255)">if</span> (NULL == rxconn)</div><div>        {</div><div>  \
dbus_error_free(&amp;err);</div><div>            pthread_mutex_unlock \
(&amp;init_dbus_mutex);</div><div>            <span \
style="color:rgb(0,0,255)">return</span> -<span \
style="color:rgb(0,114,0)">1</span>;</div><div>        }</div><br><div>        <span \
style="color:rgb(0,114,0)">// request our name on the bus</span></div><div><span \
style="color:rgb(0,114,0)">//        sprintf(rxbusname + strlen(rxbusname), \
&quot;%d&quot;, getpid());</span></div><div>        sprintf(rxbusname + \
strlen(rxbusname), <span style="color:rgb(163,21,21)">&quot;%s&quot;</span>, \
appname);</div><div>        printf(<span \
style="color:rgb(163,21,21)">&quot;%s\n&quot;</span>,rxbusname);</div><div>        rc \
= dbus_bus_request_name(rxconn, rxbusname, DBUS_NAME_FLAG_REPLACE_EXISTING , \
&amp;err);</div><div>        <span style="color:rgb(0,0,255)">if</span> \
(dbus_error_is_set(&amp;err) || rc == -<span \
style="color:rgb(0,114,0)">1</span>)</div><div>        {</div><div>           \
flogd(<span style="color:rgb(163,21,21)">&quot;dbustest.log&quot;</span>, <span \
style="color:rgb(163,21,21)">&quot;%s:%d rxbus: Name Error \
(%s)&quot;</span>,__func__,__LINE__, err.message);</div><div>            \
dbus_error_free(&amp;err);</div><div>            pthread_mutex_unlock \
(&amp;init_dbus_mutex);</div><div>            <span \
style="color:rgb(0,0,255)">return</span> -<span \
style="color:rgb(0,114,0)">1</span>;</div><div>        }</div><br><div>            \
dbus_error_free(&amp;err);</div><div>            init_dbus_flag = <span \
style="color:rgb(0,0,255)">true</span>;</div><div>        }</div><div>        <span \
style="color:rgb(0,0,255)">else</span></div><div>        {</div><div>            \
flogv(<span style="color:rgb(163,21,21)">&quot;dbustest.log&quot;</span>,<span \
style="color:rgb(163,21,21)">&quot;%s:%d Dbus was already \
initialized&quot;</span>,__func__,__LINE__);</div><div>        }</div><br><div>       \
pthread_mutex_unlock (&amp;init_dbus_mutex);</div><div>    }</div><div>    <span \
style="color:rgb(0,0,255)">else</span></div><div>    {</div><div>        flogd(<span \
style="color:rgb(163,21,21)">&quot;dbustest.log&quot;</span>,<span \
style="color:rgb(163,21,21)">&quot;%s:%d Exit (no \
errors)&quot;</span>,__func__,__LINE__);</div><div>        <span \
style="color:rgb(0,0,255)">return</span> -<span \
style="color:rgb(0,114,0)">1</span>;</div><div>    }</div><div>    <span \
style="color:rgb(0,0,255)">return</span> <span \
style="color:rgb(0,114,0)">0</span>;</div><div>}</div><div><br></div><div>

<div style="line-height:16px"><div><span style="color:rgb(0,0,255)">int</span> \
dbus_client_publish (<span style="color:rgb(0,0,255)">char</span> *method, <span \
style="color:rgb(0,0,255)">void</span> *payload, <span \
style="color:rgb(0,0,255)">int</span> payloadlen)</div><div>{</div><div>   \
DBusMessage *msg;</div><div>   DBusMessageIter args;</div><div>   DBusMessageIter \
subiter;</div><div>   DBusError err;</div><br><div>   <span \
style="color:rgb(0,0,255)">int</span> returnValue = -<span \
style="color:rgb(0,114,0)">1</span>;</div><div>   <span \
style="color:rgb(0,0,255)">int</span> SignalRetryCount = <span \
style="color:rgb(0,114,0)">0</span>;</div><div>   <span \
style="color:rgb(0,0,255)">int</span> SendRetryCount = <span \
style="color:rgb(0,114,0)">0</span>;</div><div>   <span \
style="color:rgb(0,0,255)">int</span> maxRetries = <span \
style="color:rgb(0,114,0)">3</span>;</div><div>   <span \
style="color:rgb(0,0,255)">int</span> successConnect = <span \
style="color:rgb(0,114,0)">0</span>;</div><div>   <span \
style="color:rgb(0,0,255)">int</span> successSend = <span \
style="color:rgb(0,114,0)">0</span>;</div><br><div>   <span \
style="color:rgb(0,0,255)">char</span> *pload = (<span \
style="color:rgb(0,0,255)">char</span>*) payload;</div><br><div>   <span \
style="color:rgb(0,0,255)">if</span>(pload != NULL)</div><div>   {</div><div>      \
<span style="color:rgb(0,114,0)">// initialize the errors</span></div><div>      \
dbus_error_init (&amp;err);</div><br><div>      <span \
style="color:rgb(0,0,255)">while</span> (SignalRetryCount &lt; maxRetries &amp;&amp; \
!successConnect)</div><div>      {</div><br><div>         <span \
style="color:rgb(0,114,0)">// create a new method call and check for \
errors</span></div><div>         msg = dbus_message_new_signal (DBUS_OBJECT_NAME, \
<span style="color:rgb(0,114,0)">// object name of the signal</span></div><div>       \
DBUS_INTERFACE_NAME, <span style="color:rgb(0,114,0)">// interface name of the \
signal</span></div><div>                                        method); <span \
style="color:rgb(0,114,0)">// name of the signal</span></div><br><div>         <span \
style="color:rgb(0,0,255)">if</span>(NULL == msg)</div><div>         {</div><div>     \
dbus_error_free (&amp;err);</div><br><div>            SignalRetryCount++;</div><div>  \
}</div><div>         <span style="color:rgb(0,0,255)">else</span></div><div>         \
{</div><div>            <span style="color:rgb(0,114,0)">// append \
arguments</span></div><div>            dbus_message_iter_init_append (msg, \
&amp;args);</div><br><div>            <span style="color:rgb(0,114,0)">// For \
appending args, doc says to use the following 3 for container \
types.</span></div><div>            <span style="color:rgb(0,114,0)">// We can view \
the cmd buffer as a char buffer and send</span></div><div>            \
dbus_message_iter_open_container (&amp;args, DBUS_TYPE_ARRAY, <span \
style="color:rgb(163,21,21)">&quot;y&quot;</span>, &amp;subiter);</div><div>          \
dbus_message_iter_append_fixed_array (&amp;subiter, DBUS_TYPE_BYTE, &amp;pload, \
payloadlen);</div><br><div>            dbus_message_iter_close_container (&amp;args, \
&amp;subiter);</div><br><div>            <span style="color:rgb(0,114,0)">// We \
probably don&#39;t need a reply</span></div><div>            <span \
style="color:rgb(0,114,0)">// flogv(&quot;dbustest.log&quot;,&quot;%s:%d \
dbus_connection_send called&quot;,__func__,__LINE__);</span></div><br><div>           \
<span style="color:rgb(0,0,255)">while</span> (SendRetryCount &lt; maxRetries \
&amp;&amp; !successSend)</div><div>            {</div><div>               <span \
style="color:rgb(0,0,255)">if</span>(!dbus_connection_send (txconn, msg, \
NULL))</div><div>               {</div><div>                  <span \
style="color:rgb(0,114,0)">//  flogd(&quot;dbustest.log&quot;,&quot;%s:%d Out Of \
Memory!&quot;,__func__,__LINE__);</span></div><div>                  \
SendRetryCount++;</div><div>               }</div><div>               <span \
style="color:rgb(0,0,255)">else</span></div><div>               {</div><div>          \
successConnect = <span style="color:rgb(0,114,0)">1</span>;</div><div>                \
successSend = <span style="color:rgb(0,114,0)">1</span>;</div><div>                  \
returnValue = <span style="color:rgb(0,114,0)">0</span>;</div><div>                  \
<span style="color:rgb(0,0,255)">break</span>;</div><div>               }</div><div>  \
}</div><div>         }</div><div>      }</div><br><div>      dbus_connection_flush \
(txconn);</div><br><div>      <span style="color:rgb(0,114,0)">// free \
message</span></div><div>      dbus_message_unref (msg);</div><div>      \
dbus_error_free (&amp;err);</div><br><div>      <span \
style="color:rgb(0,114,0)">//flogd(&quot;dbustest.log&quot;,&quot;%s:%d Exit (no \
errors)&quot;,__func__,__LINE__);</span></div><div>   }</div><br><div>   <span \
style="color:rgb(0,114,0)">// print ( dbus_client_publish, \
returnValue)</span></div><br><div>   <span style="color:rgb(0,0,255)">return</span> \
returnValue;</div><div>}</div></div>


<div style="line-height:16px"><div><span style="color:rgb(0,114,0)">/* This API \
subscribes for a particular busname/interface/method. The callback \
would</span></div><div><span style="color:rgb(0,114,0)"> * be called once the \
subscribed information is available.</span></div><div><span \
style="color:rgb(0,114,0)"> *Note: subscribe = listen =&gt; server bus name (e.g., \
mqtt.server.cmdhndlr).</span></div><div><span style="color:rgb(0,114,0)"> \
*</span></div><div><span style="color:rgb(0,114,0)"> * method:    method name you \
want to listen to.</span></div><div><span style="color:rgb(0,114,0)"> * cb:        \
callback to be called once the subscribed information is \
available.</span></div><div><span style="color:rgb(0,114,0)"> * return:    0 on \
success, -1 on failure.</span></div><div><span style="color:rgb(0,114,0)"> \
*/</span></div><div><span style="color:rgb(0,0,255)">int</span> dbus_client_subscribe \
(<span style="color:rgb(0,0,255)">int</span> num_pairs, ...)</div><div>{</div><div>   \
flogd(<span style="color:rgb(163,21,21)">&quot;dbustest.log&quot;</span>,<span \
style="color:rgb(163,21,21)">&quot;%s:%d \
Entry&quot;</span>,__func__,__LINE__);</div><div>    <span \
style="color:rgb(0,0,255)">int</span> i;</div><div>    va_list vargs;</div><div>    \
rx_thread_args_t *args;</div><br><div>    <span style="color:rgb(0,0,255)">if</span> \
(num_pairs &gt; <span style="color:rgb(0,114,0)">32</span>)</div><div>        <span \
style="color:rgb(0,0,255)">return</span> -<span \
style="color:rgb(0,114,0)">1</span>;</div><br><div>    args = (rx_thread_args_t *) \
malloc (<span style="color:rgb(0,0,255)">sizeof</span>(rx_thread_args_t));</div><div> \
<span style="color:rgb(0,0,255)">if</span> (args == NULL)</div><div>        <span \
style="color:rgb(0,0,255)">return</span> -<span \
style="color:rgb(0,114,0)">1</span>;</div><br><div>    args-&gt;num_pairs = \
num_pairs;</div><div>    va_start(vargs, num_pairs);</div><div>    <span \
style="color:rgb(0,0,255)">for</span> (i = <span style="color:rgb(0,114,0)">0</span>; \
i &lt; num_pairs; i++)</div><div>    {</div><div>        <span \
style="color:rgb(0,0,255)">char</span> *m = va_arg(vargs, <span \
style="color:rgb(0,0,255)">char</span> *);</div><div>        sprintf \
(args-&gt;mthod_cb[i].method, <span \
style="color:rgb(163,21,21)">&quot;%s&quot;</span>, m);</div><div>        \
args-&gt;mthod_cb[i].cb = va_arg(vargs, <span style="color:rgb(0,0,255)">void</span> \
*);</div><div>    }</div><div>    va_end(vargs);</div><br><div>    <span \
style="color:rgb(0,0,255)">if</span> (pthread_create (&amp;dbus_client_rx_thread, \
NULL, dbus_client_receive_thread, (<span style="color:rgb(0,0,255)">void</span> \
*)args) != <span style="color:rgb(0,114,0)">0</span>)</div><div>    {</div><div>      \
floge(<span style="color:rgb(163,21,21)">&quot;dbustest.log&quot;</span>,<span \
style="color:rgb(163,21,21)">&quot;%s:%d Client Error: Rx Thread creation failed; \
errno = %d (%s)&quot;</span>,__func__,__LINE__, errno, strerror(errno));</div><div>   \
<span style="color:rgb(0,0,255)">return</span> -<span \
style="color:rgb(0,114,0)">1</span>;</div><div>    }</div><br><div>    <span \
style="color:rgb(0,114,0)">/* TODO: Detach dbus_client_receive_thread. (or exit self \
in the created thread)</span></div><div><span style="color:rgb(0,114,0)">     * \
Cannot be joined here as it will block the client process.</span></div><div><span \
style="color:rgb(0,114,0)">     */</span></div><div>    flogd(<span \
style="color:rgb(163,21,21)">&quot;dbustest.log&quot;</span>,<span \
style="color:rgb(163,21,21)">&quot;%s:%d \
exit&quot;</span>,__func__,__LINE__);</div><div>    <span \
style="color:rgb(0,0,255)">return</span> <span \
style="color:rgb(0,114,0)">0</span>;</div><div>}</div></div> <br></div><div>Please \
correct me, if anything is missing in my implementation. \
</div><div><br></div><div><br></div><div>Regards,</div><div>Deepak Jewargi \
</div><div>

</div></div></div><div><br></div><div><br></div></div>



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic