Merge revision 482 changes:

- 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/branches/963@629 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt 2012-05-17 20:04:23 +00:00
parent 266f4e7a27
commit a63833acfd
6 changed files with 47 additions and 29 deletions

View File

@ -31,10 +31,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,
@ -63,9 +60,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

@ -25,12 +25,13 @@ class CefProcessIOThread : public CefThread {
CefProcessIOThread(MessageLoop* message_loop);
virtual ~CefProcessIOThread();
virtual void Init();
virtual void CleanUp();
scoped_refptr<BrowserRequestContext> request_context()
{ return request_context_; }
protected:
virtual void Init();
virtual void CleanUp();
private:
scoped_refptr<BrowserRequestContext> request_context_;

View File

@ -6,10 +6,6 @@
#include "cef_process_sub_thread.h"
#include "build/build_config.h"
#if defined(OS_WIN)
#include <Objbase.h>
#endif
CefProcessSubThread::CefProcessSubThread(CefThread::ID identifier)
: CefThread(identifier) {}
@ -23,22 +19,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

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

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

@ -6,10 +6,15 @@
#ifndef _CEF_THREAD_H
#define _CEF_THREAD_H
#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;
}
@ -179,6 +184,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();
@ -210,6 +219,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))