summaryrefslogtreecommitdiff
path: root/user/idle.c
diff options
context:
space:
mode:
Diffstat (limited to 'user/idle.c')
-rw-r--r--user/idle.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/user/idle.c b/user/idle.c
new file mode 100644
index 0000000..dbce885
--- /dev/null
+++ b/user/idle.c
@@ -0,0 +1,51 @@
+#include <common.h>
+
+/**
+** Idle process: write, getpid, gettime, exit
+**
+** Reports itself, then loops forever delaying and printing a character.
+** MUST NOT SLEEP, as it must always be available in the ready queue
+** when there is no other process to dispatch.
+**
+** Invoked as: idle
+*/
+
+USERMAIN( main ) {
+ // this is the character we will repeatedly print
+ char ch = '.';
+
+ // ignore the command-line arguments
+ (void) argc;
+ (void) argv;
+
+ // get some current information
+ uint_t pid = getpid();
+ uint32_t now = gettime();
+ enum priority_e prio = getprio();
+
+ char buf[128];
+ sprint( buf, "Idle [%d], started @ %u\n", pid, prio, now );
+ cwrites( buf );
+
+ // report our presence on the console
+ cwrites( "Idle started\n" );
+
+ write( CHAN_SIO, &ch, 1 );
+
+ // idle() should never block - it must always be available
+ // for dispatching when we need to pick a new current process
+
+ for(;;) {
+ DELAY(LONG);
+ write( CHAN_SIO, &ch, 1 );
+ }
+
+ // we should never reach this point!
+ now = gettime();
+ sprint( buf, "Idle [%d] EXITING @ %u!?!?!\n", pid, now );
+ cwrites( buf );
+
+ exit( 1 );
+
+ return( 42 );
+}