diff options
author | kay.sievers@vrfy.org <kay.sievers@vrfy.org> | 2004-02-06 22:21:15 -0800 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-04-26 21:32:26 -0700 |
commit | 2f6cbd19113167746dc4fb6b4f3f5fd64a1c211f (patch) | |
tree | 3ee052f575f8a3094a97a0dc39fe2ffaf9e93459 /udevsend.c | |
parent | d2cf99df7df132d8d90c4f7b438374618793c15a (diff) |
[PATCH] convert udevsend/udevd to DGRAM and single-threaded
On Fri, Feb 06, 2004 at 01:08:24AM -0500, Chris Friesen wrote:
>
> Kay, you said "unless we can get rid of _all_ the threads or at least
> getting faster, I don't want to change it."
>
> Well how about we get rid of all the threads, *and* we get faster?
Yes, we are twice as fast now on my box :)
> This patch applies to current bk trees, and does the following:
>
> 1) Switch to DGRAM sockets rather than STREAM. This simplifies things
> as mentioned in the previous message.
>
> 2) Invalid sequence numbers are mapped to -1 rather than zero, since
> zero is a valid sequence number (I think). Also, this allows for real
> speed tests using scripts starting at a zero sequence number, since that
> is what the initial expected sequence number is.
>
> 3) Get rid of all threading. This is the biggie. Some highlights:
> a) timeout using setitimer() and SIGALRM
> b) async child death notification via SIGCHLD
> c) these two signal handlers do nothing but raise volatile flags,
> all the
> work is done in the main loop
> d) locking no longer required
I cleaned up the rest of the comments, the whitespace and a few names to match
the whole thing. Please recheck it. Test script is switched to work on subsystem
'test' to let udev ignore it.
Diffstat (limited to 'udevsend.c')
-rw-r--r-- | udevsend.c | 80 |
1 files changed, 38 insertions, 42 deletions
diff --git a/udevsend.c b/udevsend.c index 246a097f26..f6de88565f 100644 --- a/udevsend.c +++ b/udevsend.c @@ -33,6 +33,7 @@ #include <string.h> #include <unistd.h> #include <time.h> +#include <linux/stddef.h> #include "udev.h" #include "udev_version.h" @@ -119,13 +120,14 @@ int main(int argc, char* argv[]) char *subsystem; char *seqnum; int seq; - int retval = -EINVAL; + int retval = 1; int size; int loop; struct timespec tspec; int sock; struct sockaddr_un saddr; socklen_t addrlen; + int started_daemon = 0; #ifdef DEBUG init_logging("udevsend"); @@ -151,11 +153,11 @@ int main(int argc, char* argv[]) seqnum = get_seqnum(); if (seqnum == NULL) - seq = 0; + seq = -1; else seq = atoi(seqnum); - sock = socket(AF_LOCAL, SOCK_STREAM, 0); + sock = socket(AF_LOCAL, SOCK_DGRAM, 0); if (sock == -1) { dbg("error getting socket"); goto exit; @@ -167,48 +169,42 @@ int main(int argc, char* argv[]) strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH); addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1; - /* try to connect, if it fails start daemon */ - retval = connect(sock, (struct sockaddr *) &saddr, addrlen); - if (retval != -1) { - goto send; - } else { - dbg("connect failed, try starting daemon..."); - retval = start_daemon(); - if (retval == 0) { + size = build_hotplugmsg(&message, action, devpath, subsystem, seq); + + /* If we can't send, try to start daemon and resend message */ + loop = UDEVSEND_CONNECT_RETRY; + while (loop--) { + retval = sendto(sock, &message, size, 0, (struct sockaddr*)&saddr, addrlen); + if (retval != -1) { + retval = 0; + goto close_and_exit; + } + + if (errno != ECONNREFUSED) { + dbg("error sending message"); + goto close_and_exit; + } + + if (!started_daemon) { + dbg("connect failed, try starting daemon..."); + retval = start_daemon(); + if (retval) { + dbg("error starting daemon"); + goto exit; + } + dbg("daemon started"); + started_daemon = 1; } else { - dbg("error starting daemon"); - goto exit; + dbg("retry to connect %d", UDEVSEND_CONNECT_RETRY - loop); + tspec.tv_sec = 0; + tspec.tv_nsec = 100000000; /* 100 millisec */ + nanosleep(&tspec, NULL); } } - - /* try to connect while daemon to starts */ - tspec.tv_sec = 0; - tspec.tv_nsec = 100000000; /* 100 millisec */ - loop = UDEVSEND_CONNECT_RETRY; - while (loop--) { - retval = connect(sock, (struct sockaddr *) &saddr, sizeof(saddr)); - if (retval != -1) - goto send; - else - dbg("retry to connect %d", - UDEVSEND_CONNECT_RETRY - loop); - nanosleep(&tspec, NULL); - } - dbg("error connecting to daemon, start daemon failed"); - goto exit; - -send: - size = build_hotplugmsg(&message, action, devpath, subsystem, seq); - retval = send(sock, &message, size, 0); - if (retval == -1) { - dbg("error sending message"); - close (sock); - goto exit; - } - close (sock); - return 0; - + +close_and_exit: + close(sock); exit: - return 1; + return retval; } |