forked from pharo-project/pharo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TKTWatchDog.class.st
139 lines (120 loc) · 2.79 KB
/
TKTWatchDog.class.st
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
"
Watchdog watches the common queue worker pool to ensure the good working of this pool
"
Class {
#name : #TKTWatchDog,
#superclass : #TKTService,
#instVars : [
'values',
'id',
'started'
],
#classInstVars : [
'onDuty'
],
#category : #'TaskIt-Worker'
}
{ #category : #accessing }
TKTWatchDog class >> onDuty [
^ onDuty
ifNil: [ onDuty := self new.
onDuty start.
onDuty ]
]
{ #category : #reseting }
TKTWatchDog class >> reset [
onDuty ifNotNil: [ onDuty stop ].
onDuty := nil.
]
{ #category : #initialization }
TKTWatchDog >> cleanUpImageToStart [
values removeAll
]
{ #category : #initialization }
TKTWatchDog >> delay [
^ 10 seconds
]
{ #category : #initialization }
TKTWatchDog >> ensureIsAwake [
self isRunning
ifFalse: [ self restart ]
]
{ #category : #initialization }
TKTWatchDog >> ensureIsWatching: aValue [
worker = aValue ifTrue: [ ^ self ].
(values includes: aValue)
ifFalse: [ self watch: aValue ].
self ensureIsAwake
]
{ #category : #initialization }
TKTWatchDog >> initialize [
super initialize.
values := WeakSet new.
id := UUID new.
started := false
]
{ #category : #initialization }
TKTWatchDog >> name [
^ 'WatchDog (' , id asString , ')'
]
{ #category : #'as yet unclassified' }
TKTWatchDog >> pharoProcess [
^ worker process process
]
{ #category : #initialization }
TKTWatchDog >> privateStart [
stopRequested := false.
stopCallbacks := Set new.
" A worker normally needs to be watched. But the watchdog process cannot be watched, because the watchdog do not yet exists.
This is a hacky workaround. Think a better solution.
"
worker := TKTWorker basicNew.
worker initialize.
worker taskQueue: AtomicSharedQueue new.
recursiveTask := [ self iterateService.
self scheduleRecursiveTask ] asTask.
TKTConfiguration serviceManager startService: self
]
{ #category : #initialization }
TKTWatchDog >> start [
started
ifFalse: [ started := true.
self privateStart ]
]
{ #category : #initialization }
TKTWatchDog >> stepService [
self watchedValues
ifEmpty: [ self stop ]
ifNotEmpty: [ values do: [ :v | self watchDog: v ].
self delay wait ]
]
{ #category : #initialization }
TKTWatchDog >> stop [
started := false.
super stop
]
{ #category : #initialization }
TKTWatchDog >> stopWatching: aValue [
values remove: aValue ifAbsent: [ ]
]
{ #category : #initialization }
TKTWatchDog >> watch: aValue [
values add: aValue
]
{ #category : #initialization }
TKTWatchDog >> watchDog: aParameterPool [
[ aParameterPool ensureIsWorking ]
on: UnhandledError
do: [ :err |
self traceCr: err printString.
self
log:
'Watch dog is not watching anymore the value: '
,
(values remove: aParameterPool ifAbsent: [ aParameterPool ])
printString ]
]
{ #category : #initialization }
TKTWatchDog >> watchedValues [
^ values
]