[PATCH] threadsafe rules iteration

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Move ->current out of struct udev_rules and into a new struct udev_rules_iter.

Signed-off-by: Alan Jenkins <alan-jenkins@xxxxxxxxxxxxxx>

diff --git a/udev/udev_rules.c b/udev/udev_rules.c
index da7a62a..c21d762 100644
--- a/udev/udev_rules.c
+++ b/udev/udev_rules.c
@@ -1378,6 +1378,7 @@ nomatch:
 
 int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev)
 {
+	struct udev_rules_iter iter;
 	struct udev_rule *rule;
 	int name_set = 0;
 
@@ -1385,9 +1386,9 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev)
 	dbg("udev->dev->kernel='%s'\n", udev->dev->kernel);
 
 	/* look for a matching rule to apply */
-	udev_rules_iter_init(rules);
+	udev_rules_iter_init(&iter, rules);
 	while (1) {
-		rule = udev_rules_iter_next(rules);
+		rule = udev_rules_iter_next(&iter);
 		if (rule == NULL)
 			break;
 
@@ -1540,7 +1541,7 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev)
 
 			if (rule->goto_label.operation != KEY_OP_UNSET) {
 				dbg("moving forward to label '%s'\n", key_val(rule, &rule->goto_label));
-				udev_rules_iter_label(rules, key_val(rule, &rule->goto_label));
+				udev_rules_iter_label(&iter, key_val(rule, &rule->goto_label));
 			}
 		}
 	}
@@ -1561,14 +1562,15 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev)
 
 int udev_rules_get_run(struct udev_rules *rules, struct udevice *udev)
 {
+	struct udev_rules_iter *iter;
 	struct udev_rule *rule;
 
 	dbg("udev->kernel='%s'\n", udev->dev->kernel);
 
 	/* look for a matching rule to apply */
-	udev_rules_iter_init(rules);
+	udev_rules_iter_init(&iter, rules);
 	while (1) {
-		rule = udev_rules_iter_next(rules);
+		rule = udev_rules_iter_next(&iter);
 		if (rule == NULL)
 			break;
 
@@ -1619,7 +1621,7 @@ int udev_rules_get_run(struct udev_rules *rules, struct udevice *udev)
 
 			if (rule->goto_label.operation != KEY_OP_UNSET) {
 				dbg("moving forward to label '%s'\n", key_val(rule, &rule->goto_label));
-				udev_rules_iter_label(rules, key_val(rule, &rule->goto_label));
+				udev_rules_iter_label(&iter, key_val(rule, &rule->goto_label));
 			}
 		}
 	}
diff --git a/udev/udev_rules.h b/udev/udev_rules.h
index 9a41ccb..fd82f5d 100644
--- a/udev/udev_rules.h
+++ b/udev/udev_rules.h
@@ -110,16 +110,20 @@ struct udev_rule {
 struct udev_rules {
 	char *buf;
 	size_t bufsize;
-	size_t current;
 	int resolve_names;
 };
 
+struct udev_rules_iter {
+	struct udev_rules *rules;
+	size_t current;
+};
+
 extern int udev_rules_init(struct udev_rules *rules, int resolve_names);
 extern void udev_rules_cleanup(struct udev_rules *rules);
 
-extern void udev_rules_iter_init(struct udev_rules *rules);
-extern struct udev_rule *udev_rules_iter_next(struct udev_rules *rules);
-extern struct udev_rule *udev_rules_iter_label(struct udev_rules *rules, const char *label);
+extern void udev_rules_iter_init(struct udev_rules_iter *iter, struct udev_rules *rules);
+extern struct udev_rule *udev_rules_iter_next(struct udev_rules_iter *iter);
+extern struct udev_rule *udev_rules_iter_label(struct udev_rules_iter *iter, const char *label);
 
 extern int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev);
 extern int udev_rules_get_run(struct udev_rules *rules, struct udevice *udev);
diff --git a/udev/udev_rules_parse.c b/udev/udev_rules_parse.c
index 90b139b..a9a483c 100644
--- a/udev/udev_rules_parse.c
+++ b/udev/udev_rules_parse.c
@@ -33,49 +33,53 @@
 #include "udev_selinux.h"
 
 
-void udev_rules_iter_init(struct udev_rules *rules)
+void udev_rules_iter_init(struct udev_rules_iter *iter, struct udev_rules *rules)
 {
 	dbg("bufsize=%zi\n", rules->bufsize);
-	rules->current = 0;
+	iter->rules = rules;
+	iter->current = 0;
 }
 
-struct udev_rule *udev_rules_iter_next(struct udev_rules *rules)
+struct udev_rule *udev_rules_iter_next(struct udev_rules_iter *iter)
 {
+	struct udev_rules *rules;
 	struct udev_rule *rule;
 
+	rules = iter->rules;
 	if (!rules)
 		return NULL;
 
-	dbg("current=%zi\n", rules->current);
-	if (rules->current >= rules->bufsize) {
+	dbg("current=%zi\n", iter->current);
+	if (iter->current >= rules->bufsize) {
 		dbg("no more rules\n");
 		return NULL;
 	}
 
 	/* get next rule */
-	rule = (struct udev_rule *) (rules->buf + rules->current);
-	rules->current += sizeof(struct udev_rule) + rule->bufsize;
+	rule = (struct udev_rule *) (rules->buf + iter->current);
+	iter->current += sizeof(struct udev_rule) + rule->bufsize;
 
 	return rule;
 }
 
-struct udev_rule *udev_rules_iter_label(struct udev_rules *rules, const char *label)
+struct udev_rule *udev_rules_iter_label(struct udev_rules_iter *iter, const char *label)
 {
 	struct udev_rule *rule;
-	size_t start = rules->current;
-
+	struct udev_rules *rules = iter->rules;
+	size_t start = iter->current;
+	
 next:
-	dbg("current=%zi\n", rules->current);
-	if (rules->current >= rules->bufsize) {
+	dbg("current=%zi\n", iter->current);
+	if (iter->current >= rules->bufsize) {
 		err("LABEL='%s' not found, GOTO will be ignored\n", label);
-		rules->current = start;
+		iter->current = start;
 		return NULL;
 	}
-	rule = (struct udev_rule *) (rules->buf + rules->current);
+	rule = (struct udev_rule *) (rules->buf + iter->current);
 
 	if (strcmp(&rule->buf[rule->label.val_off], label) != 0) {
 		dbg("moving forward, looking for label '%s'\n", label);
-		rules->current += sizeof(struct udev_rule) + rule->bufsize;
+		iter->current += sizeof(struct udev_rule) + rule->bufsize;
 		goto next;
 	}
 


--
To unsubscribe from this list: send the line "unsubscribe linux-hotplug" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [Linux DVB]     [Asterisk Internet PBX]     [DCCP]     [Netdev]     [X.org]     [Util Linux NG]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux