Skip to content

Commit

Permalink
main: run "ble/base/unload" directly at the end of "EXIT" handler
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Mar 4, 2022
1 parent 26b532e commit 115baec
Show file tree
Hide file tree
Showing 4 changed files with 150 additions and 2 deletions.
1 change: 0 additions & 1 deletion ble.pp
Expand Up @@ -1729,7 +1729,6 @@ function ble/base/unload {
ble/bin/rm -rf "$_ble_base_run/$$".* 2>/dev/null
return 0
}
blehook EXIT+=ble/base/unload

_ble_base_attach_from_prompt=
_ble_base_attach_PROMPT_COMMAND=()
Expand Down
1 change: 1 addition & 0 deletions docs/ChangeLog.md
Expand Up @@ -284,6 +284,7 @@
- complete: use `awk` for batch `quote-insert` (motivated by banoris) `#D1714` a0b2ad2 92d9734
- complete (quote-insert.batch): fix regex escaping in bracket expr of awk (reported by telometto) `#D1729` 8039b77
- prompt: reduce redundant evaluation of `PROMPT_COMMAND` on the startup `#D1778` 042376b
- main: run `ble/base/unload` directly at the end of `EXIT` handler `#D1797` 0000000

## Compatibility

Expand Down
145 changes: 144 additions & 1 deletion note.txt
Expand Up @@ -1337,6 +1337,9 @@ bash_tips

* wezterm, bash-preexec に対する patch を終結させる。

* bash-preexec に API 安定化のお願いをする → これは PR を出したが返事がない。
時々活動はあるみたいなので少しでも反応があった時に改めてお願いする事にする。

* bash-preexec は既存の DEBUG trap を正しく実行できていない様に思われる

$ trap 'echo XXX' DEBUG
Expand Down Expand Up @@ -1806,6 +1809,44 @@ bash_tips
ToDo
-------------------------------------------------------------------------------

2022-03-03

* 起動時の fork について

* ble/base/adjust-builtin-wrappers/.assign (2 fork) ... 此処で builtin,
alias を保存する為に2回に分けて defs=$(...) を実行している。この時点では
初期化が終わっていないので ble/util/assign は使えない。

これはそもそも勝手に上書きした builtin や alias を保持する必要があるのか
という事を考えるとスキップしても良い様な気がする。起動の高速化の為にこう
いった物を省略するオプションを用意して良い様な気はする。

* ble/util/msleep/.check-builtin-sleep ... これはロードに失敗した時の事を考
えて subshell 内部で実行している。

これも sleep の方法を予め引数等で指定する仕組みを用意しておけばスキップす
る事は可能である。また builtin sleep に頼り切るのも問題の気がする。という
か builtin sleep だと C-c が効かない等の問題がある。

改めて plain Bash に builtin sleep を読み込んで動作を調べてみる。と思った
が再現しない。というよりそもそも ble.sh をロードしていても bash-5.0 でし
か再現しない。つまり bash-5.0 & ble.sh の時にだけ bultin sleep 3 で C-c
に対して即座に実行が中止されない。ble-detach していてもこの問題は発生する。
plain Bash で直接 enable -f /path/to/sleep sleep して sleep 3 に対して
C-c した時にはちゃんとすぐに終了する。

* ble/builtin/bind/read-user-settings/.reconstruct ... これは記録されている
default bash の binding と、現在の binding を比較してユーザーが設定した
keybinding を抽出する為に awk を呼び出している。

これは既存の readline 設定を読み取らない事にすればスキップはできる。実際、
ble.sh の読み込み時に --noinputrc を指定すればこれは実行されない。

以上の物は何れもユーザーオプションで省略できる様な機能ではある。然し一方で
ロードのボトルネックは実は fork ではない。少なくとも Linux では。但し、
Cygwin では 50ms/fork かかるので 4 fork 省略できるだけで 200ms も時間を短縮
できるので大きい。

2022-02-20

* より一般の補完 framework に向けたインターフェイスについて
Expand Down Expand Up @@ -1993,7 +2034,9 @@ bash_tips
これを使って処理するのはもしかしたら外部プログラムに頼らなければならない
かもしれない。

* bash-preexec に API 安定化のお願いをする。
或いはデータベース等も保存先として考えても良いのかもしれない。但し、その場
合には sqlite3 等に対する依存性が発生する。一方で、sqlite3 には最低限の排他
制御が含まれている様ではある。

* "for ((i=0;i<10;i++)); do sleep 1; done" で C-c すると ble.sh 全体がその場で停止する

Expand Down Expand Up @@ -6133,6 +6176,106 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2022-03-03

