(linenum→info "unix/slp.c:2238")

dbus/1.0.2/test/test-utils.c

    1: #include "test-utils.h"
    2: 
    3: typedef struct
    4: {
    5:   DBusLoop *loop;
    6:   DBusConnection *connection;
    7: 
    8: } CData;
    9: 
   10: static dbus_bool_t
   11: connection_watch_callback (DBusWatch     *watch,
   12:                            unsigned int   condition,
   13:                            void          *data)
   14: {
   15:   return dbus_watch_handle (watch, condition);
   16: }
   17: 
   18: static dbus_bool_t
   19: add_watch (DBusWatch *watch,
   20:            void      *data)
   21: {
   22:   CData *cd = data;
   23: 
   24:   return _dbus_loop_add_watch (cd->loop,
   25:                                watch,
   26:                                connection_watch_callback,
   27:                                cd, NULL);
   28: }
   29: 
   30: static void
   31: remove_watch (DBusWatch *watch,
   32:               void      *data)
   33: {
   34:   CData *cd = data;
   35:   
   36:   _dbus_loop_remove_watch (cd->loop,
   37:                            watch, connection_watch_callback, cd);  
   38: }
   39: 
   40: static void
   41: connection_timeout_callback (DBusTimeout   *timeout,
   42:                              void          *data)
   43: {
   44:   /* Can return FALSE on OOM but we just let it fire again later */
   45:   dbus_timeout_handle (timeout);
   46: }
   47: 
   48: static dbus_bool_t
   49: add_timeout (DBusTimeout *timeout,
   50:              void        *data)
   51: {
   52:   CData *cd = data;
   53: 
   54:   return _dbus_loop_add_timeout (cd->loop,
   55:                                  timeout, connection_timeout_callback, cd, NULL);
   56: }
   57: 
   58: static void
   59: remove_timeout (DBusTimeout *timeout,
   60:                 void        *data)
   61: {
   62:   CData *cd = data;
   63: 
   64:   _dbus_loop_remove_timeout (cd->loop,
   65:                              timeout, connection_timeout_callback, cd);
   66: }
   67: 
   68: static void
   69: dispatch_status_function (DBusConnection    *connection,
   70:                           DBusDispatchStatus new_status,
   71:                           void              *data)
   72: {
   73:   DBusLoop *loop = data;
   74:   
   75:   if (new_status != DBUS_DISPATCH_COMPLETE)
   76:     {
   77:       while (!_dbus_loop_queue_dispatch (loop, connection))
   78:         _dbus_wait_for_memory ();
   79:     }
   80: }
   81: 
   82: static void
   83: cdata_free (void *data)
   84: {
   85:   CData *cd = data;
   86: 
   87:   dbus_connection_unref (cd->connection);
   88:   _dbus_loop_unref (cd->loop);
   89:   
   90:   dbus_free (cd);
   91: }
   92: 
   93: static CData*
   94: cdata_new (DBusLoop       *loop,
   95:            DBusConnection *connection)
   96: {
   97:   CData *cd;
   98: 
   99:   cd = dbus_new0 (CData, 1);
  100:   if (cd == NULL)
  101:     return NULL;
  102: 
  103:   cd->loop = loop;
  104:   cd->connection = connection;
  105: 
  106:   dbus_connection_ref (cd->connection);
  107:   _dbus_loop_ref (cd->loop);
  108: 
  109:   return cd;
  110: }
  111: 
  112: dbus_bool_t
  113: test_connection_setup (DBusLoop       *loop,
  114:                        DBusConnection *connection)
  115: {
  116:   CData *cd;
  117: 
  118:   cd = NULL;
  119:   
  120:   dbus_connection_set_dispatch_status_function (connection, dispatch_status_function,
  121:                                                 loop, NULL);
  122:   
  123:   cd = cdata_new (loop, connection);
  124:   if (cd == NULL)
  125:     goto nomem;
  126: 
  127:   /* Because dbus-mainloop.c checks dbus_timeout_get_enabled(),
  128:    * dbus_watch_get_enabled() directly, we don't have to provide
  129:    * "toggled" callbacks.
  130:    */
  131:   
  132:   if (!dbus_connection_set_watch_functions (connection,
  133:                                             add_watch,
  134:                                             remove_watch,
  135:                                             NULL,
  136:                                             cd, cdata_free))
  137:     goto nomem;
  138: 
  139: 
  140:   cd = cdata_new (loop, connection);
  141:   if (cd == NULL)
  142:     goto nomem;
  143:   
  144:   if (!dbus_connection_set_timeout_functions (connection,
  145:                                               add_timeout,
  146:                                               remove_timeout,
  147:                                               NULL,
  148:                                               cd, cdata_free))
  149:     goto nomem;
  150: 
  151:   if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE)
  152:     {
  153:       if (!_dbus_loop_queue_dispatch (loop, connection))
  154:         goto nomem;
  155:     }
  156:   
  157:   return TRUE;
  158:   
  159:  nomem:
  160:   if (cd)
  161:     cdata_free (cd);
  162:   
  163:   dbus_connection_set_dispatch_status_function (connection, NULL, NULL, NULL);
  164:   dbus_connection_set_watch_functions (connection, NULL, NULL, NULL, NULL, NULL);
  165:   dbus_connection_set_timeout_functions (connection, NULL, NULL, NULL, NULL, NULL);
  166:   
  167:   return FALSE;
  168: }
  169: 
  170: void
  171: test_connection_shutdown (DBusLoop       *loop,
  172:                           DBusConnection *connection)
  173: {
  174:   if (!dbus_connection_set_watch_functions (connection,
  175:                                             NULL,
  176:                                             NULL,
  177:                                             NULL,
  178:                                             NULL, NULL))
  179:     _dbus_assert_not_reached ("setting watch functions to NULL failed");
  180:   
  181:   if (!dbus_connection_set_timeout_functions (connection,
  182:                                               NULL,
  183:                                               NULL,
  184:                                               NULL,
  185:                                               NULL, NULL))
  186:     _dbus_assert_not_reached ("setting timeout functions to NULL failed");
  187: 
  188:   dbus_connection_set_dispatch_status_function (connection, NULL, NULL, NULL);
  189: }
Syntax (Markdown)