diff options
author | Alan Jenkins <alan-jenkins@tuffmail.co.uk> | 2008-10-25 17:01:21 +0100 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2008-10-25 19:41:52 +0200 |
commit | e25fa4faf5b4977cc90c87003a41107a920bbe4d (patch) | |
tree | 3b6648367cc8d48620170522c2bed9558a5fcc89 | |
parent | 3e5c759543f57e6aabb8142ef194d5e4d45722d8 (diff) |
udevd: use a tighter loop for compare_devpath()
This crops up in my threaded udevd profiles from time to time.
It's not consistent - probably due to variations in the number
of concurrent events - but it can hit 4% user time and higher.
The change halves the user time spent in compare_devpath().
Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
-rw-r--r-- | udev/udevd.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/udev/udevd.c b/udev/udevd.c index 21fd6f82e7..0bacb3994b 100644 --- a/udev/udevd.c +++ b/udev/udevd.c @@ -310,26 +310,24 @@ static int mem_size_mb(void) static int compare_devpath(const char *running, const char *waiting) { - int i; + int i = 0; - for (i = 0; i < UTIL_PATH_SIZE; i++) { - /* identical device event found */ - if (running[i] == '\0' && waiting[i] == '\0') - return 1; + while (running[i] == waiting[i] && running[i] != '\0') + i++; - /* parent device event found */ - if (running[i] == '\0' && waiting[i] == '/') - return 2; + /* identical device event found */ + if (running[i] == '\0' && waiting[i] == '\0') + return 1; - /* child device event found */ - if (running[i] == '/' && waiting[i] == '\0') - return 3; + /* parent device event found */ + if (running[i] == '\0' && waiting[i] == '/') + return 2; - /* no matching event */ - if (running[i] != waiting[i]) - break; - } + /* child device event found */ + if (running[i] == '/' && waiting[i] == '\0') + return 3; + /* no matching event */ return 0; } |