mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
I did some preliminary code inspection. The two playback endpoints share the same `SrsLiveStream` instance. After the first one disconnects, `alive_` is set to false. ``` alive_ = true; err = do_serve_http(w, r); alive_ = false; ``` In the `SrsHttpStreamServer::http_unmount(SrsRequest* r)` function, `stream->alive()` is already false, so `mux.unhandle` will free the `SrsLiveStream`. This causes the other connection coroutine to return to its execution environment after the `SrsLiveStream` instance has already been freed. ``` // Wait for cache and stream to stop. int i = 0; for (; i < 1024; i++) { if (!cache->alive() && !stream->alive()) { break; } srs_usleep(100 * SRS_UTIME_MILLISECONDS); } // Unmount the HTTP handler, which will free the entry. Note that we must free it after cache and // stream stopped for it uses it. mux.unhandle(entry->mount, stream.get()); ``` `alive_` was changed from a `bool` to an `int` to ensure that `mux.unhandle` is only executed after each connection's `serve_http` has exited. --------- Co-authored-by: liumengte <liumengte@visionular.com> Co-authored-by: winlin <winlinvip@gmail.com> |
||
---|---|---|
.. | ||
3rdparty | ||
auto | ||
conf | ||
doc | ||
etc/init.d | ||
gdb | ||
ide/srs_clion | ||
modules | ||
packaging | ||
research | ||
scripts | ||
src | ||
usr/lib/systemd/system | ||
.gitignore | ||
AUTHORS.md | ||
AUTHORS.txt | ||
configure | ||
Dockerfile.builds | ||
Dockerfile.cov | ||
Dockerfile.pkg | ||
Dockerfile.test |