* main: ble/base/unload 後に ble/util/assign 一時ファイルが残留する [#D1797]

ble/base/clean-up-runtime-directory で毎回 rm が実行されている。どうやら前
回の session が最後に assign に実行をしてそれで一時ファイルが作成されている
様だ。

ble/base/unload を実行した後に trap/.handler で joblist.check を呼び出して
いるのが原因である。或いは、joblist.check は unload 状態にある場合には実行
しなくても良いのではないか。然し、改めて確認すると unload の状態にあるかど
うかを記録している変数はない様だ。そう思うと EXIT の時だけの特別扱いとして
joblist.check をスキップするという可能性? 或いは、unload を実行した時点で
ble/util/assign を使わない実装に切り替える?

a ble/util/unload は trap/.handler 以下で直接実行する。結局勝手に削除されて
は困る物だし、最も重要な物の一部でありモジュールを疎結合にする必要性も薄
い。という事を考えると、unload は特別扱いしても良いのかもしれない。

然し、そもそもの問題として trap handler を jobs で囲んでいた理由を考える
と、やはり unload であっても囲んで実行した方が良い可能性はあるのだろうか。

? というよりそもそも何故 jobs で囲んでいたのだったか。

思うに、trap handler の中等で外部コマンド等を実行するとその分だけ job
項目が累積してしまう問題を防ぐのが目的だった気がする。今正に終了しよう
としている段階で jobs を表示する機会はない気がするので気にしなくても良
いのではないだろうか → 2回目の joblist の呼び出しは正に
ignore-volatile-jobs で呼び出しているので無視するのが目的である。

問題が起こるとすれば user trap の中で jobs を呼び出した時にごみが沢山表示
される可能性があるという事だが、其処で変な物が表示されても大した問題では
ない様な気がする。というより、そもそも ble.sh がジョブ一覧を管理している
時点で user が実行した jobs からは特定の項目が受け落ちている筈だから、な
い筈の物があるぐらいならそれに比べれば大した問題ではないのでは? という考
え方もできるかもしれない。

? user trap を jobs で囲む必要性はないのだろうか。

これは本来は user trap の中で発生した余分な jobs entry も削除してしまっ
て良い気がするが、もしかすると本当に job を投げるという事があるかもしれ
ないので、その項目が意図せず消滅しない様に囲むのはやめたのだろうという
様に思われる。何れにしても今回は関係ない。

? そもそも EXIT の中から終了をキャンセルする事は可能なのだろうか。或いは、
他の要因によって終了がキャンセルされる可能性はあるのだろうか。考えて見
るにその様な方法は存在しない気がする。という事を考えると、jobs の情報を
収集しても仕方がないのではないかという気がする。

o ユーザーが登録した何かが ble.sh に依存しているという可能性もあるのでは
ないか。という事を思うと、やはり unload は外側で一番最後に実行するべき
の気がする。

b 或いは、EXIT の時だけは joblist.check はスキップする。或いは unload して
いる事を何処かに記録するなどして、それに応じて joblist.check をスキップす
る。

c 或いは unload の際に ble/util/asign を書き換えてコマンド置換を使う様にす
る → 然し、そうすると環境に影響を与える事を前提としている
ble/util/assign の呼び出しに対して正しく対処できなくなる。特に今回問題に
なっている joblist.check の呼び出しは環境に対する影響を前提としているので、
この方法では正しい解決方法にはならない気がする。

また、この方法だと結局 fork の回数が終了時に余分に増える事になるので合計
では実行時間は減らない。寧ろ、複数回の ble/util/assign がある様なので、そ
れによって合計時間は増えてしまっている。(但し、終了時なのでユーザー体験を
損ねる事はない様に思われる。)

現在の文脈を変える為に >/dev/null に繋いで現在の環境でも実行するという事
もできるかもしれないが、もしそのコマンドがファイルシステム等に副作用を齎
す物だった場合、二回実行する事によって結果が変わってしまうし、また実行時
間も二倍になるし良い事は何もない。

d 或いは unload している時には何か別のファイルを一時ファイルとして
ble/util/assign を利用する? 然しもしその様なファイルを簡単に安全に作れる
のであれば始めから ble/util/assign は必要ないのでは。

或いは unload している時は ble/util/assign/.rmtmp に於いて rm を明示的に
実行する様にする。然し、これだと結局 fork の数は増えるので意味がない。然
し、少なくとも動作が変わってしまう c よりは現実的な方法である。

# ? 所で here document 等を一時ファイルの代わりに使う事はできるのだろうか。
# と思ったが、最近の bash では here documents は一時ファイルではなく pipe
# になってしまっているので使えない。
#
# 試しに以下を試してみたらファイルの読み書きが出来てしまった。
#
# $ bash-4.4 -c '{ echo check world > /proc/self/fd/0; cat /proc/self/fd/0; } <<< hello'
#
# 然し、bash-5.0 以上では失敗する。bash-5.0 以上でファイルにする為には大
# 量のデータで初期化しなければならないので非現実的な気がする。その他に
# bash が一時ファイルを生成しそうな場合はない気がする。プロセス置換は
# pipe である。
#
# 更に本当にどのシステムで動くのかも定かではない。どうやら bash は一時ファ
# イルを早々に unlink してからコマンドを実行する様である為。

結局 a の方法で、ble/base/unload は別枠で trap handler の最後で実行する事に
した。

2022-03-02

* 2022-02-03 edit: もしかしたら stty sane の頭に空白を置くと良いのでは [#D1796]
Expand Down
5 changes: 5 additions & 0 deletions src/util.sh
Expand Up @@ -2247,6 +2247,11 @@ function ble/builtin/trap/.handler {
[[ $_ble_builtin_trap_lastarg == *$'\n'* ]] &&
_ble_builtin_trap_lastarg=

# Note #D1797: EXIT に対する ble/base/unload は trap handler のできるだけ最後
# に実行する。勝手に削除されても困るし、他の handler が ble.sh の機能を使った
# 時に問題が起こらない様にする為。
((_ble_trap_sig==0)) && ble/base/unload

ble/base/.restore-bash-options set shopt
}

Expand Down

0 comments on commit 115baec

Please sign in to comment.