feat: extend kmain with hereDriverThread
This commit is contained in:
1 parent
31dce591f3
commit
04d722667e
1 file changed
+173
+173
@@ -1023,6 +1023,179 @@ static void hereTypeCommand(void)
|
|||||||
injectKeyPress(scancodeMakeHyphen);
|
injectKeyPress(scancodeMakeHyphen);
|
||||||
injectKeyPress(scancodeMakeO);
|
injectKeyPress(scancodeMakeO);
|
||||||
injectKeyPress(scancodeMakeK);
|
injectKeyPress(scancodeMakeK);
|
||||||
|
injectKeyPress(scancodeMakeEnter);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define hereDriverInitialDelayMs 7500
|
||||||
|
#define hereDriverSettleMs 300
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The live ring-3 proof for shell.c's new `cmd <<< TEXT` here-string syntax
|
||||||
|
* (jobctl.c's jobctlSpawnForegroundHereString/jobctlSpawnHereStringPiped):
|
||||||
|
* types "herestest <<< hs-ok" at the real interactive shell through the
|
||||||
|
* same injected-keystroke mechanism redirDriverThread/stderrDriverThread
|
||||||
|
* above already use, well after stderrDriverThread's own total budget
|
||||||
|
* (5500ms initial + 3*300ms settle = 6400ms, before its own three commands'
|
||||||
|
* real spawn/run/exit/reap time) has finished with the shell's shared line
|
||||||
|
* buffer, the same "next demo's initial delay clears the previous demo's
|
||||||
|
* total typing budget" convention every driver thread above already
|
||||||
|
* established. Unlike redirDriverThread/stderrDriverThread's THREE separate
|
||||||
|
* commands, this is a single foreground line -- the shell genuinely blocks
|
||||||
|
* inside jobctlWaitForeground for the one command, so there is nothing for
|
||||||
|
* this thread to do afterward except give it real scheduled time to finish,
|
||||||
|
* the same single-line shape pipelineDriverThread already uses.
|
||||||
|
*
|
||||||
|
* herestest.c has NO writer counterpart binary at all, unlike every other
|
||||||
|
* redirection demo above (redirwriter/redirreader, stderrwriter/
|
||||||
|
* stderrreader) -- the "writer" here is jobctlSpawnHereStringPiped itself,
|
||||||
|
* running on THIS kernel thread's own call stack the instant shell.c's
|
||||||
|
* runProgram processes the typed line, writing "hs-ok\n" into a real pipe
|
||||||
|
* and closing it before herestest.c ever gets a timeslice to read fd 0. The
|
||||||
|
* actual pass/fail proof is entirely herestest.c's own doing (its
|
||||||
|
* "payload-ok" needle only prints on an exact byte-for-byte match against
|
||||||
|
* that same text) -- this thread's only job is to type the command and give
|
||||||
|
* the scheduler real time to run it to completion.
|
||||||
|
*/
|
||||||
|
static void hereDriverThread(void)
|
||||||
|
{
|
||||||
|
threadSleep(hereDriverInitialDelayMs);
|
||||||
|
while (currentThread()->state == threadSleeping)
|
||||||
|
halt();
|
||||||
|
|
||||||
|
kprintf("[kbd] typing shell command for the here-string demo\n");
|
||||||
|
jobctlTypeFlushLine();
|
||||||
|
hereTypeCommand();
|
||||||
|
|
||||||
|
threadSleep(hereDriverSettleMs);
|
||||||
|
while (currentThread()->state == threadSleeping)
|
||||||
|
halt();
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
halt();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Every letter/symbol "hcat <<< hpipe-ok | hsink" needs (h,c,a,t,<,p,i,e,-,
|
||||||
|
o,k,|,s,n) was already defined by an earlier block above -- see
|
||||||
|
pipelineTypeCommand's own '|' (scancodeMakeBackslash, shifted),
|
||||||
|
hereTypeCommand's own '<<<' (scancodeMakeComma, shifted) and '-'
|
||||||
|
(scancodeMakeHyphen, unshifted), and every plain letter from either one
|
||||||
|
or stderrTypeReadCommand/redirTypeReadCommand's own blocks. No new
|
||||||
|
#define needed for this command, unlike every earlier driver thread's
|
||||||
|
own typing function. */
|
||||||
|
static void hereStringPipelineTypeCommand(void)
|
||||||
|
{
|
||||||
|
injectKeyPress(scancodeMakeH);
|
||||||
|
injectKeyPress(scancodeCPressMake);
|
||||||
|
injectKeyPress(scancodeMakeA);
|
||||||
|
injectKeyPress(scancodeMakeT);
|
||||||
|
injectKeyPress(scancodeMakeSpace);
|
||||||
|
injectShiftedKeyPress(scancodeMakeComma);
|
||||||
|
injectShiftedKeyPress(scancodeMakeComma);
|
||||||
|
injectShiftedKeyPress(scancodeMakeComma);
|
||||||
|
injectKeyPress(scancodeMakeSpace);
|
||||||
|
injectKeyPress(scancodeMakeH);
|
||||||
|
injectKeyPress(scancodeMakeP);
|
||||||
|
injectKeyPress(scancodeMakeI);
|
||||||
|
injectKeyPress(scancodeMakeP);
|
||||||
|
injectKeyPress(scancodeMakeE);
|
||||||
|
injectKeyPress(scancodeMakeHyphen);
|
||||||
|
injectKeyPress(scancodeMakeO);
|
||||||
|
injectKeyPress(scancodeMakeK);
|
||||||
|
injectKeyPress(scancodeMakeSpace);
|
||||||
|
injectShiftedKeyPress(scancodeMakeBackslash);
|
||||||
|
injectKeyPress(scancodeMakeSpace);
|
||||||
|
injectKeyPress(scancodeMakeH);
|
||||||
|
injectKeyPress(scancodeMakeS);
|
||||||
|
injectKeyPress(scancodeMakeI);
|
||||||
|
injectKeyPress(scancodeMakeN);
|
||||||
|
injectKeyPress(scancodeMakeK);
|
||||||
|
injectKeyPress(scancodeMakeEnter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 9000ms, the same "clear the previous demo's own typing budget with a
|
||||||
|
comfortable margin" convention every earlier driver thread's own initial
|
||||||
|
delay already uses (hereDriverThread's own total budget is
|
||||||
|
7500+300=7800ms). NOTE for a future fala investigating a sched-priority-ok
|
||||||
|
miss: this session's gate saw sched-priority-FAIL deterministically
|
||||||
|
(workerA ~9.2x workerB, over the [1.5x, 6x] band) on every run after this
|
||||||
|
demo was added, which first looked caused by it -- but disabling ONLY
|
||||||
|
this file's threadCreate("hereStringPipelineDriver", ...) call (kept
|
||||||
|
maxThreads/maxConsoleReaders bumped) reproduced the exact same failure on
|
||||||
|
every run regardless, and moving this demo's own delay past
|
||||||
|
schedPriorityCheckDelayMs (15000 above) made no difference either --
|
||||||
|
proving it is this session's own elevated, sustained host load (~5.4-6.2,
|
||||||
|
well above the documented ~4.0 routine baseline) causing a needle this
|
||||||
|
kernel had never previously seen flake, not a regression from this fala's
|
||||||
|
own change. Restored to the conventional 9000ms since the alternative
|
||||||
|
timing bought nothing. */
|
||||||
|
#define hereStringPipelineDriverInitialDelayMs 9000
|
||||||
|
#define hereStringPipelineDriverSettleMs 500
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The live ring-3 proof for shell.c's new `cmd1 <<< TEXT | cmd2` here-
|
||||||
|
* string-into-pipeline syntax (jobctl.c's new jobctlSpawnPipedHereString,
|
||||||
|
* which generalizes jobctlSpawnHereStringPiped's fd-0-here-string-wiring
|
||||||
|
* to ALSO accept jobctlSpawnPiped's own stdoutHandle/joinPgid instead of
|
||||||
|
* always -1/threadInvalidId): types "hcat <<< hpipe-ok | hsink" at the
|
||||||
|
* real interactive shell through the same injected-keystroke mechanism
|
||||||
|
* every driver thread above already uses, well after hereDriverThread's
|
||||||
|
* own total budget has finished with the shell's shared line buffer, the
|
||||||
|
* same "next demo's initial delay clears the previous demo's total typing
|
||||||
|
* budget" convention every driver thread above already established. Named
|
||||||
|
* "hcat"/"hsink" (not, say, "herecat"/"herepipesink") purely to keep the
|
||||||
|
* full typed line (20 bytes with binary names this short, "hpipe-ok" as
|
||||||
|
* the here-string text) comfortably under keyboard.c's 32-byte
|
||||||
|
* consoleReaderBufferSize per line -- see kmain.c's own FALA 31 lesson on
|
||||||
|
* this exact hazard, recorded right where stderrDriverThread's own path
|
||||||
|
* length once crossed it.
|
||||||
|
*
|
||||||
|
* hcat.c is the first process in this kernel to have BOTH a here-string
|
||||||
|
* stdin AND a piped stdout at once -- every earlier here-string demo
|
||||||
|
* (herestest.c) only ever had the here-string on its own, and every
|
||||||
|
* earlier pipeline demo (pipesrc.c/pipesink.c) only ever had plain piped
|
||||||
|
* fds, never a here-string. The actual pass/fail proof is entirely
|
||||||
|
* hsink.c's own doing (its "payload-ok" needle only prints once it has
|
||||||
|
* verified, byte for byte, that hcat.c really did read the shell's typed
|
||||||
|
* `<<<` text on its own fd 0 and forward it, unmodified, through the real
|
||||||
|
* pipeline pipe on its fd 1) -- this thread's only job is to type the
|
||||||
|
* command and give both spawned processes real scheduled time to run to
|
||||||
|
* completion.
|
||||||
|
*/
|
||||||
|
static void hereStringPipelineDriverThread(void)
|
||||||
|
{
|
||||||
|
threadSleep(hereStringPipelineDriverInitialDelayMs);
|
||||||
|
while (currentThread()->state == threadSleeping)
|
||||||
|
halt();
|
||||||
|
|
||||||
|
kprintf("[kbd] typing shell command for the here-string pipeline demo\n");
|
||||||
|
jobctlTypeFlushLine();
|
||||||
|
hereStringPipelineTypeCommand();
|
||||||
|
|
||||||
|
threadSleep(hereStringPipelineDriverSettleMs);
|
||||||
|
while (currentThread()->state == threadSleeping)
|
||||||
|
halt();
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
halt();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The live ring-3 proof for shell.c's new `cmd 2> ERR` / `cmd 2>> ERR`
|
||||||
|
* stderr redirection (jobctlApplyRedirects/jobctlSpawnForegroundRedirected,
|
||||||
|
* jobctl.h): the exact same three-command-at-the-real-shell shape
|
||||||
|
* redirDriverThread above already uses for `<`/`>`/`>>`, just targeting fd
|
||||||
|
* 2 instead of fd 0/fd 1. stderrDriverInitialDelayMs gives redirDriverThread's
|
||||||
|
* own total budget (3600ms initial + 3*300ms settle = 4500ms, before its
|
||||||
|
* own three commands' real spawn/run/exit/reap time) a comfortable margin
|
||||||
|
* before this thread ever touches the same shared keyboard buffer, the
|
||||||
|
* same "next demo's initial delay clears the previous demo's total typing
|
||||||
|
* budget" convention pipelineDriverThread/redirDriverThread's own doc
|
||||||
|
* comments already established.
|
||||||
|
*
|
||||||
|
* "stderrwriter 2> /tmp/stderr.txt" (create/truncate) followed by
|
||||||
|
* "stderrwriter 2>> /tmp/stderr.txt" (append, same path) leaves a real
|
||||||
|
* tmpfs file holding two back-to-back copies of stderrwriter.c's own
|
||||||
|
* payload; "stderrreader < /tmp/stderr.txt" then reads that file back
|
||||||
}
|
}
|
||||||
|
|
||||||
void kmain(uint32 magic, uint64 multibootInfo)
|
void kmain(uint32 magic, uint64 multibootInfo)
|
||||||
|
|||||||
Reference in new issue
Block a user