Implement org.genivi.LUCHandler1.Deregister()
[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                                                       G_PARAM_STATIC_STRINGS));
85 }
86
87
88
89 static void
90 watchdog_client_init (WatchdogClient *client)
91 {
92 }
93
94
95
96 static void
97 watchdog_client_constructed (GObject *object)
98 {
99   WatchdogClient *client = WATCHDOG_CLIENT (object);
100
101   /* trigger a systemd watchdog timestap update now */
102   watchdog_client_timeout (client);
103
104   /* schedule a regular timeout to update the systemd watchdog timestamp */
105   client->timeout_id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT,
106                                                    client->timeout,
107                                                    watchdog_client_timeout,
108                                                    g_object_ref (client),
109                                                    (GDestroyNotify) g_object_unref);
110 }
111
112
113
114 static void
115 watchdog_client_finalize (GObject *object)
116 {
117   WatchdogClient *client = WATCHDOG_CLIENT (object);
118
119   /* drop the watchdog timeout */
120   if (client->timeout_id > 0)
121     g_source_remove (client->timeout_id);
122
123   (*G_OBJECT_CLASS (watchdog_client_parent_class)->finalize) (object);
124 }
125
126
127
128 static void
129 watchdog_client_get_property (GObject    *object,
130                               guint       prop_id,
131                               GValue     *value,
132                               GParamSpec *pspec)
133 {
134   WatchdogClient *client = WATCHDOG_CLIENT (object);
135
136   switch (prop_id)
137     {
138     case PROP_TIMEOUT:
139       g_value_set_uint (value, client->timeout);
140       break;
141     default:
142       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
143       break;
144     }
145 }
146
147
148
149 static void
150 watchdog_client_set_property (GObject      *object,
151                               guint         prop_id,
152                               const GValue *value,
153                               GParamSpec   *pspec)
154 {
155   WatchdogClient *client = WATCHDOG_CLIENT (object);
156
157   switch (prop_id)
158     {
159     case PROP_TIMEOUT:
160       client->timeout = g_value_get_uint (value);
161       break;
162     default:
163       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
164       break;
165     }
166 }
167
168
169
170 static gboolean
171 watchdog_client_timeout (gpointer user_data)
172 {
173   WatchdogClient *client = WATCHDOG_CLIENT (user_data);
174
175   sd_notify (0, "WATCHDOG=1");
176
177   return TRUE;
178 }
179
180
181
182 WatchdogClient *
183 watchdog_client_new (guint timeout)
184 {
185   return g_object_new (TYPE_WATCHDOG_CLIENT, "timeout", timeout, NULL);
186 }