-
Notifications
You must be signed in to change notification settings - Fork 4
/
178.txt
158 lines (125 loc) · 8.83 KB
/
178.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
* 仕様書
[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]]]]
への参照を破棄すると、その[[ワーカー]]に[[スクリプト]]からアクセスする手段がなくなるかもしれませんが、
それによって[[ワーカー]]が破棄されるわけではありません。
* サービスワーカーの終端
[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]] を失敗させることになる場合があります。
;; [[handle fetch]] 参照。
** 文脈
[2] [[利用者エージェント]]は、処理する[[イベント]]がなくなったとき、
[[サービスワーカーを終端]]させて構いません。 [SRC[>>1]]
[3] [[利用者エージェント]]は、[[無限ループ]]や割当時間超過など、
異常を検知したとき、[[イベント]]の処理中であっても[[サービスワーカーを終端]]させて構いません。 [SRC[>>1]]
* 歴史
[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>