Skip to content

Commit 0a945f7

Browse files
Fixed a factory output cleanup race (#1685)
* Fixed a factory output cleanup race * Restored back lock in onStopped * Build fix
1 parent 2d33eff commit 0a945f7

2 files changed

Lines changed: 22 additions & 4 deletions

File tree

obs-studio-server/source/osn-output.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,15 @@ osn::Output::~Output() {}
3535

3636
void osn::Output::InitOutput(obs_output_t *output)
3737
{
38+
{
39+
std::unique_lock lock(m_mtxOutputStop);
40+
m_outputStopped = false;
41+
}
42+
3843
auto onStopped = [](void *data, calldata_t *) {
3944
osn::Output *context = reinterpret_cast<osn::Output *>(data);
4045
std::unique_lock lock(context->m_mtxOutputStop);
46+
context->m_outputStopped = true;
4147
context->m_cvStop.notify_one();
4248
};
4349

@@ -69,10 +75,16 @@ void osn::Output::DeleteOutput()
6975

7076
blog(LOG_INFO, "osn::Output::DeleteOutput");
7177

72-
if (obs_output_active(m_output)) {
78+
bool shouldWaitForStop = false;
79+
{
80+
std::unique_lock lock(m_mtxOutputStop);
81+
shouldWaitForStop = obs_output_active(m_output) && !m_outputStopped;
82+
}
83+
84+
if (shouldWaitForStop) {
7385
obs_output_stop(m_output);
7486
std::unique_lock lock(m_mtxOutputStop);
75-
m_cvStop.wait_for(lock, std::chrono::seconds(20));
87+
m_cvStop.wait_for(lock, std::chrono::seconds(20), [this] { return m_outputStopped; });
7688
}
7789
obs_output_release(m_output);
7890
m_output = nullptr;
@@ -116,6 +128,11 @@ void osn::Output::StartOutput()
116128
if (!m_output)
117129
return;
118130

131+
{
132+
std::unique_lock lock(m_mtxOutputStop);
133+
m_outputStopped = false;
134+
}
135+
119136
outdated_driver_error::instance()->set_active(true);
120137
bool result = obs_output_start(m_output);
121138
outdated_driver_error::instance()->set_active(false);
@@ -179,4 +196,4 @@ obs_output_t *osn::Output::GetOutput()
179196
const obs_output_t *osn::Output::GetOutput() const
180197
{
181198
return m_output;
182-
}
199+
}

obs-studio-server/source/osn-output.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@ class Output {
6868

6969
std::condition_variable m_cvStop;
7070
std::mutex m_mtxOutputStop;
71+
bool m_outputStopped = false;
7172

7273
const std::vector<std::string> m_signals;
7374
};
7475

75-
}
76+
}

0 commit comments

Comments
 (0)