]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[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 6dacd6652636258e0b99c81e6462f516f87c261f..9c13e02049278dd93daec72bb8fee9ba91061188 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 a4609191132c1d2f0739d55e4c815dcfb3a263de..944858d76639ef8315e5d87e1ecd792ebe73c760 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 2d8b63ec247813ffb769796967c761203b3a672a..539c529062629a87f030d96dc19e3094d13e059c 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 e16ebaa074d5f7e642849fb5e91c7d6614ab7bdc..3bb0574dad8a739e487f5a27b96bf4fee8d0fae7 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 3ca69362b3084cd6297640066799667a928ba79f..40f656f2a43bc0aded77f8c32181167fe2bc2834 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,
 };