Changes
* thread: fix coma state issue where thread would not resume
* thread: add thread.current(), returns current thread [ the init thread is still technically not a thread ]
* tty: simplify the api with read, and separate all stream methods from the library
* sleep: /bin/sleep will now show blinking cursor and can be interrupted
* echo: use io.write instead of print. print loads slightly more resources
quiet mode in /bin/source was a mess -- making .shrc scripts not able to print. Also, a lot of the /bin/sh arg parsing code has traditionally been over complicated. cleaned that up as well thanks to old code that expected strings in the args having been removed some time ago
Users shouldn't use tty read nor write directly, they should always use io or term. But...it is messy to try to hide these methods as private methods in the io library, so I'll just have to check the io tty-ness just in case
LS_COLORS now respects linux style ansi code list, and /bin/ls has been updated to respect that
cursor blinking ws being reset too often that has been fixed
cyan ideally should be 0x00ffff, but that colors becomes green when switching bit depths. Thus, openos will use 0x00B6FF for ansi code for cyan
fixed some vt100 color list parsing
* huge terminal performance boost
* echo -e option, interpret backslashes
* favor io.write instead of print on low level code as print is slightly more memory expensive
* use vt100 ansi color coding for PS1
* use tty as std io back end stream
* consolidate buffer delay code
* add ctrl+backspace and ctrl+w options in io.read
* delay load more
* term code cleanup
* add buffer:size(), returns size of pending data on the stream
* memory free 59k
* openos 1.6.7
More memory savings, significant boot time savings
**Memory Savings**
The largest library in terms of cost in bytes in 1.6.5 was /lib/filesystem. Most of this library is not needed for boot, and in 1.6.6 the library is half loaded for boot with a delay load of the rest of the library when needed. There are also other minor memory improvements, see **Changes** for details
**Boot Time**
This update also introduces a newly written /bin/sh.lua that takes advantage of a common stdio system. This work was primary done to reduce memory needed to load the shell. However, during development of a simplified /bin/sh, I found that the /bin/source, /etc/profile, and /home/.shrc feature added to openos 1.6 had a significant boot time cost. I began optimizing /bin/source heavily and found that I could not make sufficient speed improvements due to the nature of how shell commands execute. Thus /etc/profile has been removed in favor of /etc/profile.lua, a script that sets up the environment the same but as a lua script. ~/.shrc is still honored if it exists on a system, and is sourced (/bin/source) as a set of shell commands. This change speeds up boot time from floppy by 3s, and on hdds by 1s.
**Possible Breaking Changes**
/etc/profile has been moved to /etc/profile.lua, but /home/.shrc is still sourced as shell script commands.
**Changes**
* /bin/sh.lua rewrite that takes advantage of standard io and uses the new /etc/profile.lua shaving 6s off boot time
* /bin/source.lua improve performance by reducing the number of processes created
* move /etc/profile to /etc/profile.lua and recode the actions in lua-form.
* move all ~/.shrc actions to /etc/profile.lua for performance reasons
* move motd to start of /etc/profile.lua to get the shell display as soon as possible
* update greetings that referenced /etc/profile to properly refer to /etc/profile.lua now
* update openos version to 1.6.6 to respect the impact of these changes
also remove unused vars and some light code clean up
moving some methods out of tty into delay loaded space for memory
fix print from overwriting vbuf settings on stdout
fix regression for expanding ${VAR}
closes#2434
This change should allow popen, pipes, and threads to specify with exactness how many coroutines back they want to yield. This makes popen and threads immune to internal coroutine scenarios
Also using a code cleanup provided by @SDPhantom
* Fixed possible error reporting bug in filesystem.copy()
Made local data initialize to false. Previously was nil and if the function was unable to open either file, this would cause the function to return true as its first value. data becomes nil when copying is finished, so this sorts itself out.
Added arg checking to filesystem.name
process: process.running has been deprecated for over 2 years and is now obsolete, please use process.info
process: added process.internal.run designed to run a coroutine to completion
01_process: cleaner coroutine_handler intercept code
event: removed unnecessary local function and added an optional handlers param to register to simplify thread code
io: update popen to use new /lib/pipe.lua library
pipe: new /lib/pipe replace /lib/pipes
> superior coroutine stack code, can reparent stacks
> handles all pipe work, sh calls /lib/pipe now for pipes
sh: now uses /lib/pipe to build pipe chains, calls shell.run to run a pipe chain.
thread: greatly improved reliability of embedded and detached threads
boot: removed dead code
thread fix:
Significant quality update for embedded threads (threads inside threads inside threads...) Also, added a "thread_exit" event. This is not yet official, I may add more meta data to the event later.
/bin/edit:
Found a case where text was being trimmed where it doesn't need to be
/lib/process
protect a .. operator from crashes with a tostring
greetings
updated the comment in a greeting, you can no longer just remove /etc/motd without a stderr error about the file missing on boot (without changing your /etc/profile)
/lib/term
term.read() was behaving as io.read() for tty, and as io.read("*l") for non-tty, now they both use *L
the "thread" update
**Threads**
OpenOS 1.6.4 brings the new thread library api. Documentation in our ocdoc wiki soon to come. An openos thread is an autonomous non-blocking detachable child process
* Autonomous: Threads asynchronously begin execution immediately after creation without needing to call resume. The thread proc may call coroutine.yield, but will resume on its own
* Non-Blocking: Threads can call computer.pullSignal (or any higher level wrapper such as event.pull, io.pull, etc) without blocking the main kernel process nor any other thread
* Detachable: By default, threads are scoped to the process in which they are created, i.e. their parent process. Any thread will block the parent process from closing unless:
A. The thread detaches from the parent process. In which case it does not block any process and runs independently, e.g. `t:detach()`
or
B. The parent process throws an exception or calls os.exit in which case all attached threads are killed, e.g. `os.exit()`
or
C. The thread is manually suspended, e.g. `t:suspend()`
**Command Redirection**
The other major improvement in this update is highly improved shell parsing for command substitution and io redirection. Some highlights include
* Can place before the command now, e.g. `2>/dev/null ./run_my_scripts.lua`
* Can properly use globbing or env vars as redirect targets, e.g. `./run_my_scripts.lua >$my_log_file`
* Fixed various bugs related to redirect and argument evaluation
**Memory**
50k free! As I love to do, this update reduces memory allocation needed to reach the shell prompt. The majority of the recent memory improvements are not just delaying allocation, but actual code cleanup and optimizations. Many of the changes are minor but they are numerous. With 1 stick of tier 1 RAM, openos reaches shell with 50k bytes free.
Changelog:
Bump version from 1.6.3 to 1.6.4
Cause grep to yield when taking too long
Remove additional gpu.bind calls during boot, reduces the number of screen resize calls
Move SHELL env var creation to /boot/94_shell.lua - This is an important user workflow fix to allow users to specify a custom SHELL without openos ever needing to load /bin/sh and its libraries
Fix event dispatch to not double call event timers in some scenarios
new /lib/thread.lua
fixed /lib/process from hiding exceptions in some scenarios
significant memory optimizations and code cleanup for /bin/sh
refactoring of command redirection, variable evaluation, glob expansion, and argument lists in /bin/sh
fixed term.setCursorBlink so that it properly waits for inf time for the next event when not blinking, rather than pulling every .5 seconds
fixed /bin/sh shell from losing exit_code when using || and && with multiple commands
fix /bin/lua error message when using os.exit
cherry picking serialization fix from 62471f7d320758bebb280666ed98388ea61cb4c8
Why a version change?
> This minor version change should not introduce breaking changes, but older code doing non standard things with process environments, `require` and the package library, shebang redirections, or direct calls to /bin/lua, may see some breakages. Also, `shell.resolve` has been fully reworked. This is a crucial and heavily used api. Thus, in case of any mistakes or bugs a version change will help pinpoint regressions. I've heavily tested the resolve code, but it is new code and deserves some bake time in the wild.
Changelog:
/bin/lua removes shebang line and calls load directly. Improves workflows that define custom environments, and loadfile no longer removes shebang lines
load: loaded code chunks now inherit the parent _ENV naturally, having a real-lua behavior
require: heavily optimized and made errors more natural and helpful, exposing more information about failure to require a library
/lib/pipes: commented out pipes.create which is a future feature to create event-boxed threads
process: more process crash text is dumped to the shell to help identify "out of memory" issues
shell.resolve: reworked and optimized! possibly breaking change: specifying an extension (ext) to `shell.resolve(name, ext)` will no longer return results to directories, but only files (if they exist). However, it was never the intent of this method to return results to directories when specifying an extension
various memory optimizations throughout. openos now allocates ~153k to boot to shell.