@@ -97,11 +97,17 @@ void SrsIngesterFFMPEG::fast_stop()
97
97
ffmpeg->fast_stop ();
98
98
}
99
99
100
+ void SrsIngesterFFMPEG::fast_kill ()
101
+ {
102
+ ffmpeg->fast_kill ();
103
+ }
104
+
100
105
SrsIngester::SrsIngester ()
101
106
{
102
107
_srs_config->subscribe (this );
103
108
104
109
expired = false ;
110
+ disposed = false ;
105
111
106
112
trd = new SrsDummyCoroutine ();
107
113
pprint = SrsPithyPrint::create_ingester ();
@@ -117,11 +123,18 @@ SrsIngester::~SrsIngester()
117
123
118
124
void SrsIngester::dispose ()
119
125
{
126
+ if (disposed) {
127
+ return ;
128
+ }
129
+ disposed = true ;
130
+
120
131
// first, use fast stop to notice all FFMPEG to quit gracefully.
121
132
fast_stop ();
133
+
134
+ srs_usleep (100 * SRS_UTIME_MILLISECONDS);
122
135
123
- // then, use stop to wait FFMPEG quit one by one and send SIGKILL if needed .
124
- stop ();
136
+ // then, use fast kill to ensure FFMPEG quit.
137
+ fast_kill ();
125
138
}
126
139
127
140
srs_error_t SrsIngester::start ()
@@ -166,6 +179,19 @@ void SrsIngester::fast_stop()
166
179
}
167
180
}
168
181
182
+ void SrsIngester::fast_kill ()
183
+ {
184
+ std::vector<SrsIngesterFFMPEG*>::iterator it;
185
+ for (it = ingesters.begin (); it != ingesters.end (); ++it) {
186
+ SrsIngesterFFMPEG* ingester = *it;
187
+ ingester->fast_kill ();
188
+ }
189
+
190
+ if (!ingesters.empty ()) {
191
+ srs_trace (" fast kill all ingesters ok." );
192
+ }
193
+ }
194
+
169
195
// when error, ingester sleep for a while and retry.
170
196
// ingest never sleep a long time, for we must start the stream ASAP.
171
197
#define SRS_AUTO_INGESTER_CIMS (3 * SRS_UTIME_SECONDS)
@@ -174,7 +200,7 @@ srs_error_t SrsIngester::cycle()
174
200
{
175
201
srs_error_t err = srs_success;
176
202
177
- while (true ) {
203
+ while (!disposed ) {
178
204
if ((err = do_cycle ()) != srs_success) {
179
205
srs_warn (" Ingester: Ignore error, %s" , srs_error_desc (err).c_str ());
180
206
srs_freep (err);
0 commit comments