* 仕様書

[REFS[
- [44] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#dom-workerglobalscope-close>
- [202] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2016-12-06 07:17:59 +09:00]]) <https://html.spec.whatwg.org/#worker-event-loop>
- [48] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#run-a-worker>
- [78] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#terminate-a-worker>
- [95] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#dom-worker-terminate>
- [1] [CITE@en[Service Workers Nightly]] ([TIME[2017-02-16 20:10:49 +09:00]]) <https://w3c.github.io/ServiceWorker/#service-worker-lifetime>
- [5] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#terminate-service-worker>
]REFS]

* 閉じ中フラグ

[203] [CODE(DOMi)@en[WorkerGlobalScope]] [[オブジェクト]]は、
[DFN[[F[[RUBYB[[[閉じ中]]]@en[closing]]]]]]フラグを持ちます。
初期状態は[[偽]]です。 [SRC[>>202]]

;; [[タスクをキューに追加]]等[[タスクキュー]]への追加の発生時に参照されます。

[45] [CODE(DOMi)@en[[[WorkerGlobalScope]]]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[[[close]]]]]] [[メソッド]]は、次のようにしなければ[['''なりません''']]
[SRC[>>44]]。
[FIG(steps)[
= [99] [[原子的]]に:
== [46] [[文脈オブジェクト]]の[F[[[イベントループ]]]]の[F[[[タスクキュー]]]]の[[タスク]]をすべて捨てます。
== [47] [[文脈オブジェクト]]の [F[[[closing flag]]]] を[[真]]に設定します。
]FIG]

* ワーカーの終了

[96] [CODE(DOMi)@en[[[Worker]]]] [[インターフェイス]]の 
[DFN[[CODE(DOMm)@en[[[terminate]]]]]] [[メソッド]]は、
[F[関連付けられた[[ワーカー]]]]について[[ワーカーを停止]]しなければ[['''なりません''']]
[SRC[>>95]]。

;; [97] [CODE(DOMi)@en[[[SharedWorker]]]] にはありません。

[88] [DFN[[RUBYB[ワーカーを停止]@en[terminate a worker]]]]するには、
[[並列に]]次のようにしなければ[['''なりません''']] [SRC[>>78]]。
[FIG(steps)[
= [89] [[ワーカー]]の [F[[CODE(DOMi)@en[[[WorkerGlobalScope]]]]]]
の [F[[[closing flag]]]] を[[真]]に設定します。
= [90] [[ワーカー]]の [F[[CODE(DOMi)@en[[[WorkerGlobalScope]]]]]] 
の[F[[[イベントループ]]]]の[F[[[タスクキュー]]]]の[[タスク]]をすべて捨てます。
= [91] [[ワーカー]]で動作中の[[スクリプト]]について、
[[走っているスクリプトの実行中断]]を実行します。
= [92] [[ワーカー]]の [F[[CODE(DOMi)@en[[[WorkerGlobalScope]]]]]]
が [CODE(DOMi)@en[[[DedicatedWorkerGlobalScope]]]] なら、
[[ワーカー]]の[F[暗示的なポート]]が [[entangle]] されている [[port message queue]]
を空にします。
]FIG]

;; [94] [[run a worker]] のメインの[[スクリプト]]や [CODE(DOMm)@en[[[importScripts]]]]
の[[スクリプト]]が実行停止されることがあります。
その他の[[スクリプト]]も (明記されていませんが) 停止するはずです。

[73] [[ワーカーを走らせる]]処理の最後の[[ワーカーの終了]]の段階は、
[VAR[内側設定群]]と[VAR[ワーカー大域適用範囲]]を次のようにしなければ[MUST[なりません]] [SRC[>>48]]。

[FIG(steps)[
= [74] [VAR[内側設定群]]の[F[[[活性タイマーのリスト]]]]を空にします。
= [75] [VAR[ワーカー大域適用範囲]]の[F[ポート群][ワーカーのポート群]]の各[VAR[ポート]]について、
== [201] [VAR[ポート]]の [[disentangle]] を実行します。
= [76] [VAR[ワーカー大域適用範囲]]の[F[所有子集合]]を[[空][空リスト]]にします。
]FIG]

[40] [F[[[Blob URL Store]]]] 内の [[Blob URL]] は (暗黙に) 破棄されると思われます。

[7] [[ワーカーを走らせる]]処理から呼び出されます。

[87] [[利用者エージェント]]は、[[ワーカー]]が [F[closing flag]]
が[[真]]に設定されてもなお走り続けている場合で、 [[active needed worker]] でなくなった時、
[[ワーカーを停止]]させても構いません。 [SRC[>>78]]

[111] [CODE(DOMi)@en[[[Worker]]]] や [CODE(DOMi)@en[[[SharedWorker]]]]
への参照を破棄すると、その[[ワーカー]]に[[スクリプト]]からアクセスする手段がなくなるかもしれません。
[[仕様書]]上は、それによって[[ワーカー]]が破棄されるわけではありません。
しかし実際には [[GC]] により破棄されるようです [SRC[>>21]]。
([[著者]]の[[スクリプト]]から観測できない実装の最適化といえるものなので、
[[仕様書]]上には現れません。)

