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.
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.
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.In the
SrsHttpStreamServer::http_unmount(SrsRequest* r)
function,stream->alive()
is already false, somux.unhandle
will free theSrsLiveStream
. This causes the other connection coroutine to return to its execution environment after theSrsLiveStream
instance has already been freed.alive_
was changed from abool
to anint
to ensure thatmux.unhandle
is only executed after each connection'sserve_http
has exited.