Commit the CFRunLoop patch from bug 271050 for plevent handling. This uses a CFRunLoopSource to process plevents from the applications's main event loop. r=pinkerton.

This commit is contained in:
smfr%smfr.org 2005-01-04 02:02:01 +00:00
parent b7db19beeb
commit 821468a25c

View File

@ -71,7 +71,7 @@
#if defined(XP_MAC) || defined(XP_MACOSX) #if defined(XP_MAC) || defined(XP_MACOSX)
#if defined(MOZ_WIDGET_COCOA) #if defined(MOZ_WIDGET_COCOA)
#include <CoreFoundation/CoreFoundation.h> #include <CoreFoundation/CoreFoundation.h>
#define MAC_USE_CFMESSAGEPORT #define MAC_USE_CFRUNLOOPSOURCE
#elif defined(TARGET_CARBON) #elif defined(TARGET_CARBON)
#include <CarbonEvents.h> #include <CarbonEvents.h>
#define MAC_USE_CARBON_EVENT #define MAC_USE_CARBON_EVENT
@ -172,10 +172,9 @@ struct PLEventQueue {
#elif defined(XP_BEOS) #elif defined(XP_BEOS)
port_id eventport; port_id eventport;
#elif defined(XP_MAC) || defined(XP_MACOSX) #elif defined(XP_MAC) || defined(XP_MACOSX)
#if defined(MAC_USE_CFMESSAGEPORT) #if defined(MAC_USE_CFRUNLOOPSOURCE)
CFMessagePortRef mLocalMessagePort;
CFMessagePortRef mRemoteMessagePort;
CFRunLoopSourceRef mRunLoopSource; CFRunLoopSourceRef mRunLoopSource;
CFRunLoopRef mMainRunLoop;
#elif defined(MAC_USE_CARBON_EVENT) #elif defined(MAC_USE_CARBON_EVENT)
EventHandlerUPP eventHandlerUPP; EventHandlerUPP eventHandlerUPP;
EventHandlerRef eventHandlerRef; EventHandlerRef eventHandlerRef;
@ -991,14 +990,11 @@ _pl_CleanupNativeNotifier(PLEventQueue* self)
#elif defined(XP_OS2) #elif defined(XP_OS2)
WinDestroyWindow(self->eventReceiverWindow); WinDestroyWindow(self->eventReceiverWindow);
#elif defined(MAC_USE_CFMESSAGEPORT) #elif defined(MAC_USE_CFRUNLOOPSOURCE)
// XXX this assumes that the event queue is on the same run loop that it was created on CFRunLoopRemoveSource(self->mMainRunLoop, self->mRunLoopSource, kCFRunLoopCommonModes);
CFRunLoopRemoveSource(CFRunLoopGetCurrent(), self->mRunLoopSource, kCFRunLoopCommonModes);
CFRelease(self->mRunLoopSource); CFRelease(self->mRunLoopSource);
CFRelease(self->mMainRunLoop);
CFRelease(self->mRemoteMessagePort);
CFRelease(self->mLocalMessagePort);
#elif defined(MAC_USE_CARBON_EVENT) #elif defined(MAC_USE_CARBON_EVENT)
EventComparatorUPP comparator = NewEventComparatorUPP(_md_CarbonEventComparator); EventComparatorUPP comparator = NewEventComparatorUPP(_md_CarbonEventComparator);
@ -1302,18 +1298,9 @@ _pl_NativeNotify(PLEventQueue* self)
static PRStatus static PRStatus
_pl_NativeNotify(PLEventQueue* self) _pl_NativeNotify(PLEventQueue* self)
{ {
#if defined(MAC_USE_CFMESSAGEPORT) #if defined(MAC_USE_CFRUNLOOPSOURCE)
// send a request with no data (just to wake the receiver) CFRunLoopSourceSignal(self->mRunLoopSource);
SInt32 err = CFMessagePortSendRequest(self->mRemoteMessagePort, CFRunLoopWakeUp(self->mMainRunLoop);
0, // msgid (arbitrary value; unused)
NULL, // data (none)
1.0, // sendTimeout (1 second)
0.0, // rcvTimeout
NULL, // replyMode (no reply expected)
NULL // returnData (none)
);
PR_ASSERT(err == kCFMessagePortSuccess);
#elif defined(MAC_USE_CARBON_EVENT) #elif defined(MAC_USE_CARBON_EVENT)
OSErr err; OSErr err;
EventRef newEvent; EventRef newEvent;
@ -1628,12 +1615,11 @@ static void _md_CreateEventQueue( PLEventQueue *eventQueue )
} /* end _md_CreateEventQueue() */ } /* end _md_CreateEventQueue() */
#endif /* (defined(XP_UNIX) && !defined(XP_MACOSX)) || defined(XP_BEOS) */ #endif /* (defined(XP_UNIX) && !defined(XP_MACOSX)) || defined(XP_BEOS) */
#if defined(MAC_USE_CFMESSAGEPORT) #if defined(MAC_USE_CFRUNLOOPSOURCE)
static CFDataRef _md_EventReceiverProc(CFMessagePortRef local, SInt32 msgid, CFDataRef data, void *info) static void _md_EventReceiverProc(void *info)
{ {
PLEventQueue *queue = (PLEventQueue*)info; PLEventQueue *queue = (PLEventQueue*)info;
PL_ProcessPendingEvents(queue); PL_ProcessPendingEvents(queue);
return NULL;
} }
#elif defined(MAC_USE_CARBON_EVENT) #elif defined(MAC_USE_CARBON_EVENT)
@ -1681,35 +1667,21 @@ static pascal Boolean _md_CarbonEventComparator(EventRef inEvent,
#if defined(XP_MAC) || defined(XP_MACOSX) #if defined(XP_MAC) || defined(XP_MACOSX)
static void _md_CreateEventQueue( PLEventQueue *eventQueue ) static void _md_CreateEventQueue( PLEventQueue *eventQueue )
{ {
#if defined(MAC_USE_CFMESSAGEPORT) #if defined(MAC_USE_CFRUNLOOPSOURCE)
CFMessagePortContext portContext = { CFRunLoopSourceContext sourceContext = { 0 };
0, sourceContext.version = 0;
(void*)eventQueue, sourceContext.info = (void*)eventQueue;
NULL, NULL, NULL sourceContext.perform = _md_EventReceiverProc;
};
// create the local port (the receiver). Note that message ports are machine-wide,
// so we include the pid and event queue pointer in the name.
CFStringRef portName = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
CFSTR("plevents_%d_%p"), getpid(), eventQueue);
eventQueue->mLocalMessagePort = CFMessagePortCreateLocal(kCFAllocatorDefault, portName,
_md_EventReceiverProc, &portContext, NULL);
PR_ASSERT(eventQueue->mLocalMessagePort);
// now create the remote port (the sender)
eventQueue->mRemoteMessagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, portName);
PR_ASSERT(eventQueue->mRemoteMessagePort);
CFRelease(portName);
// make a run loop source // make a run loop source
eventQueue->mRunLoopSource = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, eventQueue->mRunLoopSource = CFRunLoopSourceCreate(kCFAllocatorDefault, 0 /* order */, &sourceContext);
eventQueue->mLocalMessagePort, 0 /* order: ignored */);
PR_ASSERT(eventQueue->mRunLoopSource); PR_ASSERT(eventQueue->mRunLoopSource);
eventQueue->mMainRunLoop = CFRunLoopGetCurrent();
CFRetain(eventQueue->mMainRunLoop);
// and add it to the run loop. // and add it to the run loop.
CFRunLoopAddSource(CFRunLoopGetCurrent(), eventQueue->mRunLoopSource, kCFRunLoopCommonModes); CFRunLoopAddSource(eventQueue->mMainRunLoop, eventQueue->mRunLoopSource, kCFRunLoopCommonModes);
#elif defined(MAC_USE_CARBON_EVENT) #elif defined(MAC_USE_CARBON_EVENT)
eventQueue->eventHandlerUPP = NewEventHandlerUPP(_md_EventReceiverProc); eventQueue->eventHandlerUPP = NewEventHandlerUPP(_md_EventReceiverProc);