[process] Make it safe to call process_add() multiple times
authorMichael Brown <mcb30@etherboot.org>
Mon, 10 Aug 2009 00:09:41 +0000 (01:09 +0100)
committerMichael Brown <mcb30@etherboot.org>
Mon, 10 Aug 2009 18:27:24 +0000 (19:27 +0100)
src/core/process.c
src/include/gpxe/process.h
src/net/infiniband.c
src/net/netdevice.c
src/net/retry.c

index 6dacd66..9c13e02 100644 (file)
@@ -37,11 +37,18 @@ static LIST_HEAD ( run_queue );
  * Add process to process list
  *
  * @v process          Process
+ *
+ * It is safe to call process_add() multiple times; further calls will
+ * have no effect.
  */
 void process_add ( struct process *process ) {
-       DBGC ( process, "PROCESS %p starting\n", process );
-       ref_get ( process->refcnt );
-       list_add_tail ( &process->list, &run_queue );
+       if ( list_empty ( &process->list ) ) {
+               DBGC ( process, "PROCESS %p starting\n", process );
+               ref_get ( process->refcnt );
+               list_add_tail ( &process->list, &run_queue );
+       } else {
+               DBGC ( process, "PROCESS %p already started\n", process );
+       }
 }
 
 /**
index a460919..944858d 100644 (file)
@@ -47,6 +47,7 @@ static inline __attribute__ (( always_inline )) void
 process_init_stopped ( struct process *process,
                       void ( * step ) ( struct process *process ),
                       struct refcnt *refcnt ) {
+       INIT_LIST_HEAD ( &process->list );
        process->step = step;
        process->refcnt = refcnt;
 }
index 2d8b63e..539c529 100644 (file)
@@ -802,6 +802,7 @@ static void ib_step ( struct process *process __unused ) {
 
 /** Infiniband event queue process */
 struct process ib_process __permanent_process = {
+       .list = LIST_HEAD_INIT ( ib_process.list ),
        .step = ib_step,
 };
 
index e16ebaa..3bb0574 100644 (file)
@@ -625,5 +625,6 @@ static void net_step ( struct process *process __unused ) {
 
 /** Networking stack process */
 struct process net_process __permanent_process = {
+       .list = LIST_HEAD_INIT ( net_process.list ),
        .step = net_step,
 };
index 3ca6936..40f656f 100644 (file)
@@ -187,5 +187,6 @@ static void retry_step ( struct process *process __unused ) {
 
 /** Retry timer process */
 struct process retry_process __permanent_process = {
+       .list = LIST_HEAD_INIT ( retry_process.list ),
        .step = retry_step,
 };