bool wxSelectDispatcher::UnregisterFD(int fd) { wxCRIT_SECT_LOCKER(lock, m_cs); m_sets.ClearFD(fd); if ( !wxMappedFDIODispatcher::UnregisterFD(fd) ) return false; // remove the handler if we don't need it any more if ( !m_sets.HasFD(fd) ) { if ( fd == m_maxFD ) { // need to find new max fd m_maxFD = -1; for ( wxFDIOHandlerMap::const_iterator it = m_handlers.begin(); it != m_handlers.end(); ++it ) { if ( it->first > m_maxFD ) { m_maxFD = it->first; } } } } wxLogTrace(wxSelectDispatcher_Trace, wxT("Removed fd %d, current max: %d"), fd, m_maxFD); return true; }
/* static */ void wxLog::OnLog(wxLogLevel level, const wxChar *szString, time_t t) { if ( IsEnabled() && ms_logLevel >= level ) { wxLog *pLogger = GetActiveTarget(); if ( pLogger ) { if ( GetRepetitionCounting() ) { wxCRIT_SECT_LOCKER(lock, gs_prevCS); if ( szString == ms_prevString ) { ms_prevCounter++; // nothing else to do, in particular, don't log the // repeated message return; } pLogger->LogLastRepeatIfNeededUnlocked(); // reset repetition counter for a new message ms_prevString = szString; ms_prevLevel = level; ms_prevTimeStamp = t; } pLogger->DoLog(level, szString, t); } } }
void wxLog::RemoveTraceMask(const wxString& str) { wxCRIT_SECT_LOCKER(lock, GetTraceMaskCS()); int index = TraceMasks().Index(str); if ( index != wxNOT_FOUND ) TraceMasks().RemoveAt((size_t)index); }
void wxUninitialize() { wxCRIT_SECT_LOCKER(lockInit, gs_initData.csInit); if ( !--gs_initData.nInitCount ) { wxEntryCleanup(); } }
bool wxInitialize(int argc, wxChar **argv) { wxCRIT_SECT_LOCKER(lockInit, gs_initData.csInit); if ( gs_initData.nInitCount++ ) { // already initialized return true; } return wxEntryStart(argc, argv); }
bool wxSelectDispatcher::ModifyFD(int fd, wxFDIOHandler *handler, int flags) { wxCRIT_SECT_LOCKER(lock, m_cs); if ( !wxMappedFDIODispatcher::ModifyFD(fd, handler, flags) ) return false; wxASSERT_MSG( fd <= m_maxFD, wxT("logic error: registered fd > m_maxFD?") ); wxLogTrace(wxSelectDispatcher_Trace, wxT("Modified fd %d: input:%d, output:%d, exceptional:%d"), fd, (flags & wxFDIO_INPUT) == wxFDIO_INPUT, (flags & wxFDIO_OUTPUT) == wxFDIO_OUTPUT, (flags & wxFDIO_EXCEPTION) == wxFDIO_EXCEPTION); return m_sets.SetFD(fd, flags); }
/* static */ void wxLog::SetComponentLevel(const wxString& component, wxLogLevel level) { if ( component.empty() ) { SetLogLevel(level); } else { wxCRIT_SECT_LOCKER(lock, GetLevelsCS()); GetComponentLevels()[component] = level; } }
void wxStopWatch::DoStart() { #ifdef __WINDOWS__ PerfCounter& perfCounter = GetPerfCounterState(); if ( !perfCounter.init ) { wxCRIT_SECT_LOCKER(lock, perfCounter.cs); ::QueryPerformanceFrequency(&perfCounter.freq); perfCounter.init = true; } #endif // __WINDOWS__ m_t0 = GetCurrentClockValue(); }
/*static*/ bool wxLog::IsAllowedTraceMask(const wxString& mask) { wxCRIT_SECT_LOCKER(lock, GetTraceMaskCS()); const wxArrayString& masks = GetTraceMasks(); for ( wxArrayString::const_iterator it = masks.begin(), en = masks.end(); it != en; ++it ) { if ( *it == mask) return true; } return false; }
/* static */ wxLogLevel wxLog::GetComponentLevel(wxString component) { wxCRIT_SECT_LOCKER(lock, GetLevelsCS()); const wxStringToNumHashMap& componentLevels = GetComponentLevels(); while ( !component.empty() ) { wxStringToNumHashMap::const_iterator it = componentLevels.find(component); if ( it != componentLevels.end() ) return static_cast<wxLogLevel>(it->second); component = component.BeforeLast('/'); } return GetLogLevel(); }
bool wxSelectDispatcher::RegisterFD(int fd, wxFDIOHandler *handler, int flags) { wxCRIT_SECT_LOCKER(lock, m_cs); if ( !wxMappedFDIODispatcher::RegisterFD(fd, handler, flags) ) return false; if ( !m_sets.SetFD(fd, flags) ) return false; if ( fd > m_maxFD ) m_maxFD = fd; wxLogTrace(wxSelectDispatcher_Trace, wxT("Registered fd %d: input:%d, output:%d, exceptional:%d"), fd, (flags & wxFDIO_INPUT) == wxFDIO_INPUT, (flags & wxFDIO_OUTPUT), (flags & wxFDIO_EXCEPTION) == wxFDIO_EXCEPTION); return true; }
wxSocketImplMSW::~wxSocketImplMSW() { /* Remove the socket from the list */ wxCRIT_SECT_LOCKER(lock, gs_critical); if ( m_msgnumber ) { // we need to remove any pending messages for this socket to avoid having // them sent to a new socket which could reuse the same message number as // soon as we destroy this one MSG msg; while ( ::PeekMessage(&msg, hWin, m_msgnumber, m_msgnumber, PM_REMOVE) ) ; socketList[m_msgnumber - WM_USER] = NULL; } //else: the socket has never been created successfully }
wxSocketImplMSW::wxSocketImplMSW(wxSocketBase& wxsocket) : wxSocketImpl(wxsocket) { /* Allocate a new message number for this socket */ wxCRIT_SECT_LOCKER(lock, gs_critical); int i = firstAvailable; while (socketList[i] != NULL) { i = (i + 1) % MAXSOCKETS; if (i == firstAvailable) /* abort! */ { m_msgnumber = 0; // invalid return; } } socketList[i] = this; firstAvailable = (i + 1) % MAXSOCKETS; m_msgnumber = (i + WM_USER); }
LRESULT CALLBACK wxSocket_Internal_WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if ( uMsg < WM_USER || uMsg > (WM_USER + MAXSOCKETS - 1)) return DefWindowProc(hWnd, uMsg, wParam, lParam); wxSocketImplMSW *socket; wxSocketNotify event = (wxSocketNotify)-1; { wxCRIT_SECT_LOCKER(lock, gs_critical); socket = socketList[(uMsg - WM_USER)]; if ( !socket ) return 0; // the socket may be already closed but we could still receive // notifications for it sent (asynchronously) before it got closed if ( socket->m_fd == INVALID_SOCKET ) return 0; wxASSERT_MSG( socket->m_fd == (SOCKET)wParam, "mismatch between message and socket?" ); switch ( WSAGETSELECTEVENT(lParam) ) { case FD_READ: // We may get a FD_READ notification even when there is no data // to read on the socket, in particular this happens on socket // creation when we seem to always get FD_CONNECT, FD_WRITE and // FD_READ notifications all at once (but it doesn't happen // only then). Ignore such dummy notifications. { fd_set fds; timeval tv = { 0, 0 }; wxFD_ZERO(&fds); wxFD_SET(socket->m_fd, &fds); if ( select(socket->m_fd + 1, &fds, NULL, NULL, &tv) != 1 ) return 0; } event = wxSOCKET_INPUT; break; case FD_WRITE: event = wxSOCKET_OUTPUT; break; case FD_ACCEPT: event = wxSOCKET_CONNECTION; break; case FD_CONNECT: event = WSAGETSELECTERROR(lParam) ? wxSOCKET_LOST : wxSOCKET_CONNECTION; break; case FD_CLOSE: event = wxSOCKET_LOST; break; default: wxFAIL_MSG( "unexpected socket notification" ); return 0; } } // unlock gs_critical socket->NotifyOnStateChange(event); return 0; }
void wxLog::AddTraceMask(const wxString& str) { wxCRIT_SECT_LOCKER(lock, GetTraceMaskCS()); TraceMasks().push_back(str); }
void wxLog::ClearTraceMasks() { wxCRIT_SECT_LOCKER(lock, GetTraceMaskCS()); TraceMasks().Clear(); }
unsigned wxLog::LogLastRepeatIfNeeded() { wxCRIT_SECT_LOCKER(lock, gs_prevCS); return LogLastRepeatIfNeededUnlocked(); }