mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
RTC: Cover connection manager coroutine switch when dispoing conn
This commit is contained in:
parent
27b85c7390
commit
f7faa13dc5
3 changed files with 40 additions and 0 deletions
|
@ -41,6 +41,7 @@ VOID TEST(KernelRTCTest, ConnectionManagerTest)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
// Normal scenario, free object by manager.
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsConnectionManager manager;
|
SrsConnectionManager manager;
|
||||||
HELPER_EXPECT_SUCCESS(manager.start());
|
HELPER_EXPECT_SUCCESS(manager.start());
|
||||||
|
@ -54,6 +55,38 @@ VOID TEST(KernelRTCTest, ConnectionManagerTest)
|
||||||
srs_usleep(0); // Switch context for manager to dispose connections.
|
srs_usleep(0); // Switch context for manager to dispose connections.
|
||||||
EXPECT_EQ(0, manager.size()); EXPECT_TRUE(manager.empty());
|
EXPECT_EQ(0, manager.size()); EXPECT_TRUE(manager.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Coroutine switch context, signal is lost.
|
||||||
|
if (true) {
|
||||||
|
SrsConnectionManager manager;
|
||||||
|
HELPER_EXPECT_SUCCESS(manager.start());
|
||||||
|
EXPECT_EQ(0, manager.size()); EXPECT_TRUE(manager.empty());
|
||||||
|
|
||||||
|
if (true) { // First connection, which will switch context when deleting.
|
||||||
|
MockSrsConnection* conn = new MockSrsConnection();
|
||||||
|
conn->do_switch = true;
|
||||||
|
manager.add(conn);
|
||||||
|
EXPECT_EQ(1, manager.size()); EXPECT_EQ(0, manager.zombies_.size());
|
||||||
|
|
||||||
|
manager.remove(conn); // Remove conn to zombies.
|
||||||
|
EXPECT_EQ(1, manager.size()); EXPECT_EQ(1, manager.zombies_.size());
|
||||||
|
|
||||||
|
srs_usleep(0); // Switch to manager coroutine to try to free zombies.
|
||||||
|
EXPECT_EQ(0, manager.size()); EXPECT_EQ(0, manager.zombies_.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (true) { // Now the previous conn switch back to here, and lost the signal.
|
||||||
|
MockSrsConnection* conn = new MockSrsConnection();
|
||||||
|
manager.add(conn);
|
||||||
|
EXPECT_EQ(1, manager.size()); EXPECT_EQ(0, manager.zombies_.size());
|
||||||
|
|
||||||
|
manager.remove(conn); // Remove conn to zombies, signal is lost.
|
||||||
|
EXPECT_EQ(1, manager.size()); EXPECT_EQ(1, manager.zombies_.size());
|
||||||
|
|
||||||
|
srs_usleep(0); // Switch to manager, but no signal is triggered before, so conn will be freed by loop.
|
||||||
|
EXPECT_EQ(0, manager.size()); EXPECT_EQ(0, manager.zombies_.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID TEST(KernelRTCTest, StringDumpHexTest)
|
VOID TEST(KernelRTCTest, StringDumpHexTest)
|
||||||
|
|
|
@ -44,10 +44,14 @@ using namespace std;
|
||||||
|
|
||||||
MockSrsConnection::MockSrsConnection()
|
MockSrsConnection::MockSrsConnection()
|
||||||
{
|
{
|
||||||
|
do_switch = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
MockSrsConnection::~MockSrsConnection()
|
MockSrsConnection::~MockSrsConnection()
|
||||||
{
|
{
|
||||||
|
if (do_switch) {
|
||||||
|
srs_usleep(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string MockSrsConnection::remote_ip()
|
std::string MockSrsConnection::remote_ip()
|
||||||
|
|
|
@ -34,6 +34,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
class MockSrsConnection : public ISrsConnection
|
class MockSrsConnection : public ISrsConnection
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
// Whether switch the coroutine context when free the object, for special case test.
|
||||||
|
bool do_switch;
|
||||||
public:
|
public:
|
||||||
MockSrsConnection();
|
MockSrsConnection();
|
||||||
virtual ~MockSrsConnection();
|
virtual ~MockSrsConnection();
|
||||||
|
|
Loading…
Reference in a new issue