* サービスワーカーの終端

[8] [DFN[[RUBYB[サービスワーカーを終端]@en[terminate service worker]]]]させるには、
[[サービスワーカー]][VAR[ワーカー]]を次のようにします [SRC[>>5]]。

[FIG(steps)[
= [9] [VAR[ワーカー]]の[F[走っている]]が[[偽]]の場合、
== [10] ここで停止します。
= [11] [VAR[大域適用範囲]]を、[VAR[ワーカー]]の[F[大域オブジェクト]]に設定します。
= [12] [VAR[大域適用範囲]]の[F[閉じ中フラグ]]を、[[真]]に設定します。
= [13] [VAR[ワーカー]]の [F[set of extended events]] を[[空][空リスト]]にします。
= [16] [VAR[大域適用範囲]]の[F[イベントループ]]の[F[タスクキュー群]]の各[VAR[[[タスクキュー]]]]について、
== [14] [VAR[タスク]]を、[VAR[タスクキュー]]を [[dequeue]] した結果に設定します。
== [19] [VAR[タスク]]が [CODE[null]] 以外なら、
=== [17] [VAR[タスク]]の[F[タスク源]]が [[handle fetch task source]]
または [[handle functional event task source]] なら、
==== [18] [[タスクをキューに追加]]します。
[FIG(list members)[
: [VAR[タスク]] : [VAR[タスク]]
: [VAR[タスク源]] : [VAR[タスク]]の[F[タスク源]]
: [VAR[[[タスクキュー]]]] : [VAR[ワーカー]]の [F[containing service worker registration]] の
[F[タスクキュー群]]の[VAR[タスクキュー]]に相当する[[タスクキュー]]
]FIG]
= [15] [VAR[ワーカー]]で動作中の[[スクリプト]]について、
[[走っているスクリプトの実行中断]]を実行します。
]FIG]

[4] 実行中の [[handle fetch]] や [[Install]] を失敗させることになる場合があります。

** 文脈

[2] [[利用者エージェント]]は、処理する[[イベント]]がなくなったとき、
[[サービスワーカーを終端]]させて構いません。 [SRC[>>1]]

[3] [[利用者エージェント]]は、[[無限ループ]]や割当時間超過など、
異常を検知したとき、[[イベント]]の処理中であっても[[サービスワーカーを終端]]させて構いません。 [SRC[>>1]]

[24] 
[[Install]] から呼び出されることがあります。


* 歴史

[6] [[ワーカー]]の歴史も参照。

[20] [CITE@en[Editorial: restructure ownership of workers to parent-owners]]
([[annevk]]著, [TIME[2017-04-14 14:47:44 +09:00]])
<https://github.com/whatwg/html/commit/59a4750f475acd789ee436b4906972ba2081d8b3>

** ワーカーを殺す

- [77] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#kill-a-worker>

[84] [[利用者エージェント]]は、いつでも[[ワーカーを殺す]]処理を実行して構いません。
例えば次の時に実行できます。 [SRC[>>77]]
[FIG(list)[
- [85] [[利用者]]に要求された時
- [86] [[CPU]] の [[quota]] 超過時
- [87] [F[[[closing flag]]]] が[[真]]に設定されてもなお走り続けている場合で、
[[active needed worker]] でなくなった時
]FIG]

[79] [DFN[[RUBYB[ワーカーを殺す]@en[kill a worker]]]]には、
[[並列に]]次のようにしなければ[['''なりません''']] [SRC[>>77]]。
[FIG(steps)[
= [80] [[ワーカー]]の [F[[CODE(DOMi)@en[[[WorkerGlobalScope]]]]]]
の [F[[[closing flag]]]] を[[真]]に設定します。
= [81] [[ワーカー]]の [F[[CODE(DOMi)@en[[[WorkerGlobalScope]]]]]]
の[F[[[イベントループ]]]]の[F[[[タスクキュー]]]]の[[タスク]]をすべて捨てます。
= [82] [[利用者エージェント]]定義の時間、待ちます。
= [83] [[ワーカー]]で動作中の[[スクリプト]]について、
[[走っているスクリプトの実行中断]]を実行します。
]FIG]

;; [93] [[run a worker]] のメインの[[スクリプト]]や [CODE(DOMm)@en[[[importScripts]]]]
の[[スクリプト]]が実行停止されることがあります。
その他の[[スクリプト]]も (明記されていませんが) 停止するはずです。

[21] [CITE@en[Remove overly permissive "kill a worker" algorithm]]
([[annevk]]著, [TIME[2017-04-19 16:37:30 +09:00]])
<https://github.com/whatwg/html/commit/77c694e25adabfc5706b5885fbcc1b0d3d5c4416>

[22] [CITE[The WHATWG Blog — HTML and shared memory]]
([TIME[2017-05-02 09:07:11 +09:00]])
<https://blog.whatwg.org/html-and-shared-memory>

[23] [CITE@en[Meta: export WorkerGlobalScope "closing" dfn]]
([[jugglinmike]]著, [TIME[2017-05-23 00:41:00 +09:00]])
<https://github.com/whatwg/html/commit/018547046496a8eed2a660544462589e1c7c4ff5>