1 /* vi:set et ai sw=2 sts=2 ts=2: */
3 * Copyright (c) 2012 GENIVI.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
14 #include <systemd/sd-daemon.h>
16 #include <glib-object.h>
19 #include <common/watchdog-client.h>
23 /* property identifiers */
32 static void watchdog_client_constructed (GObject *object);
33 static void watchdog_client_finalize (GObject *object);
34 static void watchdog_client_get_property (GObject *object,
38 static void watchdog_client_set_property (GObject *object,
42 static gboolean watchdog_client_timeout (gpointer user_data);
46 struct _WatchdogClientClass
48 GObjectClass __parent__;
51 struct _WatchdogClient
61 G_DEFINE_TYPE (WatchdogClient, watchdog_client, G_TYPE_OBJECT);
66 watchdog_client_class_init (WatchdogClientClass *klass)
68 GObjectClass *gobject_class;
70 gobject_class = G_OBJECT_CLASS (klass);
71 gobject_class->constructed = watchdog_client_constructed;
72 gobject_class->finalize = watchdog_client_finalize;
73 gobject_class->get_property = watchdog_client_get_property;
74 gobject_class->set_property = watchdog_client_set_property;
76 g_object_class_install_property (gobject_class,
78 g_param_spec_uint ("timeout",
83 G_PARAM_CONSTRUCT_ONLY));
89 watchdog_client_init (WatchdogClient *client)
96 watchdog_client_constructed (GObject *object)
98 WatchdogClient *client = WATCHDOG_CLIENT (object);
100 /* trigger a systemd watchdog timestap update now */
101 watchdog_client_timeout (client);
103 /* schedule a regular timeout to update the systemd watchdog timestamp */
104 client->timeout_id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT,
106 watchdog_client_timeout,
107 g_object_ref (client),
108 (GDestroyNotify) g_object_unref);
114 watchdog_client_finalize (GObject *object)
116 WatchdogClient *client = WATCHDOG_CLIENT (object);
118 /* drop the watchdog timeout */
119 if (client->timeout_id > 0)
120 g_source_remove (client->timeout_id);
122 (*G_OBJECT_CLASS (watchdog_client_parent_class)->finalize) (object);
128 watchdog_client_get_property (GObject *object,
133 WatchdogClient *client = WATCHDOG_CLIENT (object);
138 g_value_set_uint (value, client->timeout);
141 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
149 watchdog_client_set_property (GObject *object,
154 WatchdogClient *client = WATCHDOG_CLIENT (object);
159 client->timeout = g_value_get_uint (value);
162 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
170 watchdog_client_timeout (gpointer user_data)
172 WatchdogClient *client = WATCHDOG_CLIENT (user_data);
174 sd_notify (0, "WATCHDOG=1");
182 watchdog_client_new (guint timeout)
184 return g_object_new (TYPE_WATCHDOG_CLIENT, "timeout", timeout, NULL);