chiark / gitweb /
[PATCH] udevd - allow to bypass sequence number
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Thu, 5 Feb 2004 09:35:08 +0000 (01:35 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:32:25 +0000 (21:32 -0700)
This patch allows udevsend to be called by the user and not only by the
kernel with its SEQNUM. If no SEQNUM is given, we move the event straight
to the exec queue and don't look if something is missing.

I don't know if this is really needed, but some people seem trying to
send events trough udevd instead of calling udev directly with their
scripts and confuse the reorder logic with that.

So at least, we may remove this source of confusion and udevsend is much
much faster back than udev itself and it will also block concurrent events
for the same devpath.

udevd.c
udevsend.c

diff --git a/udevd.c b/udevd.c
index 331b7e4b84aa9d0229f709268dcbe58248e88701..f8b8c27ee4ad51a0f6679aa7e71969247035198a 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -205,16 +205,20 @@ static void *exec_queue_manager(void * parm)
        }
 }
 
-/* move message from incoming to exec queue */
-static void msg_move_exec(struct list_head *head)
+static void exec_queue_activate(void)
 {
-       list_move_tail(head, &exec_list);
-       /* signal queue activity to manager */
        pthread_mutex_lock(&exec_active_lock);
        pthread_cond_signal(&exec_active);
        pthread_mutex_unlock(&exec_active_lock);
 }
 
+/* move message from incoming to exec queue */
+static void msg_move_exec(struct list_head *head)
+{
+       list_move_tail(head, &exec_list);
+       exec_queue_activate();
+}
+
 /* queue management thread handles the timeouts and dispatches the events */
 static void *msg_queue_manager(void * parm)
 {
@@ -298,9 +302,17 @@ static void *client_threads(void * parm)
                goto exit;
        }
 
-       pthread_mutex_lock(&msg_lock);
-       msg_queue_insert(msg);
-       pthread_mutex_unlock(&msg_lock);
+       /* if no seqnum is given, we move straight to exec queue */
+       if (msg->seqnum == 0) {
+               pthread_mutex_lock(&exec_lock);
+               list_add(&msg->list, &exec_list);
+               exec_queue_activate();
+               pthread_mutex_unlock(&exec_lock);
+       } else {
+               pthread_mutex_lock(&msg_lock);
+               msg_queue_insert(msg);
+               pthread_mutex_unlock(&msg_lock);
+       }
 
 exit:
        close(sock);
index d3c74dd46a4e9f5b9248759b2a711888585e2222..9dc2b2e841bb635cd3a30dc284e25224938b9f90 100644 (file)
@@ -148,11 +148,10 @@ int main(int argc, char* argv[])
        }
 
        seqnum = get_seqnum();
-       if (seqnum == NULL) {
-               dbg("no seqnum");
-               goto exit;
-       }
-       seq = atoi(seqnum);
+       if (seqnum == NULL)
+               seq = 0;
+       else
+               seq = atoi(seqnum);
 
        sock = socket(AF_LOCAL, SOCK_STREAM, 0);
        if (sock == -1) {