#include "wx/stopwatch.h"
#include "wx/thread.h"
#include "wx/evtloop.h"
+#include "wx/link.h"
#include "wx/private/fd.h"
#include "wx/private/socket.h"
// macros and constants
// --------------------------------------------------------------------------
+// event
+wxDEFINE_EVENT(wxEVT_SOCKET, wxSocketEvent);
+
// discard buffer
#define MAX_DISCARD_SIZE (10 * 1024)
public:
wxSocketState() : wxObject() {}
- DECLARE_NO_COPY_CLASS(wxSocketState)
+ wxDECLARE_NO_COPY_CLASS(wxSocketState);
};
// wxSocketWaitModeChanger: temporarily change the socket flags affecting its
wxSocketBase * const m_socket;
const int m_oldflags;
- DECLARE_NO_COPY_CLASS(wxSocketWaitModeChanger)
+ wxDECLARE_NO_COPY_CLASS(wxSocketWaitModeChanger);
};
// wxSocketRead/WriteGuard are instantiated before starting reading
private:
wxSocketBase * const m_socket;
- DECLARE_NO_COPY_CLASS(wxSocketReadGuard)
+ wxDECLARE_NO_COPY_CLASS(wxSocketReadGuard);
};
class wxSocketWriteGuard
private:
wxSocketBase * const m_socket;
- DECLARE_NO_COPY_CLASS(wxSocketWriteGuard)
+ wxDECLARE_NO_COPY_CLASS(wxSocketWriteGuard);
};
// ============================================================================
{
// this Initialize() will be undone by wxSocketModule::OnExit(), all
// the other calls to it should be matched by a call to Shutdown()
- Initialize();
+ if (!Initialize())
+ wxLogError("Cannot initialize wxSocketBase");
}
}
eventLoop = NULL;
}
+ // Make sure the events we're interested in are enabled before waiting for
+ // them: this is really necessary here as otherwise this could happen:
+ // 1. DoRead(wxSOCKET_WAITALL) is called
+ // 2. There is nothing to read so DoWait(wxSOCKET_INPUT_FLAG) is called
+ // 3. Some, but not all data appears, wxSocketImplUnix::OnReadWaiting()
+ // is called and wxSOCKET_INPUT_FLAG events are disabled in it
+ // 4. Because of wxSOCKET_WAITALL we call DoWait() again but the events
+ // are still disabled and we block forever
+ //
+ // More elegant solution would be nice but for now simply re-enabling the
+ // events here will do
+ m_impl->ReenableEvents(flags & (wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG));
+
+
// Wait until we receive the event we're waiting for or the timeout expires
// (but note that we always execute the loop at least once, even if timeout
// is 0 as this is used for polling)
IMPLEMENT_DYNAMIC_CLASS(wxSocketModule, wxModule)
+#if defined(wxUSE_SELECT_DISPATCHER) && wxUSE_SELECT_DISPATCHER
+// NOTE: we need to force linking against socketiohandler.cpp otherwise in
+// static builds of wxWidgets the ManagerSetter::ManagerSetter ctor
+// contained there wouldn't be ever called
+wxFORCE_LINK_MODULE( socketiohandler )
+#endif
+
#endif // wxUSE_SOCKETS