don't call OnWriteWaiting() if we lost connection in OnReadWaiting() called just before it (closes #10963)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61336 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-07-05 21:42:56 +00:00
parent 37465b7281
commit ee0995b09b
5 changed files with 29 additions and 11 deletions

View File

@@ -204,7 +204,7 @@ public:
private: private:
// these functions map directly to XtAdd/RemoveInput() or // these functions map directly to XtAdd/RemoveInput() or
// gdk_input_add/remove() // gdk_input_add/remove()
virtual int AddInput(wxSocketImpl *handler, int fd, SocketDir d) = 0; virtual int AddInput(wxSocketImplUnix *handler, int fd, SocketDir d) = 0;
virtual void RemoveInput(int fd) = 0; virtual void RemoveInput(int fd) = 0;
}; };

View File

@@ -28,10 +28,19 @@ void wxSocket_GDK_Input(gpointer data,
gint WXUNUSED(source), gint WXUNUSED(source),
GdkInputCondition condition) GdkInputCondition condition)
{ {
wxSocketImpl * const handler = static_cast<wxSocketImpl *>(data); wxSocketImplUnix * const handler = static_cast<wxSocketImplUnix *>(data);
if ( condition & GDK_INPUT_READ ) if ( condition & GDK_INPUT_READ )
{
handler->OnReadWaiting(); handler->OnReadWaiting();
// we could have lost connection while reading in which case we
// shouldn't call OnWriteWaiting() as the socket is now closed and it
// would assert
if ( handler->m_fd == INVALID_SOCKET )
return;
}
if ( condition & GDK_INPUT_WRITE ) if ( condition & GDK_INPUT_WRITE )
handler->OnWriteWaiting(); handler->OnWriteWaiting();
} }
@@ -40,7 +49,7 @@ void wxSocket_GDK_Input(gpointer data,
class GTKSocketManager : public wxSocketInputBasedManager class GTKSocketManager : public wxSocketInputBasedManager
{ {
public: public:
virtual int AddInput(wxSocketImpl *handler, int fd, SocketDir d) virtual int AddInput(wxSocketImplUnix *handler, int fd, SocketDir d)
{ {
return gdk_input_add return gdk_input_add
( (

View File

@@ -28,10 +28,19 @@ void wxSocket_GDK_Input(gpointer data,
gint WXUNUSED(source), gint WXUNUSED(source),
GdkInputCondition condition) GdkInputCondition condition)
{ {
wxSocketImpl * const handler = static_cast<wxSocketImpl *>(data); wxSocketImplUnix * const handler = static_cast<wxSocketImplUnix *>(data);
if ( condition & GDK_INPUT_READ ) if ( condition & GDK_INPUT_READ )
{
handler->OnReadWaiting(); handler->OnReadWaiting();
// we could have lost connection while reading in which case we
// shouldn't call OnWriteWaiting() as the socket is now closed and it
// would assert
if ( handler->m_fd == INVALID_SOCKET )
return;
}
if ( condition & GDK_INPUT_WRITE ) if ( condition & GDK_INPUT_WRITE )
handler->OnWriteWaiting(); handler->OnWriteWaiting();
} }
@@ -40,7 +49,7 @@ void wxSocket_GDK_Input(gpointer data,
class GTKSocketManager : public wxSocketInputBasedManager class GTKSocketManager : public wxSocketInputBasedManager
{ {
public: public:
virtual int AddInput(wxSocketImpl *handler, int fd, SocketDir d) virtual int AddInput(wxSocketImplUnix *handler, int fd, SocketDir d)
{ {
return gdk_input_add return gdk_input_add
( (

View File

@@ -23,7 +23,7 @@ extern "C" {
static void wxSocket_Motif_Input(XtPointer data, int *WXUNUSED(fid), static void wxSocket_Motif_Input(XtPointer data, int *WXUNUSED(fid),
XtInputId *WXUNUSED(id)) XtInputId *WXUNUSED(id))
{ {
wxSocketImpl * const handler = static_cast<wxSocketImpl *>(data); wxSocketImplUnix * const handler = static_cast<wxSocketImplUnix *>(data);
handler->OnReadWaiting(); handler->OnReadWaiting();
} }
@@ -31,7 +31,7 @@ static void wxSocket_Motif_Input(XtPointer data, int *WXUNUSED(fid),
static void wxSocket_Motif_Output(XtPointer data, int *WXUNUSED(fid), static void wxSocket_Motif_Output(XtPointer data, int *WXUNUSED(fid),
XtInputId *WXUNUSED(id)) XtInputId *WXUNUSED(id))
{ {
wxSocketImpl * const handler = static_cast<wxSocketImpl *>(data); wxSocketImplUnix * const handler = static_cast<wxSocketImplUnix *>(data);
handler->OnWriteWaiting(); handler->OnWriteWaiting();
} }
@@ -41,7 +41,7 @@ static void wxSocket_Motif_Output(XtPointer data, int *WXUNUSED(fid),
class MotifSocketManager : public wxSocketInputBasedManager class MotifSocketManager : public wxSocketInputBasedManager
{ {
public: public:
virtual int AddInput(wxSocketImpl *handler, int fd, SocketDir d) virtual int AddInput(wxSocketImplUnix *handler, int fd, SocketDir d)
{ {
return XtAppAddInput return XtAppAddInput
( (

View File

@@ -23,14 +23,14 @@
static void wxSocket_PM_Input(void *data) static void wxSocket_PM_Input(void *data)
{ {
wxSocketImpl *handler = static_cast<wxSocketImpl *>(data); wxSocketImplUnix *handler = static_cast<wxSocketImplUnix *>(data);
handler->OnReadWaiting(); handler->OnReadWaiting();
} }
static void wxSocket_PM_Output(void *data) static void wxSocket_PM_Output(void *data)
{ {
wxSocketImpl *handler = static_cast<wxSocketImpl *>(data); wxSocketImplUnix *handler = static_cast<wxSocketImplUnix *>(data);
handler->OnWriteWaiting(); handler->OnWriteWaiting();
} }
@@ -38,7 +38,7 @@ static void wxSocket_PM_Output(void *data)
class PMSocketManager : public wxSocketInputBasedManager class PMSocketManager : public wxSocketInputBasedManager
{ {
public: public:
virtual int AddInput(wxSocketImpl *handler, int fd, SocketDir d) virtual int AddInput(wxSocketImplUnix *handler, int fd, SocketDir d)
{ {
if (d == FD_OUTPUT) if (d == FD_OUTPUT)
return wxTheApp->AddSocketHandler(fd, wxSockWriteMask, return wxTheApp->AddSocketHandler(fd, wxSockWriteMask,