8b09a88bced626607936a7bfb0c6579668706f9b
[profile/ivi/node-startup-controller.git] / common / watchdog-client.c
1 /* vi:set et ai sw=2 sts=2 ts=2: */
2 /* -
3  * Copyright (c) 2012 GENIVI.
4  *
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/.
8  */
9
10 #ifdef HAVE_CONFIG_H
11 #include <config.h>
12 #endif
13
14 #include <systemd/sd-daemon.h>
15
16 #include <glib-object.h>
17 #include <gio/gio.h>
18
19 #include <common/watchdog-client.h>
20
21
22
23 /* property identifiers */
24 enum
25 {
26   PROP_0,
27   PROP_TIMEOUT,
28 };
29
30
31
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,
35                                               guint         prop_id,
36                                               GValue       *value,
37                                               GParamSpec   *pspec);
38 static void     watchdog_client_set_property (GObject      *object,
39                                               guint         prop_id,
40                                               const GValue *value,
41                                               GParamSpec   *pspec);
42 static gboolean watchdog_client_timeout      (gpointer      user_data);
43
44
45
46 struct _WatchdogClientClass
47 {
48   GObjectClass __parent__;
49 };
50
51 struct _WatchdogClient
52 {
53   GObject          __parent__;
54
55   guint            timeout;
56   guint            timeout_id;
57 };
58
59
60
61 G_DEFINE_TYPE (WatchdogClient, watchdog_client, G_TYPE_OBJECT);
62
63
64
65 static void
66 watchdog_client_class_init (WatchdogClientClass *klass)
67 {
68   GObjectClass *gobject_class;
69
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;
75
76   g_object_class_install_property (gobject_class,
77                                    PROP_TIMEOUT,
78                                    g_param_spec_uint ("timeout",
79                                                       "timeout",
80                                                       "timeout",
81                                                       0, G_MAXUINT, 120,
82                                                       G_PARAM_READWRITE |
83                                                       G_PARAM_CONSTRUCT_ONLY));
84 }
85
86
87
88 static void
89 watchdog_client_init (WatchdogClient *client)
90 {
91 }
92
93
94
95 static void
96 watchdog_client_constructed (GObject *object)
97 {
98   WatchdogClient *client = WATCHDOG_CLIENT (object);
99
100   /* trigger a systemd watchdog timestap update now */
101   watchdog_client_timeout (client);
102
103   /* schedule a regular timeout to update the systemd watchdog timestamp */
104   client->timeout_id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT,
105                                                    client->timeout,
106                                                    watchdog_client_timeout,
107                                                    g_object_ref (client),
108                                                    (GDestroyNotify) g_object_unref);
109 }
110
111
112
113 static void
114 watchdog_client_finalize (GObject *object)
115 {
116   WatchdogClient *client = WATCHDOG_CLIENT (object);
117
118   /* drop the watchdog timeout */
119   if (client->timeout_id > 0)
120     g_source_remove (client->timeout_id);
121
122   (*G_OBJECT_CLASS (watchdog_client_parent_class)->finalize) (object);
123 }
124
125
126
127 static void
128 watchdog_client_get_property (GObject    *object,
129                               guint       prop_id,
130                               GValue     *value,
131                               GParamSpec *pspec)
132 {
133   WatchdogClient *client = WATCHDOG_CLIENT (object);
134
135   switch (prop_id)
136     {
137     case PROP_TIMEOUT:
138       g_value_set_uint (value, client->timeout);
139       break;
140     default:
141       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
142       break;
143     }
144 }
145
146
147
148 static void
149 watchdog_client_set_property (GObject      *object,
150                               guint         prop_id,
151                               const GValue *value,
152                               GParamSpec   *pspec)
153 {
154   WatchdogClient *client = WATCHDOG_CLIENT (object);
155
156   switch (prop_id)
157     {
158     case PROP_TIMEOUT:
159       client->timeout = g_value_get_uint (value);
160       break;
161     default:
162       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
163       break;
164     }
165 }
166
167
168
169 static gboolean
170 watchdog_client_timeout (gpointer user_data)
171 {
172   WatchdogClient *client = WATCHDOG_CLIENT (user_data);
173
174   sd_notify (0, "WATCHDOG=1");
175
176   return TRUE;
177 }
178
179
180
181 WatchdogClient *
182 watchdog_client_new (guint timeout)
183 {
184   return g_object_new (TYPE_WATCHDOG_CLIENT, "timeout", timeout, NULL);
185 }