From fd86c819ba559760b9bf7eaca1b21a0fd81ef6b6 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 3 Jul 2007 20:09:14 +0100 Subject: Use a linker-table based system to automatically mark and start up permanent processes, rather than requiring each one to have its own initialisation function. --- src/core/main.c | 5 ++++- src/core/process.c | 18 ++++++++++++++++++ src/include/gpxe/init.h | 1 - src/include/gpxe/process.h | 11 +++++++++++ src/net/netdevice.c | 9 +-------- src/net/retry.c | 9 +-------- 6 files changed, 35 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/core/main.c b/src/core/main.c index 64e098ca..5b01df9c 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -16,6 +16,7 @@ Literature dealing with the network protocols: #include #include +#include #include #include #include @@ -29,8 +30,10 @@ Literature dealing with the network protocols: * Call this function only once, before doing (almost) anything else. */ static void startup ( void ) { - hide_etherboot(); init_heap(); + init_processes(); + + hide_etherboot(); call_init_fns(); probe_devices(); } diff --git a/src/core/process.c b/src/core/process.c index 0583a398..bd35e614 100644 --- a/src/core/process.c +++ b/src/core/process.c @@ -30,6 +30,12 @@ /** Process run queue */ static LIST_HEAD ( run_queue ); +/** Registered permanent processes */ +static struct process processes[0] + __table_start ( struct process, processes ); +static struct process processes_end[0] + __table_end ( struct process, processes ); + /** * Add process to process list * @@ -72,3 +78,15 @@ void step ( void ) { break; } } + +/** + * Initialise processes + * + */ +void init_processes ( void ) { + struct process *process; + + for ( process = processes ; process < processes_end ; process++ ) { + process_add ( process ); + } +} diff --git a/src/include/gpxe/init.h b/src/include/gpxe/init.h index bd4cd97d..b13674ec 100644 --- a/src/include/gpxe/init.h +++ b/src/include/gpxe/init.h @@ -42,7 +42,6 @@ struct init_fn { #define INIT_LOADBUF 08 #define INIT_PCMCIA 09 #define INIT_RPC 11 -#define INIT_PROCESS 12 /* Macro for creating an initialisation function table entry */ #define INIT_FN( init_order, init_func, reset_func, exit_func ) \ diff --git a/src/include/gpxe/process.h b/src/include/gpxe/process.h index c0837fa4..595787c0 100644 --- a/src/include/gpxe/process.h +++ b/src/include/gpxe/process.h @@ -9,6 +9,7 @@ #include #include +#include /** A process */ struct process { @@ -33,6 +34,7 @@ struct process { extern void process_add ( struct process *process ); extern void process_del ( struct process *process ); extern void step ( void ); +extern void init_processes ( void ); /** * Initialise process without adding to process list @@ -62,4 +64,13 @@ process_init ( struct process *process, process_add ( process ); } +/** + * Declare a permanent process + * + * Permanent processes will be automatically added to the process list + * at initialisation time. + */ +#define __permanent_process \ + __table ( struct process, processes, 01 ) + #endif /* _GPXE_PROCESS_H */ diff --git a/src/net/netdevice.c b/src/net/netdevice.c index 971830d9..fb4612bc 100644 --- a/src/net/netdevice.c +++ b/src/net/netdevice.c @@ -448,13 +448,6 @@ static void net_step ( struct process *process __unused ) { } /** Networking stack process */ -static struct process net_process = { +struct process net_process __permanent_process = { .step = net_step, }; - -/** Initialise the networking stack process */ -static void init_net ( void ) { - process_add ( &net_process ); -} - -INIT_FN ( INIT_PROCESS, init_net, NULL, NULL ); diff --git a/src/net/retry.c b/src/net/retry.c index f8c34b81..6734968f 100644 --- a/src/net/retry.c +++ b/src/net/retry.c @@ -167,13 +167,6 @@ static void retry_step ( struct process *process __unused ) { } /** Retry timer process */ -static struct process retry_process = { +struct process retry_process __permanent_process = { .step = retry_step, }; - -/** Initialise the retry timer module */ -static void init_retry ( void ) { - process_add ( &retry_process ); -} - -INIT_FN ( INIT_PROCESS, init_retry, NULL, NULL ); -- cgit v1.2.3-55-g7522