26 #include "dbus-socket-set.h" 
   28 #include <dbus/dbus-internals.h> 
   29 #include <dbus/dbus-list.h> 
   30 #include <dbus/dbus-sysdeps.h> 
   31 #include <dbus/dbus-watch.h> 
   33 #ifndef DOXYGEN_SHOULD_SKIP_THIS 
   43 #define REALLOC_INCREMENT 8 
   44 #define MINIMUM_SIZE 8 
   47 #ifdef DBUS_ENABLE_EMBEDDED_TESTS 
   48 #define DEFAULT_SIZE_HINT 1 
   50 #define DEFAULT_SIZE_HINT MINIMUM_SIZE 
   53 static inline DBusSocketSetPoll *
 
   54 socket_set_poll_cast (DBusSocketSet *set)
 
   57   return (DBusSocketSetPoll *) set;
 
   62 socket_set_poll_free (DBusSocketSet *set)
 
   64   DBusSocketSetPoll *
self = socket_set_poll_cast (set);
 
   68   _dbus_verbose (
"freed socket set %p\n", 
self);
 
   72 _dbus_socket_set_poll_new (
int size_hint)
 
   74   DBusSocketSetPoll *ret;
 
   77     size_hint = DEFAULT_SIZE_HINT;
 
   84   ret->parent.cls = &_dbus_socket_set_poll_class;
 
   86   ret->n_allocated = size_hint;
 
   94       socket_set_poll_free ((DBusSocketSet *) ret);
 
   98   _dbus_verbose (
"new socket set at %p\n", ret);
 
   99   return (DBusSocketSet *) ret;
 
  103 watch_flags_to_poll_events (
unsigned int flags)
 
  116 socket_set_poll_add (DBusSocketSet  *set,
 
  121   DBusSocketSetPoll *
self = socket_set_poll_cast (set);
 
  122 #ifndef DBUS_DISABLE_ASSERT 
  125   for (i = 0; i < 
self->n_fds; i++)
 
  126     _dbus_assert (!_dbus_pollable_equals (self->fds[i].fd, fd));
 
  129   if (self->n_reserved >= self->n_allocated)
 
  132           sizeof (
DBusPollFD) * (self->n_allocated + REALLOC_INCREMENT));
 
  134       _dbus_verbose (
"inflating set %p from %d en/%d res/%d alloc to %d\n",
 
  135                      self, self->n_fds, self->n_reserved, self->n_allocated,
 
  136                      self->n_allocated + REALLOC_INCREMENT);
 
  142       self->n_allocated += REALLOC_INCREMENT;
 
  145   _dbus_verbose (
"before adding fd %" DBUS_POLLABLE_FORMAT 
" to %p, %d en/%d res/%d alloc\n",
 
  146                  _dbus_pollable_printable (fd), 
self, self->n_fds, self->n_reserved, self->n_allocated);
 
  154       self->fds[
self->n_fds].fd = fd;
 
  155       self->fds[
self->n_fds].events = watch_flags_to_poll_events (flags);
 
  163 socket_set_poll_enable (DBusSocketSet *set,
 
  167   DBusSocketSetPoll *
self = socket_set_poll_cast (set);
 
  170   for (i = 0; i < 
self->n_fds; i++)
 
  172       if (_dbus_pollable_equals (self->fds[i].fd, fd))
 
  174           self->fds[i].events = watch_flags_to_poll_events (flags);
 
  183   self->fds[
self->n_fds].fd = fd;
 
  184   self->fds[
self->n_fds].events = watch_flags_to_poll_events (flags);
 
  189 socket_set_poll_disable (DBusSocketSet *set,
 
  192   DBusSocketSetPoll *
self = socket_set_poll_cast (set);
 
  195   for (i = 0; i < 
self->n_fds; i++)
 
  197       if (_dbus_pollable_equals (self->fds[i].fd, fd))
 
  199           if (i != self->n_fds - 1)
 
  201               self->fds[i].fd = 
self->fds[
self->n_fds - 1].fd;
 
  202               self->fds[i].events = 
self->fds[
self->n_fds - 1].events;
 
  212 socket_set_poll_remove (DBusSocketSet *set,
 
  215   DBusSocketSetPoll *
self = socket_set_poll_cast (set);
 
  217   socket_set_poll_disable (set, fd);
 
  220   _dbus_verbose (
"after removing fd %" DBUS_POLLABLE_FORMAT 
" from %p, %d en/%d res/%d alloc\n",
 
  221                  _dbus_pollable_printable (fd), 
self, self->n_fds, self->n_reserved, self->n_allocated);
 
  225   if (self->n_reserved + MINIMUM_SIZE < self->n_allocated / 2)
 
  230           sizeof (
DBusPollFD) * (self->n_reserved + MINIMUM_SIZE));
 
  232       _dbus_verbose (
"before deflating %p, %d en/%d res/%d alloc\n",
 
  233                      self, self->n_fds, self->n_reserved, self->n_allocated);
 
  235       if (_DBUS_UNLIKELY (new_fds == 
NULL))
 
  242       self->n_allocated = 
self->n_reserved;
 
  247 watch_flags_from_poll_revents (
short revents)
 
  249   unsigned int condition = 0;
 
  261     condition |= _DBUS_WATCH_NVAL;
 
  269 socket_set_poll_poll (DBusSocketSet   *set,
 
  270                       DBusSocketEvent *revents,
 
  274   DBusSocketSetPoll *
self = socket_set_poll_cast (set);
 
  281   for (i = 0; i < 
self->n_fds; i++)
 
  282     self->fds[i].revents = 0;
 
  284   n_ready = 
_dbus_poll (self->fds, self->n_fds, timeout_ms);
 
  291   for (i = 0; i < 
self->n_fds; i++)
 
  293       if (self->fds[i].revents != 0)
 
  295           revents[n_events].fd = 
self->fds[i].fd;
 
  296           revents[n_events].flags = watch_flags_from_poll_revents (self->fds[i].revents);
 
  303           if (n_events == max_events)
 
  311 DBusSocketSetClass _dbus_socket_set_poll_class = {
 
  312     socket_set_poll_free,
 
  314     socket_set_poll_remove,
 
  315     socket_set_poll_enable,
 
  316     socket_set_poll_disable,