All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
To: linux-hotplug@vger.kernel.org
Subject: [PATCH] threadsafe rules iteration
Date: Fri, 05 Sep 2008 11:11:56 +0000	[thread overview]
Message-ID: <48C113FC.3080203@tuffmail.co.uk> (raw)

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

Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>

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;
 	}
 



             reply	other threads:[~2008-09-05 11:11 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-05 11:11 Alan Jenkins [this message]
2008-09-05 15:08 ` [PATCH] threadsafe rules iteration Alan Jenkins
2008-09-08  9:55 ` Scott James Remnant
2008-09-08 10:45 ` Alan Jenkins
2008-09-08 19:38 ` Kay Sievers
2008-09-08 20:07 ` Alan Jenkins
2008-09-08 22:11 ` Kay Sievers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48C113FC.3080203@tuffmail.co.uk \
    --to=alan-jenkins@tuffmail.co.uk \
    --cc=linux-hotplug@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.