Hello playmobil,
I'd like you to do a code review. Please execute
g4 diff -c 8127182
or point your web browser to
http://mondrian/8127182
(this changelist has been uploaded to Mondrian)
to review the following code:
Change 8127182 by [EMAIL PROTECTED] on 2008/08/28 12:13:21 *pending*
Fix crash in FFThreadMessageQueue when terminating FF process with
long-running thread.
PRESUBMIT=passed
R=playmobil
[EMAIL PROTECTED]
DELTA=12 (1 added, 0 deleted, 11 changed)
OCL=8127182
Affected files ...
...
//depot/googleclient/gears/opensource/gears/base/common/message_queue_ff.cc#4
edit
12 delta lines: 1 added, 0 deleted, 11 changed
Also consider running:
g4 lint -c 8127182
which verifies that the changelist doesn't introduce new style violations.
If you can't do the review, please let me know as soon as possible. During
your review, please ensure that all new code has corresponding unit tests and
that existing unit tests are updated appropriately. Visit
http://www/eng/code_review.html for more information.
This is a semiautomated message from "g4 mail". Complaints or suggestions?
Mail [EMAIL PROTECTED]
Change 8127182 by [EMAIL PROTECTED] on 2008/08/28 12:13:21 *pending*
Fix crash in FFThreadMessageQueue when terminating FF process with
long-running thread.
Affected files ...
...
//depot/googleclient/gears/opensource/gears/base/common/message_queue_ff.cc#4
edit
====
//depot/googleclient/gears/opensource/gears/base/common/message_queue_ff.cc#4 -
/Users/jianli/src/googleclient/gears/opensource/gears/base/common/message_queue_ff.cc
====
# action=edit type=text
--- googleclient/gears/opensource/gears/base/common/message_queue_ff.cc
2008-08-28 12:13:54.000000000 -0700
+++ googleclient/gears/opensource/gears/base/common/message_queue_ff.cc
2008-08-28 12:09:39.000000000 -0700
@@ -52,6 +52,7 @@
// A concrete implementation that uses Firefox's nsIEventQueue
class FFThreadMessageQueue : public ThreadMessageQueue {
public:
+ FFThreadMessageQueue() : next_id_(0) {}
virtual bool InitThreadMessageQueue();
virtual ThreadId GetCurrentThreadId();
virtual bool Send(ThreadId thread_handle,
@@ -101,19 +102,19 @@
static void ThreadEndHook(void* value);
void InitThreadEndHook(ThreadId thread_id);
- static ThreadMap threads_;
- static Mutex threads_mutex_;
- static ThreadId next_id_;
+ ThreadMap threads_;
+ Mutex threads_mutex_;
+ ThreadId next_id_;
};
-static FFThreadMessageQueue g_instance;
-ThreadMap FFThreadMessageQueue::threads_;
-Mutex FFThreadMessageQueue::threads_mutex_;
-ThreadId FFThreadMessageQueue::next_id_ = 0;
+// Create an instance on the heap, note that we can't use a static
+// global, because during application shutdown that may be destructed while
+// threads are still running and referencing it.
+static FFThreadMessageQueue *g_instance = new FFThreadMessageQueue();
// static
ThreadMessageQueue *ThreadMessageQueue::GetInstance() {
- return &g_instance;
+ return g_instance;
}
// static
@@ -136,8 +137,8 @@
}
}
#endif
- MutexLock lock(&threads_mutex_);
- threads_.erase(data->id);
+ MutexLock lock(&g_instance->threads_mutex_);
+ g_instance->threads_.erase(data->id);
delete data;
}
}
@@ -199,7 +200,7 @@
// static
void *FFThreadMessageQueue::OnReceiveMessageEvent(MessageEvent *event) {
RegisteredHandler handler;
- if (g_instance.GetRegisteredHandler(event->message_type, &handler)) {
+ if (g_instance->GetRegisteredHandler(event->message_type, &handler)) {
handler.Invoke(event->message_type, event->message_data.get());
}
return NULL;