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:
Marshall Greenblatt 2012-02-10 16:22:47 +00:00
parent 9bcab6db78
commit 55b363354f
7 changed files with 50 additions and 30 deletions

View File

@ -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();
}

View File

@ -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);

View File

@ -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();
}

View File

@ -27,7 +27,6 @@ class CefProcessSubThread : public CefThread {
virtual ~CefProcessSubThread();
protected:
virtual void Init();
virtual void CleanUp();
private:

View File

@ -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"

View File

@ -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);

View File

@ -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))