diff --git a/.run/srs-stack.run.xml b/.run/srs-stack.run.xml
new file mode 100644
index 000000000..720752edf
--- /dev/null
+++ b/.run/srs-stack.run.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 7060ca71e..88415ab92 100755
--- a/README.md
+++ b/README.md
@@ -119,7 +119,7 @@ developers listed below:
[![](https://opencollective.com/srs-server/backers.svg?width=800&button=false)](https://opencollective.com/srs-server)
We at SRS aim to establish a non-profit, open-source community that assists developers worldwide in creating
-their own high-quality streaming and RTC platforms to support your businesses.
+your own high-quality streaming and RTC platforms to support your businesses.
## AUTHORS
diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md
index 062a8f925..14d6c823e 100644
--- a/trunk/doc/CHANGELOG.md
+++ b/trunk/doc/CHANGELOG.md
@@ -7,6 +7,7 @@ The changelog for SRS.
## SRS 6.0 Changelog
+* v6.0, 2023-08-28, Merge [#3781](https://github.com/ossrs/srs/pull/3781): HLS: Fix on_hls and hls_dispose critical zone issue. v6.0.69 (#3781)
* v6.0, 2023-08-28, Merge [#3768](https://github.com/ossrs/srs/pull/3768): Support include empty config file. v6.0.68 (#3768)
* v6.0, 2023-08-25, Merge [#3782](https://github.com/ossrs/srs/pull/3782): HLS: Support reload HLS asynchronously. v6.0.67 (#3782)
* v6.0, 2023-08-22, Merge [#3775](https://github.com/ossrs/srs/pull/3775): Bugfix: Log format output type does not match. v6.0.66 (#3699)
@@ -80,6 +81,7 @@ The changelog for SRS.
## SRS 5.0 Changelog
+* v5.0, 2023-08-28, Merge [#3781](https://github.com/ossrs/srs/pull/3781): HLS: Fix on_hls and hls_dispose critical zone issue. v5.0.174 (#3781)
* v5.0, 2023-08-28, Merge [#3768](https://github.com/ossrs/srs/pull/3768): Support include empty config file. v5.0.173 (#3768)
* v5.0, 2023-08-25, Merge [#3782](https://github.com/ossrs/srs/pull/3782): HLS: Support reload HLS asynchronously. v5.0.172 (#3782)
* v5.0, 2023-08-22, Merge [#3775](https://github.com/ossrs/srs/pull/3775): Bugfix: Log format output type does not match. v5.0.171 (#3699)
diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp
index 8ac72547b..7fa2fc299 100644
--- a/trunk/src/app/srs_app_hls.cpp
+++ b/trunk/src/app/srs_app_hls.cpp
@@ -1136,6 +1136,7 @@ SrsHls::SrsHls()
enabled = false;
disposable = false;
+ unpublishing_ = false;
async_reload_ = reloading_ = false;
last_update_time = 0;
hls_dts_directly = false;
@@ -1222,7 +1223,7 @@ void SrsHls::dispose()
srs_error_t SrsHls::cycle()
{
srs_error_t err = srs_success;
-
+
if (last_update_time <= 0) {
last_update_time = srs_get_system_time();
}
@@ -1231,6 +1232,9 @@ srs_error_t SrsHls::cycle()
return err;
}
+ // When unpublishing, we must wait for it done.
+ if (unpublishing_) return err;
+
// When reloading, we must wait for it done.
if (async_reload_) return err;
@@ -1243,12 +1247,12 @@ srs_error_t SrsHls::cycle()
return err;
}
last_update_time = srs_get_system_time();
-
+
if (!disposable) {
return err;
}
disposable = false;
-
+
srs_trace("hls cycle to dispose hls %s, timeout=%dms", req->get_stream_url().c_str(), hls_dispose);
dispose();
@@ -1295,6 +1299,8 @@ srs_error_t SrsHls::on_publish()
// if enabled, open the muxer.
enabled = true;
+ // Reset the unpublishing state.
+ unpublishing_ = false;
// ok, the hls can be dispose, or need to be dispose.
disposable = true;
@@ -1310,6 +1316,10 @@ void SrsHls::on_unpublish()
if (!enabled) {
return;
}
+
+ // During unpublishing, there maybe callback that switch to other coroutines.
+ if (unpublishing_) return;
+ unpublishing_ = true;
if ((err = controller->on_unpublish()) != srs_success) {
srs_warn("hls: ignore unpublish failed %s", srs_error_desc(err).c_str());
@@ -1317,6 +1327,7 @@ void SrsHls::on_unpublish()
}
enabled = false;
+ unpublishing_ = false;
}
srs_error_t SrsHls::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* format)
@@ -1324,7 +1335,7 @@ srs_error_t SrsHls::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* forma
srs_error_t err = srs_success;
// If not able to transmux to HLS, ignore.
- if (!enabled) return err;
+ if (!enabled || unpublishing_) return err;
if (async_reload_) return reload();
// Ignore if no format->acodec, it means the codec is not parsed, or unknown codec.
@@ -1406,7 +1417,7 @@ srs_error_t SrsHls::on_video(SrsSharedPtrMessage* shared_video, SrsFormat* forma
srs_error_t err = srs_success;
// If not able to transmux to HLS, ignore.
- if (!enabled) return err;
+ if (!enabled || unpublishing_) return err;
if (async_reload_) return reload();
// Ignore if no format->vcodec, it means the codec is not parsed, or unknown codec.
diff --git a/trunk/src/app/srs_app_hls.hpp b/trunk/src/app/srs_app_hls.hpp
index 7975230e0..e111b68b6 100644
--- a/trunk/src/app/srs_app_hls.hpp
+++ b/trunk/src/app/srs_app_hls.hpp
@@ -279,10 +279,12 @@ private:
bool enabled;
// Whether the HLS stream is able to be disposed.
bool disposable;
+ // Whether the HLS stream is unpublishing.
+ bool unpublishing_;
// Whether requires HLS to do reload asynchronously.
bool async_reload_;
bool reloading_;
- // To detect heartbeat and dipose it if configured.
+ // To detect heartbeat and dispose it if configured.
srs_utime_t last_update_time;
private:
// If the diff=dts-previous_audio_dts is about 23,
diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp
index 044a8e80d..89715af75 100644
--- a/trunk/src/core/srs_core_version5.hpp
+++ b/trunk/src/core/srs_core_version5.hpp
@@ -9,6 +9,6 @@
#define VERSION_MAJOR 5
#define VERSION_MINOR 0
-#define VERSION_REVISION 173
+#define VERSION_REVISION 174
#endif
diff --git a/trunk/src/core/srs_core_version6.hpp b/trunk/src/core/srs_core_version6.hpp
index 8631d8510..19b1b1920 100644
--- a/trunk/src/core/srs_core_version6.hpp
+++ b/trunk/src/core/srs_core_version6.hpp
@@ -9,6 +9,6 @@
#define VERSION_MAJOR 6
#define VERSION_MINOR 0
-#define VERSION_REVISION 68
+#define VERSION_REVISION 69
#endif