#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"
{
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;
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)
{
- 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);