Skip to content

Commit 5d1616e

Browse files
Fixed cleanup order of static objects
1 parent dbbf49d commit 5d1616e

3 files changed

Lines changed: 20 additions & 48 deletions

File tree

obs-studio-server/source/nodeobs_api.cpp

Lines changed: 3 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,52 +1668,10 @@ void OBS_API::destroyOBS_API(void)
16681668
archiveEncoder = nullptr;
16691669
}
16701670

1671-
obs_output_t *streamingOutput;
1672-
streamingOutput = OBS_service::getStreamingOutput(StreamServiceId::Main);
1673-
if (streamingOutput != NULL) {
1674-
obs_output_release(streamingOutput);
1675-
streamingEncoder = nullptr;
1676-
}
1677-
1678-
streamingOutput = OBS_service::getStreamingOutput(StreamServiceId::Second);
1679-
if (streamingOutput != NULL) {
1680-
obs_output_release(streamingOutput);
1681-
streamingEncoder = nullptr;
1682-
}
1683-
1684-
obs_output_t *recordingOutput = OBS_service::getRecordingOutput();
1685-
if (recordingOutput != NULL) {
1686-
obs_output_release(recordingOutput);
1687-
recordingOutput = nullptr;
1688-
}
1671+
OBS_service::clearOutputObjectsForShutdown();
16891672

1690-
obs_output_t *replayBufferOutput = OBS_service::getReplayBufferOutput();
1691-
if (replayBufferOutput != NULL) {
1692-
obs_output_release(replayBufferOutput);
1693-
replayBufferOutput = nullptr;
1694-
}
1695-
1696-
obs_output *virtualWebcamOutput = OBS_service::getVirtualWebcamOutput();
1697-
if (virtualWebcamOutput != NULL) {
1698-
if (obs_output_active(virtualWebcamOutput))
1699-
obs_output_stop(virtualWebcamOutput);
1700-
1701-
obs_output_release(virtualWebcamOutput);
1702-
virtualWebcamOutput = nullptr;
1703-
}
1704-
1705-
obs_service_t *service;
1706-
service = OBS_service::getService(StreamServiceId::Main);
1707-
if (service != NULL) {
1708-
obs_service_release(service);
1709-
service = nullptr;
1710-
}
1711-
1712-
service = OBS_service::getService(StreamServiceId::Second);
1713-
if (service != NULL) {
1714-
obs_service_release(service);
1715-
service = nullptr;
1716-
}
1673+
OBS_service::setService(nullptr, StreamServiceId::Main);
1674+
OBS_service::setService(nullptr, StreamServiceId::Second);
17171675

17181676
OBS_service::clearRecordingAudioEncoder();
17191677
osn::Volmeter::ClearVolmeters();

obs-studio-server/source/nodeobs_service.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2054,10 +2054,10 @@ void OBS_service::stopReplayBuffer(bool forceStop)
20542054

20552055
obs_service_t *OBS_service::getService(StreamServiceId serviceId)
20562056
{
2057-
if (serviceId <= services.size() && obs_service_get_type(services[serviceId]))
2058-
return services[serviceId];
2059-
else
2057+
if (serviceId >= services.size())
20602058
return nullptr;
2059+
2060+
return services[serviceId];
20612061
}
20622062

20632063
void OBS_service::setService(obs_service_t *newService, StreamServiceId serviceId)
@@ -2795,6 +2795,19 @@ void OBS_service::setVirtualWebcamOutput(obs_output_t *output)
27952795
virtualCam = output;
27962796
}
27972797

2798+
void OBS_service::clearOutputObjectsForShutdown(void)
2799+
{
2800+
// These holders survive until CRT/static teardown. Clear the real owners before
2801+
// obs_shutdown() so later destructors do not release stale libobs pointers.
2802+
setStreamingOutput(nullptr, StreamServiceId::Main);
2803+
setStreamingOutput(nullptr, StreamServiceId::Second);
2804+
setRecordingOutput(nullptr);
2805+
setReplayBufferOutput(nullptr);
2806+
setVirtualWebcamOutput(nullptr);
2807+
2808+
enhancedBroadcastContext.reset();
2809+
}
2810+
27982811
void OBS_service::updateStreamingOutput(StreamServiceId serviceId)
27992812
{
28002813
const char *currentOutputMode = config_get_string(ConfigManager::getInstance().getBasic(), "Output", "Mode");

obs-studio-server/source/nodeobs_service.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ class OBS_service {
196196
static void setReplayBufferOutput(obs_output_t *output);
197197
static obs_output_t *getVirtualWebcamOutput(void);
198198
static void setVirtualWebcamOutput(obs_output_t *output);
199+
static void clearOutputObjectsForShutdown(void);
199200
static void waitReleaseWorker(void);
200201

201202
// Update settings

0 commit comments

Comments
 (0)