git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6422
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
unsigned long m_timeout; // IO timeout value
wxList m_states; // Stack of states
bool m_interrupt; // Interrupt ongoing wait operations
unsigned long m_timeout; // IO timeout value
wxList m_states; // Stack of states
bool m_interrupt; // Interrupt ongoing wait operations
+ bool m_beingDeleted; // Marked for delayed deletion
// Pushback buffer
char *m_unread; // Pushback buffer
// Pushback buffer
char *m_unread; // Pushback buffer
public:
wxSocketBase();
virtual ~wxSocketBase();
public:
wxSocketBase();
virtual ~wxSocketBase();
+ virtual bool Destroy();
wxSocketBase& Peek(char* buffer, wxUint32 nbytes);
wxSocketBase& Read(char* buffer, wxUint32 nbytes);
wxSocketBase& Write(const char *buffer, wxUint32 nbytes);
wxSocketBase& Peek(char* buffer, wxUint32 nbytes);
wxSocketBase& Read(char* buffer, wxUint32 nbytes);
wxSocketBase& Write(const char *buffer, wxUint32 nbytes);
m_neededreq(0), m_notify_state(FALSE),
m_connected(FALSE), m_establishing(FALSE),
m_reading(FALSE), m_writing(FALSE),
m_neededreq(0), m_notify_state(FALSE),
m_connected(FALSE), m_establishing(FALSE),
m_reading(FALSE), m_writing(FALSE),
- m_error(FALSE), m_lcount(0), m_timeout(600), m_states(),
+ m_error(FALSE), m_lcount(0), m_timeout(600),
+ m_states(), m_beingDeleted(FALSE),
m_unread(NULL), m_unrd_size(0), m_unrd_cur(0),
m_cbk(NULL), m_cdata(NULL)
{
m_unread(NULL), m_unrd_size(0), m_unrd_cur(0),
m_cbk(NULL), m_cdata(NULL)
{
m_neededreq(0), m_notify_state(FALSE),
m_connected(FALSE), m_establishing(FALSE),
m_reading(FALSE), m_writing(FALSE),
m_neededreq(0), m_notify_state(FALSE),
m_connected(FALSE), m_establishing(FALSE),
m_reading(FALSE), m_writing(FALSE),
- m_error(FALSE), m_lcount(0), m_timeout(600), m_states(),
+ m_error(FALSE), m_lcount(0), m_timeout(600),
+ m_states(), m_beingDeleted(FALSE),
m_unread(NULL), m_unrd_size(0), m_unrd_cur(0),
m_cbk(NULL), m_cdata(NULL)
{
m_unread(NULL), m_unrd_size(0), m_unrd_cur(0),
m_cbk(NULL), m_cdata(NULL)
{
wxSocketBase::~wxSocketBase()
{
wxSocketBase::~wxSocketBase()
{
- if (m_unread)
- free(m_unread);
+ // Just in case the app called Destroy() *and* then deleted
+ // the socket immediately: don't leave dangling pointers.
+#if wxUSE_GUI
+ wxPendingDelete.DeleteObject(this);
+#endif
// Shutdown and close the socket
// Shutdown and close the socket
+ if (!m_beingDeleted)
+ Close();
// Destroy the GSocket object
if (m_socket)
GSocket_destroy(m_socket);
// Destroy the GSocket object
if (m_socket)
GSocket_destroy(m_socket);
+
+ // Free the pushback buffer
+ if (m_unread)
+ free(m_unread);
bool wxSocketBase::Destroy()
{
// Delayed destruction: the socket will be deleted during the next
// idle loop iteration. This ensures that all pending events have
// been processed.
bool wxSocketBase::Destroy()
{
// Delayed destruction: the socket will be deleted during the next
// idle loop iteration. This ensures that all pending events have
// been processed.
+
+ // Shutdown and close the socket
- if ( !wxPendingDelete.Member(this) )
+#if wxUSE_GUI
+ if ( wxPendingDelete.Member(this) )
wxPendingDelete.Append(this);
wxPendingDelete.Append(this);
+#else
+ delete this;
+#endif
// --------------------------------------------------------------------------
// Basic IO operations
// --------------------------------------------------------------------------
// Basic IO operations