@@ -1136,6 +1136,7 @@ SrsHls::SrsHls()
1136
1136
1137
1137
enabled = false ;
1138
1138
disposable = false ;
1139
+ unpublishing_ = false ;
1139
1140
last_update_time = 0 ;
1140
1141
hls_dts_directly = false ;
1141
1142
@@ -1174,14 +1175,17 @@ void SrsHls::dispose()
1174
1175
srs_error_t SrsHls::cycle ()
1175
1176
{
1176
1177
srs_error_t err = srs_success;
1177
-
1178
+
1178
1179
if (last_update_time <= 0 ) {
1179
1180
last_update_time = srs_get_system_time ();
1180
1181
}
1181
1182
1182
1183
if (!req) {
1183
1184
return err;
1184
1185
}
1186
+
1187
+ // When unpublishing, we must wait for it done.
1188
+ if (unpublishing_) return err;
1185
1189
1186
1190
srs_utime_t hls_dispose = _srs_config->get_hls_dispose (req->vhost );
1187
1191
if (hls_dispose <= 0 ) {
@@ -1191,12 +1195,12 @@ srs_error_t SrsHls::cycle()
1191
1195
return err;
1192
1196
}
1193
1197
last_update_time = srs_get_system_time ();
1194
-
1198
+
1195
1199
if (!disposable) {
1196
1200
return err;
1197
1201
}
1198
1202
disposable = false ;
1199
-
1203
+
1200
1204
srs_trace (" hls cycle to dispose hls %s, timeout=%dms" , req->get_stream_url ().c_str (), hls_dispose);
1201
1205
dispose ();
1202
1206
@@ -1243,6 +1247,8 @@ srs_error_t SrsHls::on_publish()
1243
1247
1244
1248
// if enabled, open the muxer.
1245
1249
enabled = true ;
1250
+ // Reset the unpublishing state.
1251
+ unpublishing_ = false ;
1246
1252
1247
1253
// ok, the hls can be dispose, or need to be dispose.
1248
1254
disposable = true ;
@@ -1258,13 +1264,18 @@ void SrsHls::on_unpublish()
1258
1264
if (!enabled) {
1259
1265
return ;
1260
1266
}
1267
+
1268
+ // During unpublishing, there maybe callback that switch to other coroutines.
1269
+ if (unpublishing_) return ;
1270
+ unpublishing_ = true ;
1261
1271
1262
1272
if ((err = controller->on_unpublish ()) != srs_success) {
1263
1273
srs_warn (" hls: ignore unpublish failed %s" , srs_error_desc (err).c_str ());
1264
1274
srs_freep (err);
1265
1275
}
1266
1276
1267
1277
enabled = false ;
1278
+ unpublishing_ = false ;
1268
1279
}
1269
1280
1270
1281
srs_error_t SrsHls::on_audio (SrsSharedPtrMessage* shared_audio, SrsFormat* format)
0 commit comments