widget/cocoa/WidgetTraceEvent.mm

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 #include <Cocoa/Cocoa.h>
     6 #include "CustomCocoaEvents.h"
     7 #include <Foundation/NSAutoreleasePool.h>
     8 #include <mozilla/CondVar.h>
     9 #include <mozilla/Mutex.h>
    10 #include "mozilla/WidgetTraceEvent.h"
    12 using mozilla::CondVar;
    13 using mozilla::Mutex;
    14 using mozilla::MutexAutoLock;
    16 namespace {
    18 Mutex* sMutex = NULL;
    19 CondVar* sCondVar = NULL;
    20 bool sTracerProcessed = false;
    22 }
    24 namespace mozilla {
    26 bool InitWidgetTracing()
    27 {
    28   sMutex = new Mutex("Event tracer thread mutex");
    29   sCondVar = new CondVar(*sMutex, "Event tracer thread condvar");
    30   return sMutex && sCondVar;
    31 }
    33 void CleanUpWidgetTracing()
    34 {
    35   delete sMutex;
    36   delete sCondVar;
    37   sMutex = NULL;
    38   sCondVar = NULL;
    39 }
    41 // This function is called from the main (UI) thread.
    42 void SignalTracerThread()
    43 {
    44   if (!sMutex || !sCondVar)
    45     return;
    46   MutexAutoLock lock(*sMutex);
    47   if (!sTracerProcessed) {
    48     sTracerProcessed = true;
    49     sCondVar->Notify();
    50   }
    51 }
    53 // This function is called from the background tracer thread.
    54 bool FireAndWaitForTracerEvent()
    55 {
    56   NS_ABORT_IF_FALSE(sMutex && sCondVar, "Tracing not initialized!");
    57   NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    58   MutexAutoLock lock(*sMutex);
    59   if (sTracerProcessed) {
    60     // Things are out of sync. This is likely because we're in
    61     // the middle of shutting down. Just return false and hope the
    62     // tracer thread is quitting anyway.
    63     return false;
    64   }
    66   // Post an application-defined event to the main thread's event queue
    67   // and wait for it to get processed.
    68   [NSApp postEvent:[NSEvent otherEventWithType:NSApplicationDefined
    69                                       location:NSMakePoint(0,0)
    70                                  modifierFlags:0
    71                                      timestamp:0
    72                                   windowNumber:0
    73                                        context:NULL
    74                                        subtype:kEventSubtypeTrace
    75                                          data1:0
    76                                          data2:0]
    77              atStart:NO];
    78   while (!sTracerProcessed)
    79     sCondVar->Wait();
    80   sTracerProcessed = false;
    81   [pool release];
    82   return true;
    83 }
    85 }  // namespace mozilla

mercurial