]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/corefoundation/utilsexc_cf.cpp
bringing wxmac in line using cflocale
[wxWidgets.git] / src / mac / corefoundation / utilsexc_cf.cpp
index d32a8c8a5aaa5b1cf177ea151c42bbc1209f39b3..93dc45dd5db283585477f8b660cc1b345cd00f3e 100644 (file)
@@ -17,6 +17,7 @@
 #endif //ndef WX_PRECOMP
 #include "wx/unix/execute.h"
 #include "wx/stdpaths.h"
 #endif //ndef WX_PRECOMP
 #include "wx/unix/execute.h"
 #include "wx/stdpaths.h"
+#include "wx/app.h"
 #include "wx/apptrait.h"
 #include "wx/thread.h"
 #include "wx/process.h"
 #include "wx/apptrait.h"
 #include "wx/thread.h"
 #include "wx/process.h"
@@ -51,7 +52,14 @@ class wxProcessTerminationEventHandler: public wxEvtHandler
     {
         Disconnect(-1, wxEVT_END_PROCESS, wxProcessEventHandler(wxProcessTerminationEventHandler::OnTerminate));
         wxHandleProcessTermination(m_data);
     {
         Disconnect(-1, wxEVT_END_PROCESS, wxProcessEventHandler(wxProcessTerminationEventHandler::OnTerminate));
         wxHandleProcessTermination(m_data);
-        delete this;
+
+        // NOTE: We don't use this to delay destruction until the next idle run but rather to
+        // avoid killing ourselves while our caller (which is our wxEvtHandler superclass
+        // ProcessPendingEvents) still needs our m_eventsLocker to be valid.
+        // Since we're in the GUI library we can guarantee that ScheduleForDestroy is using
+        // the GUI implementation which delays destruction and not the base implementation
+        // which does it immediately.
+        wxTheApp->GetTraits()->ScheduleForDestroy(this);
     }
 
     wxEndProcessData* m_data;
     }
 
     wxEndProcessData* m_data;
@@ -135,7 +143,7 @@ extern "C" {
 #include <mach/mach.h>
 }
 
 #include <mach/mach.h>
 }
 
-void wxMAC_MachPortEndProcessDetect(CFMachPortRef port, void *data)
+void wxMAC_MachPortEndProcessDetect(CFMachPortRef WXUNUSED(port), void *data)
 {
     wxEndProcessData *proc_data = (wxEndProcessData*)data;
     wxLogDebug(wxT("Process ended"));
 {
     wxEndProcessData *proc_data = (wxEndProcessData*)data;
     wxLogDebug(wxT("Process ended"));
@@ -232,7 +240,11 @@ int wxAddProcessCallbackForPid(wxEndProcessData *proc_data, int pid)
     Called due to source signal detected by the CFRunLoop.
     This is nearly identical to the wxGTK equivalent.
  */
     Called due to source signal detected by the CFRunLoop.
     This is nearly identical to the wxGTK equivalent.
  */
-extern "C" void WXCF_EndProcessDetector(CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef address, void const *data, void *info)
+extern "C" void WXCF_EndProcessDetector(CFSocketRef s,
+                                        CFSocketCallBackType WXUNUSED(callbackType),
+                                        CFDataRef WXUNUSED(address),
+                                        void const *WXUNUSED(data),
+                                        void *info)
 {
     wxEndProcessData * const proc_data = static_cast<wxEndProcessData*>(info);
 
 {
     wxEndProcessData * const proc_data = static_cast<wxEndProcessData*>(info);
 
@@ -309,13 +321,13 @@ int wxAddProcessCallback(wxEndProcessData *proc_data, int fd)
     CFSocketRef cfSocket = CFSocketCreateWithNative(kCFAllocatorDefault,fd,kCFSocketReadCallBack,&WXCF_EndProcessDetector,&context);
     if(cfSocket == NULL)
     {
     CFSocketRef cfSocket = CFSocketCreateWithNative(kCFAllocatorDefault,fd,kCFSocketReadCallBack,&WXCF_EndProcessDetector,&context);
     if(cfSocket == NULL)
     {
-        wxLogError("Failed to create socket for end process detection");
+        wxLogError(wxT("Failed to create socket for end process detection"));
         return 0;
     }
     CFRunLoopSourceRef runLoopSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, cfSocket, /*highest priority:*/0);
     if(runLoopSource == NULL)
     {
         return 0;
     }
     CFRunLoopSourceRef runLoopSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, cfSocket, /*highest priority:*/0);
     if(runLoopSource == NULL)
     {
-        wxLogError("Failed to create CFRunLoopSource from CFSocket for end process detection");
+        wxLogError(wxT("Failed to create CFRunLoopSource from CFSocket for end process detection"));
         // closes the fd.. we can't really stop it, nor do we necessarily want to.
         CFSocketInvalidate(cfSocket);
         CFRelease(cfSocket);
         // closes the fd.. we can't really stop it, nor do we necessarily want to.
         CFSocketInvalidate(cfSocket);
         CFRelease(cfSocket);