mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2026-01-13 19:00:22 +01:00
The code counting pending fds relied on restart of timeouts when they are enabled. This patch adds function that ensures that such enabled timeouts have their timekeeping data reset (and not only when timeout is registered into event loop processing). When timeouts weren't reset, they'd fire at rather random and mainly incorrect moments leading to interruption of connections of dbus-daemon. Every time we reset the interval, we also need to re-enable the timeout and mark its end time to be recalculated by the event loop, so combine the old set_enabled(TRUE) with set_interval() as a new restart() method. This leaves all the set_enabled() calls having a FALSE parameter, so remove the parameter and rename the method to disable(). [smcv: fix minor coding style issues] [smcv: replace set_reenabled()/set_interval() pair with restart()] [smcv: replace set_enabled(FALSE) with disable()] Bug: https://bugs.freedesktop.org/show_bug.cgi?id=95619 Signed-off-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
82 lines
3.3 KiB
C
82 lines
3.3 KiB
C
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
/* dbus-timeout.h DBusTimeout internal interfaces
|
|
*
|
|
* Copyright (C) 2003 CodeFactory AB
|
|
*
|
|
* Licensed under the Academic Free License version 2.1
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
#ifndef DBUS_TIMEOUT_H
|
|
#define DBUS_TIMEOUT_H
|
|
|
|
#include <dbus/dbus-connection.h>
|
|
#include <dbus/dbus-internals.h>
|
|
|
|
DBUS_BEGIN_DECLS
|
|
|
|
/**
|
|
* @addtogroup DBusTimeoutInternals
|
|
* @{
|
|
*/
|
|
|
|
/* Public methods on DBusTimeout are in dbus-connection.h */
|
|
|
|
typedef struct DBusTimeoutList DBusTimeoutList;
|
|
|
|
/** function to run when the timeout is handled */
|
|
typedef dbus_bool_t (* DBusTimeoutHandler) (void *data);
|
|
|
|
DBUS_PRIVATE_EXPORT
|
|
DBusTimeout* _dbus_timeout_new (int interval,
|
|
DBusTimeoutHandler handler,
|
|
void *data,
|
|
DBusFreeFunction free_data_function);
|
|
DBusTimeout* _dbus_timeout_ref (DBusTimeout *timeout);
|
|
DBUS_PRIVATE_EXPORT
|
|
void _dbus_timeout_unref (DBusTimeout *timeout);
|
|
DBUS_PRIVATE_EXPORT
|
|
void _dbus_timeout_restart (DBusTimeout *timeout,
|
|
int interval);
|
|
DBUS_PRIVATE_EXPORT
|
|
void _dbus_timeout_disable (DBusTimeout *timeout);
|
|
|
|
DBusTimeoutList *_dbus_timeout_list_new (void);
|
|
void _dbus_timeout_list_free (DBusTimeoutList *timeout_list);
|
|
dbus_bool_t _dbus_timeout_list_set_functions (DBusTimeoutList *timeout_list,
|
|
DBusAddTimeoutFunction add_function,
|
|
DBusRemoveTimeoutFunction remove_function,
|
|
DBusTimeoutToggledFunction toggled_function,
|
|
void *data,
|
|
DBusFreeFunction free_data_function);
|
|
dbus_bool_t _dbus_timeout_list_add_timeout (DBusTimeoutList *timeout_list,
|
|
DBusTimeout *timeout);
|
|
void _dbus_timeout_list_remove_timeout (DBusTimeoutList *timeout_list,
|
|
DBusTimeout *timeout);
|
|
void _dbus_timeout_list_toggle_timeout (DBusTimeoutList *timeout_list,
|
|
DBusTimeout *timeout,
|
|
dbus_bool_t enabled);
|
|
|
|
DBUS_PRIVATE_EXPORT
|
|
dbus_bool_t _dbus_timeout_needs_restart (DBusTimeout *timeout);
|
|
DBUS_PRIVATE_EXPORT
|
|
void _dbus_timeout_restarted (DBusTimeout *timeout);
|
|
|
|
/** @} */
|
|
|
|
DBUS_END_DECLS
|
|
|
|
#endif /* DBUS_TIMEOUT_H */
|