Magellan Linux

Contents of /trunk/hal/patches/hal-0.5.10-use-g_slice-for-hotplug-events.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 597 - (show annotations) (download)
Mon May 19 19:05:19 2008 UTC (15 years, 11 months ago) by niro
File size: 14498 byte(s)
-gentoo patches

1 From cd5de1b7be2bc761fd4319321a6985da20124b89 Mon Sep 17 00:00:00 2001
2 From: Rob Taylor <rob.taylor@codethink.co.uk>
3 Date: Mon, 19 Nov 2007 16:17:27 +0000
4 Subject: [PATCH] use g_slice for hotplug events
5
6 Using g_slice should be better (and makes for cleaner code) than our current
7 HotplugEvent pool.
8 ---
9 hald/linux/acpi.c | 8 +++---
10 hald/linux/apm.c | 8 +++---
11 hald/linux/blockdev.c | 12 ++++++----
12 hald/linux/coldplug.c | 52 +++++++++++-------------------------------------
13 hald/linux/device.c | 6 ++--
14 hald/linux/hotplug.c | 6 +----
15 hald/linux/hotplug.h | 3 --
16 hald/linux/osspec.c | 4 +-
17 8 files changed, 33 insertions(+), 66 deletions(-)
18
19 diff --git a/hald/linux/acpi.c b/hald/linux/acpi.c
20 index cc97f15..e995d70 100644
21 --- a/hald/linux/acpi.c
22 +++ b/hald/linux/acpi.c
23 @@ -727,7 +727,7 @@ acpi_synthesize_item (const gchar *fullpath, int acpi_type)
24 {
25 HotplugEvent *hotplug_event;
26 HAL_INFO (("Processing %s", fullpath));
27 - hotplug_event = g_new0 (HotplugEvent, 1);
28 + hotplug_event = g_slice_new0 (HotplugEvent);
29 hotplug_event->action = HOTPLUG_ACTION_ADD;
30 hotplug_event->type = HOTPLUG_EVENT_ACPI;
31 g_strlcpy (hotplug_event->acpi.acpi_path, fullpath, sizeof (hotplug_event->acpi.acpi_path));
32 @@ -855,7 +855,7 @@ acpi_synthesize_sonypi_display (void)
33 if (!found)
34 return;
35
36 - hotplug_event = g_new0 (HotplugEvent, 1);
37 + hotplug_event = g_slice_new0 (HotplugEvent);
38 hotplug_event->action = HOTPLUG_ACTION_ADD;
39 hotplug_event->type = HOTPLUG_EVENT_ACPI;
40 g_strlcpy (hotplug_event->acpi.acpi_path, path, sizeof (hotplug_event->acpi.acpi_path));
41 @@ -1253,7 +1253,7 @@ acpi_generate_add_hotplug_event (HalDevice *d)
42 acpi_path = hal_device_property_get_string (d, "linux.acpi_path");
43 acpi_type = hal_device_property_get_int (d, "linux.acpi_type");
44
45 - hotplug_event = g_new0 (HotplugEvent, 1);
46 + hotplug_event = g_slice_new0 (HotplugEvent);
47 hotplug_event->action = HOTPLUG_ACTION_ADD;
48 hotplug_event->type = HOTPLUG_EVENT_ACPI;
49 g_strlcpy (hotplug_event->acpi.acpi_path, acpi_path, sizeof (hotplug_event->acpi.acpi_path));
50 @@ -1271,7 +1271,7 @@ acpi_generate_remove_hotplug_event (HalDevice *d)
51 acpi_path = hal_device_property_get_string (d, "linux.acpi_path");
52 acpi_type = hal_device_property_get_int (d, "linux.acpi_type");
53
54 - hotplug_event = g_new0 (HotplugEvent, 1);
55 + hotplug_event = g_slice_new0 (HotplugEvent);
56 hotplug_event->action = HOTPLUG_ACTION_REMOVE;
57 hotplug_event->type = HOTPLUG_EVENT_ACPI;
58 g_strlcpy (hotplug_event->acpi.acpi_path, acpi_path, sizeof (hotplug_event->acpi.acpi_path));
59 diff --git a/hald/linux/apm.c b/hald/linux/apm.c
60 index 79c54ad..5993e43 100644
61 --- a/hald/linux/apm.c
62 +++ b/hald/linux/apm.c
63 @@ -297,14 +297,14 @@ apm_synthesize_hotplug_events (void)
64 /* Set appropriate properties on the computer object */
65 hal_device_property_set_string (computer, "power_management.type", "apm");
66
67 - hotplug_event = g_new0 (HotplugEvent, 1);
68 + hotplug_event = g_slice_new0 (HotplugEvent);
69 hotplug_event->action = HOTPLUG_ACTION_ADD;
70 hotplug_event->type = HOTPLUG_EVENT_APM;
71 g_strlcpy (hotplug_event->apm.apm_path, "/proc/apm", sizeof (hotplug_event->apm.apm_path));
72 hotplug_event->apm.apm_type = APM_TYPE_BATTERY;
73 hotplug_event_enqueue (hotplug_event);
74
75 - hotplug_event = g_new0 (HotplugEvent, 1);
76 + hotplug_event = g_slice_new0 (HotplugEvent);
77 hotplug_event->type = HOTPLUG_EVENT_APM;
78 g_strlcpy (hotplug_event->apm.apm_path, "/proc/apm", sizeof (hotplug_event->apm.apm_path));
79 hotplug_event->apm.apm_type = APM_TYPE_AC_ADAPTER;
80 @@ -514,7 +514,7 @@ apm_generate_add_hotplug_event (HalDevice *d)
81 apm_path = hal_device_property_get_string (d, "linux.apm_path");
82 apm_type = hal_device_property_get_int (d, "linux.apm_type");
83
84 - hotplug_event = g_new0 (HotplugEvent, 1);
85 + hotplug_event = g_slice_new0 (HotplugEvent);
86 hotplug_event->action = HOTPLUG_ACTION_ADD;
87 hotplug_event->type = HOTPLUG_EVENT_APM;
88 g_strlcpy (hotplug_event->apm.apm_path, apm_path, sizeof (hotplug_event->apm.apm_path));
89 @@ -532,7 +532,7 @@ apm_generate_remove_hotplug_event (HalDevice *d)
90 apm_path = hal_device_property_get_string (d, "linux.apm_path");
91 apm_type = hal_device_property_get_int (d, "linux.apm_type");
92
93 - hotplug_event = g_new0 (HotplugEvent, 1);
94 + hotplug_event = g_slice_new0 (HotplugEvent);
95 hotplug_event->action = HOTPLUG_ACTION_REMOVE;
96 hotplug_event->type = HOTPLUG_EVENT_APM;
97 g_strlcpy (hotplug_event->apm.apm_path, apm_path, sizeof (hotplug_event->apm.apm_path));
98 diff --git a/hald/linux/blockdev.c b/hald/linux/blockdev.c
99 index 46b5b58..e40b743 100644
100 --- a/hald/linux/blockdev.c
101 +++ b/hald/linux/blockdev.c
102 @@ -352,7 +352,7 @@ generate_fakevolume_hotplug_event_add_for_storage_device (HalDevice *d)
103
104 snprintf (fake_sysfs_path, sizeof(fake_sysfs_path), "%s/fakevolume", sysfs_path);
105
106 - hotplug_event = g_new0 (HotplugEvent, 1);
107 + hotplug_event = g_slice_new0 (HotplugEvent);
108 hotplug_event->action = HOTPLUG_ACTION_ADD;
109 hotplug_event->type = HOTPLUG_EVENT_SYSFS_BLOCK;
110 g_strlcpy (hotplug_event->sysfs.subsystem, "block", sizeof (hotplug_event->sysfs.subsystem));
111 @@ -942,6 +942,8 @@ hotplug_event_begin_add_blockdev (const gchar *sysfs_path, const gchar *device_f
112 is_device_mapper = TRUE;
113 }
114 }
115 + } else {
116 + HAL_INFO(("Couldn't find slave volume in devices"));
117 }
118 }
119 g_free (target);
120 @@ -1673,7 +1675,7 @@ blockdev_generate_add_hotplug_event (HalDevice *d)
121 serial = hal_device_property_get_string (d, "storage.serial");
122 revision = hal_device_property_get_string (d, "storage.firmware_revision");
123
124 - hotplug_event = g_new0 (HotplugEvent, 1);
125 + hotplug_event = g_slice_new0 (HotplugEvent);
126 hotplug_event->action = HOTPLUG_ACTION_ADD;
127 hotplug_event->type = HOTPLUG_EVENT_SYSFS;
128 g_strlcpy (hotplug_event->sysfs.subsystem, "block", sizeof (hotplug_event->sysfs.subsystem));
129 @@ -1698,7 +1700,7 @@ blockdev_generate_remove_hotplug_event (HalDevice *d)
130
131 sysfs_path = hal_device_property_get_string (d, "linux.sysfs_path");
132
133 - hotplug_event = g_new0 (HotplugEvent, 1);
134 + hotplug_event = g_slice_new0 (HotplugEvent);
135 hotplug_event->action = HOTPLUG_ACTION_REMOVE;
136 hotplug_event->type = HOTPLUG_EVENT_SYSFS;
137 g_strlcpy (hotplug_event->sysfs.subsystem, "block", sizeof (hotplug_event->sysfs.subsystem));
138 @@ -1826,7 +1828,7 @@ blockdev_process_mdstat (void)
139 } else {
140 HAL_INFO (("Adding md device at '%s' ('%s')", sysfs_path, device_file));
141
142 - hotplug_event = g_new0 (HotplugEvent, 1);
143 + hotplug_event = g_slice_new0 (HotplugEvent);
144 hotplug_event->action = HOTPLUG_ACTION_ADD;
145 hotplug_event->type = HOTPLUG_EVENT_SYSFS_BLOCK;
146 g_strlcpy (hotplug_event->sysfs.subsystem, "block", sizeof (hotplug_event->sysfs.subsystem));
147 @@ -1879,7 +1881,7 @@ blockdev_process_mdstat (void)
148
149 HAL_INFO (("Removing md device at '%s' ('%s')", sysfs_path, device_file));
150
151 - hotplug_event = g_new0 (HotplugEvent, 1);
152 + hotplug_event = g_slice_new0 (HotplugEvent);
153 hotplug_event->action = HOTPLUG_ACTION_REMOVE;
154 hotplug_event->type = HOTPLUG_EVENT_SYSFS_BLOCK;
155 g_strlcpy (hotplug_event->sysfs.subsystem, "block", sizeof (hotplug_event->sysfs.subsystem));
156 diff --git a/hald/linux/coldplug.c b/hald/linux/coldplug.c
157 index 30949ca..5538aff 100644
158 --- a/hald/linux/coldplug.c
159 +++ b/hald/linux/coldplug.c
160 @@ -56,6 +56,11 @@ static GHashTable *sysfs_to_udev_map;
161 static GSList *device_list;
162 static char dev_root[HAL_PATH_MAX];
163
164 +static void hotplug_event_free (HotplugEvent *ev)
165 +{
166 + g_slice_free(HotplugEvent, ev);
167 +}
168 +
169 static gboolean
170 hal_util_init_sysfs_to_udev_map (void)
171 {
172 @@ -66,7 +71,7 @@ hal_util_init_sysfs_to_udev_map (void)
173 HotplugEvent *hotplug_event = NULL;
174 char *p;
175
176 - sysfs_to_udev_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
177 + sysfs_to_udev_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, hotplug_event_free);
178
179 /* get udevroot */
180 if (g_spawn_sync ("/", udevroot_argv, NULL, 0, NULL, NULL,
181 @@ -132,7 +137,7 @@ hal_util_init_sysfs_to_udev_map (void)
182
183 /* new device */
184 if (strncmp(line, "P: ", 3) == 0) {
185 - hotplug_event = g_new0 (HotplugEvent, 1);
186 + hotplug_event = g_slice_new0 (HotplugEvent);
187 g_strlcpy (hotplug_event->sysfs.sysfs_path, "/sys", sizeof(hotplug_event->sysfs.sysfs_path));
188 g_strlcat (hotplug_event->sysfs.sysfs_path, &line[3], sizeof(hotplug_event->sysfs.sysfs_path));
189 continue;
190 @@ -203,22 +208,6 @@ error:
191 return FALSE;
192 }
193
194 -static HotplugEvent *pool = NULL;
195 -static int pool_next_free = 0;
196 -static int pool_num_freed = 0;
197 -static int pool_size = 1000;
198 -
199 -static void
200 -pool_free (gpointer data)
201 -{
202 - HAL_INFO (("pool_num_freed = %d (of %d)", pool_num_freed, pool_next_free));
203 - pool_num_freed++;
204 - if (pool_num_freed == pool_next_free) {
205 - HAL_INFO (("Freeing whole pool"));
206 - g_free (pool);
207 - }
208 -}
209 -
210 static HotplugEvent
211 *coldplug_get_hotplug_event(const gchar *sysfs_path, const gchar *subsystem, HotplugEventType type)
212 {
213 @@ -226,30 +215,13 @@ static HotplugEvent
214 const char *pos;
215 gchar path[HAL_PATH_MAX];
216 struct stat statbuf;
217 - gboolean from_pool = FALSE;
218 -
219 - /* TODO: FIXME: this is experimental code */
220 - if (pool == NULL) {
221 - pool = g_new0 (HotplugEvent, pool_size);
222 - pool_next_free = 0;
223 - pool_num_freed = 0;
224 - }
225
226 - if (pool_next_free >= pool_size) {
227 - hotplug_event = g_new0 (HotplugEvent, 1);
228 - } else {
229 - from_pool = TRUE;
230 - hotplug_event = pool + pool_next_free++;
231 - hotplug_event->free_function = pool_free;
232 - }
233 + hotplug_event = g_slice_new0 (HotplugEvent);
234
235 /* lookup if udev has something stored in its database */
236 hotplug_event_udev = (HotplugEvent *) g_hash_table_lookup (sysfs_to_udev_map, sysfs_path);
237 if (hotplug_event_udev != NULL) {
238 memcpy(hotplug_event, hotplug_event_udev, sizeof(HotplugEvent));
239 - if (from_pool) {
240 - hotplug_event->free_function = pool_free;
241 - }
242 HAL_INFO (("new event (dev node from udev) '%s' '%s'", hotplug_event->sysfs.sysfs_path, hotplug_event->sysfs.device_file));
243 } else {
244 /* device is not in udev database */
245 @@ -301,7 +273,7 @@ static int device_list_insert(const char *path, const char *subsystem,
246 if (!(statbuf.st_mode & S_IWUSR))
247 goto error;
248
249 - sysfs_dev = g_new0 (struct sysfs_device, 1);
250 + sysfs_dev = g_slice_new0 (struct sysfs_device);
251 if (sysfs_dev == NULL)
252 goto error;
253
254 @@ -326,11 +298,11 @@ static int device_list_insert(const char *path, const char *subsystem,
255 sysfs_dev->path = g_strdup (path);
256 found:
257 sysfs_dev->subsystem = g_strdup (subsystem);
258 - device_list = g_slist_prepend (device_list, sysfs_dev);
259 + device_list = g_slist_append (device_list, sysfs_dev);
260 return 0;
261
262 error:
263 - g_free (sysfs_dev);
264 + g_slice_free (struct sysfs_device, sysfs_dev);
265 return -1;
266 }
267
268 @@ -512,7 +484,7 @@ static void queue_events(void)
269
270 g_free (sysfs_dev->path);
271 g_free (sysfs_dev->subsystem);
272 - g_free (sysfs_dev);
273 + g_slice_free (struct sysfs_device, sysfs_dev);
274 }
275
276 g_slist_free (device_list);
277 diff --git a/hald/linux/device.c b/hald/linux/device.c
278 index a59107f..cd7bc9e 100644
279 --- a/hald/linux/device.c
280 +++ b/hald/linux/device.c
281 @@ -727,7 +727,7 @@ missing_scsi_host (const gchar *sysfs_path, HotplugEvent *device_event, HotplugA
282
283 /* fake host event */
284 rc = TRUE;
285 - host_event = g_new0 (HotplugEvent, 1);
286 + host_event = g_slice_new0 (HotplugEvent);
287 host_event->action = action;
288 host_event->type = HOTPLUG_EVENT_SYSFS_DEVICE;
289 g_strlcpy (host_event->sysfs.subsystem, "scsi_host", sizeof (host_event->sysfs.subsystem));
290 @@ -4085,7 +4085,7 @@ dev_generate_add_hotplug_event (HalDevice *d)
291 sysfs_path = hal_device_property_get_string (d, "linux.sysfs_path");
292 device_file = hal_device_property_get_string (d, "linux.device_file");
293
294 - hotplug_event = g_new0 (HotplugEvent, 1);
295 + hotplug_event = g_slice_new0 (HotplugEvent);
296 hotplug_event->action = HOTPLUG_ACTION_ADD;
297 hotplug_event->type = HOTPLUG_EVENT_SYSFS;
298 g_strlcpy (hotplug_event->sysfs.subsystem, subsystem, sizeof (hotplug_event->sysfs.subsystem));
299 @@ -4109,7 +4109,7 @@ dev_generate_remove_hotplug_event (HalDevice *d)
300 subsystem = hal_device_property_get_string (d, "linux.subsystem");
301 sysfs_path = hal_device_property_get_string (d, "linux.sysfs_path");
302
303 - hotplug_event = g_new0 (HotplugEvent, 1);
304 + hotplug_event = g_slice_new0 (HotplugEvent);
305 hotplug_event->action = HOTPLUG_ACTION_REMOVE;
306 hotplug_event->type = HOTPLUG_EVENT_SYSFS;
307 g_strlcpy (hotplug_event->sysfs.subsystem, subsystem, sizeof (hotplug_event->sysfs.subsystem));
308 diff --git a/hald/linux/hotplug.c b/hald/linux/hotplug.c
309 index 56db041..2dbc731 100644
310 --- a/hald/linux/hotplug.c
311 +++ b/hald/linux/hotplug.c
312 @@ -62,11 +62,7 @@ hotplug_event_end (void *end_token)
313
314 hotplug_events_in_progress = g_slist_remove (hotplug_events_in_progress, hotplug_event);
315
316 - if (hotplug_event->free_function != NULL) {
317 - hotplug_event->free_function (hotplug_event);
318 - } else {
319 - g_free (hotplug_event);
320 - }
321 + g_slice_free (HotplugEvent, hotplug_event);
322 }
323
324 void
325 diff --git a/hald/linux/hotplug.h b/hald/linux/hotplug.h
326 index 27dc9d5..06a32a5 100644
327 --- a/hald/linux/hotplug.h
328 +++ b/hald/linux/hotplug.h
329 @@ -57,9 +57,6 @@ typedef struct
330 HotplugActionType action; /* Whether the event is add or remove */
331 HotplugEventType type; /* Type of event */
332 gboolean reposted; /* Avoid loops */
333 -
334 - void (*free_function) (gpointer data);
335 -
336 union {
337 struct {
338 char subsystem[HAL_NAME_MAX]; /* Kernel subsystem the device belongs to */
339 diff --git a/hald/linux/osspec.c b/hald/linux/osspec.c
340 index d7a8672..9ba1a5c 100644
341 --- a/hald/linux/osspec.c
342 +++ b/hald/linux/osspec.c
343 @@ -121,7 +121,7 @@ hald_udev_data (GIOChannel *source, GIOCondition condition, gpointer user_data)
344 goto out;
345 }
346
347 - hotplug_event = g_new0 (HotplugEvent, 1);
348 + hotplug_event = g_slice_new0 (HotplugEvent);
349 hotplug_event->type = HOTPLUG_EVENT_SYSFS;
350
351 while (bufpos < sizeof (buf)) {
352 @@ -263,7 +263,7 @@ hald_udev_data (GIOChannel *source, GIOCondition condition, gpointer user_data)
353 }
354
355 invalid:
356 - g_free (hotplug_event);
357 + g_slice_free (HotplugEvent, hotplug_event);
358
359 out:
360 return TRUE;
361 --
362 1.5.3.7
363