Mac: Fix the "no autorelease pool in place" error by initializing an NSAutoreleasePool on every thread (issue #502).
git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@482 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
parent
9bcab6db78
commit
55b363354f
|
@ -33,10 +33,7 @@ CefProcessIOThread::~CefProcessIOThread() {
|
|||
}
|
||||
|
||||
void CefProcessIOThread::Init() {
|
||||
#if defined(OS_WIN)
|
||||
// Initializes the COM library on the current thread.
|
||||
CoInitialize(NULL);
|
||||
#endif
|
||||
CefThread::Init();
|
||||
|
||||
FilePath cache_path(_Context->cache_path());
|
||||
request_context_ = new BrowserRequestContext(cache_path,
|
||||
|
@ -65,9 +62,5 @@ void CefProcessIOThread::CleanUp() {
|
|||
_Context->set_request_context(NULL);
|
||||
request_context_ = NULL;
|
||||
|
||||
#if defined(OS_WIN)
|
||||
// Closes the COM library on the current thread. CoInitialize must
|
||||
// be balanced by a corresponding call to CoUninitialize.
|
||||
CoUninitialize();
|
||||
#endif
|
||||
CefThread::Cleanup();
|
||||
}
|
||||
|
|
|
@ -27,14 +27,14 @@ class CefProcessIOThread : public CefThread {
|
|||
explicit CefProcessIOThread(MessageLoop* message_loop);
|
||||
virtual ~CefProcessIOThread();
|
||||
|
||||
virtual void Init();
|
||||
virtual void CleanUp();
|
||||
|
||||
scoped_refptr<BrowserRequestContext> request_context() {
|
||||
return request_context_;
|
||||
}
|
||||
|
||||
private:
|
||||
protected:
|
||||
virtual void Init();
|
||||
virtual void CleanUp();
|
||||
|
||||
scoped_refptr<BrowserRequestContext> request_context_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(CefProcessIOThread);
|
||||
|
|
|
@ -8,10 +8,6 @@
|
|||
#include "build/build_config.h"
|
||||
#include "base/compiler_specific.h"
|
||||
|
||||
#if defined(OS_WIN)
|
||||
#include <Objbase.h> // NOLINT(build/include_order)
|
||||
#endif
|
||||
|
||||
CefProcessSubThread::CefProcessSubThread(CefThread::ID identifier)
|
||||
: CefThread(identifier) {}
|
||||
|
||||
|
@ -25,22 +21,11 @@ CefProcessSubThread::~CefProcessSubThread() {
|
|||
Stop();
|
||||
}
|
||||
|
||||
void CefProcessSubThread::Init() {
|
||||
#if defined(OS_WIN)
|
||||
// Initializes the COM library on the current thread.
|
||||
CoInitialize(NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
void CefProcessSubThread::CleanUp() {
|
||||
// Flush any remaining messages. This ensures that any accumulated
|
||||
// Task objects get destroyed before we exit, which avoids noise in
|
||||
// purify leak-test results.
|
||||
MessageLoop::current()->RunAllPending();
|
||||
|
||||
#if defined(OS_WIN)
|
||||
// Closes the COM library on the current thread. CoInitialize must
|
||||
// be balanced by a corresponding call to CoUninitialize.
|
||||
CoUninitialize();
|
||||
#endif
|
||||
CefThread::Cleanup();
|
||||
}
|
||||
|
|
|
@ -27,7 +27,6 @@ class CefProcessSubThread : public CefThread {
|
|||
virtual ~CefProcessSubThread();
|
||||
|
||||
protected:
|
||||
virtual void Init();
|
||||
virtual void CleanUp();
|
||||
|
||||
private:
|
||||
|
|
|
@ -4,6 +4,9 @@
|
|||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/cef_process_ui_thread.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "include/cef_version.h"
|
||||
#include "libcef/browser_webkit_glue.h"
|
||||
#include "libcef/browser_webkit_init.h"
|
||||
|
|
|
@ -9,6 +9,10 @@
|
|||
#include "base/message_loop.h"
|
||||
#include "base/message_loop_proxy.h"
|
||||
|
||||
#if defined(OS_WIN)
|
||||
#include <Objbase.h> // NOLINT(build/include_order)
|
||||
#endif
|
||||
|
||||
using base::MessageLoopProxy;
|
||||
|
||||
// Friendly names for the well-known threads.
|
||||
|
@ -102,6 +106,29 @@ CefThread::CefThread(ID identifier, MessageLoop* message_loop)
|
|||
Initialize();
|
||||
}
|
||||
|
||||
void CefThread::Init() {
|
||||
#if defined(OS_WIN)
|
||||
// Initializes the COM library on the current thread.
|
||||
CoInitialize(NULL);
|
||||
#endif
|
||||
|
||||
#if defined(OS_MACOSX)
|
||||
autorelease_pool_.reset(new base::mac::ScopedNSAutoreleasePool);
|
||||
#endif
|
||||
}
|
||||
|
||||
void CefThread::Cleanup() {
|
||||
#if defined(OS_WIN)
|
||||
// Closes the COM library on the current thread. CoInitialize must
|
||||
// be balanced by a corresponding call to CoUninitialize.
|
||||
CoUninitialize();
|
||||
#endif
|
||||
|
||||
#if defined(OS_MACOSX)
|
||||
autorelease_pool_.reset(NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
void CefThread::Initialize() {
|
||||
base::AutoLock lock(lock_);
|
||||
DCHECK(identifier_ >= 0 && identifier_ < ID_COUNT);
|
||||
|
|
|
@ -7,10 +7,15 @@
|
|||
#define CEF_LIBCEF_CEF_THREAD_H_
|
||||
#pragma once
|
||||
|
||||
#include "base/memory/scoped_ptr.h"
|
||||
#include "base/synchronization/lock.h"
|
||||
#include "base/task.h"
|
||||
#include "base/threading/thread.h"
|
||||
|
||||
#if defined(OS_MACOSX)
|
||||
#include "base/mac/scoped_nsautorelease_pool.h"
|
||||
#endif
|
||||
|
||||
namespace base {
|
||||
class MessageLoopProxy;
|
||||
}
|
||||
|
@ -180,6 +185,10 @@ class CefThread : public base::Thread {
|
|||
struct DeleteOnIOThread : public DeleteOnThread<IO> { };
|
||||
struct DeleteOnFileThread : public DeleteOnThread<FILE> { };
|
||||
|
||||
protected:
|
||||
virtual void Init();
|
||||
virtual void Cleanup();
|
||||
|
||||
private:
|
||||
// Common initialization code for the constructors.
|
||||
void Initialize();
|
||||
|
@ -211,6 +220,10 @@ class CefThread : public base::Thread {
|
|||
// on the UI thread by the g_browser_process object. CefThreads remove
|
||||
// themselves from this array upon destruction.
|
||||
static CefThread* cef_threads_[ID_COUNT];
|
||||
|
||||
#if defined(OS_MACOSX)
|
||||
scoped_ptr<base::mac::ScopedNSAutoreleasePool> autorelease_pool_;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define REQUIRE_UIT() DCHECK(CefThread::CurrentlyOn(CefThread::UI))
|
||||
|
|
Loading…
Reference in New Issue