Skip to content

Commit 47084fc

Browse files
committed
Fix startup hang
The startup hang is due to the CEF's initialization in BrowserManager::Impl::BrowserManagerEntry() taking much longer than it used to take, so long that a browser source may try to be created in BrowserManager::Impl::CreateBrowser before CEF is actually finished initializing. When that happens and a browser source tried to be created, the CefPostTask that's used in source creation would fail and not properly post/execute the task, causing the browser source to indefinitely hang while waiting for the task to finish, when in fact it never executes at all. To fix this issue, a manual reset startup event is used, which is signaled when CEF finishes initialization. Then when trying to create any browser source, it will wait to make sure that CEF startup event has been signaled before attempting to post a task in to the Cef message queue. This has been a latent bug that had only been exposed recently, most likely due to recent CEF changes that caused it to take longer than normal to initialize. Additionally, this bug most likely commonly happened once after system startup due to caching of some sort.
1 parent 2e5e679 commit 47084fc

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

obs-browser/browser-manager-base.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,15 @@ void BrowserManager::DispatchJSEvent(const char *eventName, const char *jsonStri
107107
BrowserManager::Impl::Impl()
108108
{
109109
os_event_init(&dispatchEvent, OS_EVENT_TYPE_AUTO);
110+
os_event_init(&startupEvent, OS_EVENT_TYPE_MANUAL);
110111
pthread_mutex_init(&dispatchLock, nullptr);
111112
}
112113

113114
BrowserManager::Impl::~Impl()
114115
{
115-
os_event_destroy(dispatchEvent);
116116
pthread_mutex_destroy(&dispatchLock);
117+
os_event_destroy(startupEvent);
118+
os_event_destroy(dispatchEvent);
117119
}
118120

119121
int BrowserManager::Impl::CreateBrowser(
@@ -124,6 +126,8 @@ int BrowserManager::Impl::CreateBrowser(
124126
os_event_t *createdEvent;
125127
os_event_init(&createdEvent, OS_EVENT_TYPE_AUTO);
126128

129+
os_event_wait(startupEvent);
130+
127131
BrowserOBSBridge *browserOBSBridge = new BrowserOBSBridgeBase();
128132

129133
CefPostTask(TID_UI, BrowserTask::newTask(
@@ -437,7 +441,7 @@ void BrowserManager::Impl::BrowserManagerEntry()
437441
{
438442
std::string bootstrapPath = getBootstrap();
439443
bool thread_exit = false;
440-
PushEvent([] {
444+
PushEvent([this] {
441445
CefMainArgs mainArgs;
442446
CefSettings settings;
443447
settings.log_severity = LOGSEVERITY_VERBOSE;
@@ -449,6 +453,7 @@ void BrowserManager::Impl::BrowserManagerEntry()
449453
CefExecuteProcess(mainArgs, app, nullptr);
450454
CefInitialize(mainArgs, settings, app, nullptr);
451455
CefRegisterSchemeHandlerFactory("http", "absolute", new BrowserSchemeHandlerFactory());
456+
os_event_signal(startupEvent);
452457
CefRunMessageLoop();
453458
CefShutdown();
454459
});

obs-browser/browser-manager-base.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,11 @@ class BrowserManager::Impl
7373
private:
7474
bool threadAlive;
7575
os_event_t *dispatchEvent;
76+
os_event_t *startupEvent;
7677
pthread_t managerThread;
7778
pthread_mutex_t dispatchLock;
7879

7980
std::map<int, std::shared_ptr<BrowserListener>> listenerMap;
8081
std::map<int, CefRefPtr<CefBrowser> > browserMap;
8182
std::vector<std::function<void()>> queue;
82-
};
83+
};

0 commit comments

Comments
 (0)