/// \brief Sets the state of the event to signalled void reset() { WINSTL_ASSERT(NULL != m_ev); if(!::ResetEvent(m_ev)) { #ifdef STLSOFT_CF_EXCEPTION_SUPPORT STLSOFT_THROW_X(synchronisation_exception("event reset operation failed", ::GetLastError())); #endif /* STLSOFT_CF_EXCEPTION_SUPPORT */ } }
/// \brief Releases an aquired lock on the mutex void unlock() { WINSTL_ASSERT(NULL != m_mx); if(!::ReleaseMutex(m_mx)) { DWORD const e = ::GetLastError(); #ifdef STLSOFT_CF_EXCEPTION_SUPPORT # if STLSOFT_LEAD_VER >= 0x010a0000 STLSOFT_THROW_X(synchronisation_object_state_change_failed_exception(e, "mutex release failed", Synchronisation_MutexReleaseFailed)); # else /* ? STLSOFT_LEAD_VER >= 1.10 */ STLSOFT_THROW_X(synchronisation_exception("mutex release failed", e)); # endif /* STLSOFT_LEAD_VER >= 1.10 */ #endif /* STLSOFT_CF_EXCEPTION_SUPPORT */ } }
/// \brief Acquires a lock on the mutex, pending the thread until the lock is aquired ws_bool_t lock(ws_dword_t wait) { WINSTL_ASSERT(NULL != m_mx); DWORD const dwRes = ::WaitForSingleObject(m_mx, wait); if(WAIT_ABANDONED == dwRes) { m_bAbandoned = true; return true; } else { m_bAbandoned = false; if(WAIT_TIMEOUT == dwRes) { return false; } else { if(WAIT_OBJECT_0 != dwRes) { DWORD const e = ::GetLastError(); #ifdef STLSOFT_CF_EXCEPTION_SUPPORT # if STLSOFT_LEAD_VER >= 0x010a0000 STLSOFT_THROW_X(wait_failed_logic_exception(e, "mutex wait failed")); # else /* ? STLSOFT_LEAD_VER >= 1.10 */ STLSOFT_THROW_X(synchronisation_exception("mutex wait failed", e)); # endif /* STLSOFT_LEAD_VER >= 1.10 */ #endif /* STLSOFT_CF_EXCEPTION_SUPPORT */ } return true; } } }
ws_size_t path_squeeze_impl( C const* path , ws_size_t pathLen , C* buffer , ws_size_t cchBuffer ) { typedef C char_t; typedef filesystem_traits<C> traits_t; typedef ws_size_t size_t; if(NULL == buffer) { cchBuffer = pathLen + 1u; } else if(0 != cchBuffer) { basic_path<char_t> p(path, pathLen); char_t const* file_ptr = p.get_file(); char_t const* path_ptr = p.c_str(); const size_t fileLen = p.size() - (file_ptr - path_ptr); if(cchBuffer > pathLen) { // Room for all traits_t::char_copy(buffer, path_ptr, pathLen); buffer[pathLen] = '\0'; cchBuffer = pathLen + 1u; } else { size_t rootLen; // Need to handle: // // 1. UNC // 2. drive // 3. rooted - begins with \ or / // 4. non-rooted if(p.is_rooted()) { if(p.is_absolute()) { if(traits_t::is_path_UNC(path_ptr)) { // 1. UNC char_t const* p1 = traits_t::str_chr(path_ptr + 2, '\\'); if(NULL == p1) { // badly formed UNC, so treat as no-root rootLen = 0; } else { rootLen = 1 + static_cast<size_t>(p1 - path_ptr); } } else { // 2. drive rootLen = 3; } } else { // 3. rooted - begins with \ or / rootLen = 1; } } else { // 4. non-rooted rootLen = 0; } if(cchBuffer < 5 + 1) { traits_t::char_copy(buffer, file_ptr, cchBuffer - 1); buffer[cchBuffer - 1] = '\0'; if(cchBuffer > fileLen) { cchBuffer = fileLen + 1; } } else if(cchBuffer < fileLen + 1) { // Squeezing just file+ext size_t leftLen = (cchBuffer - 3 - 1) / 2; size_t rightLen = (cchBuffer - 3 - 1) - leftLen; traits_t::char_copy(buffer, file_ptr, leftLen); buffer[leftLen + 0] = '.'; buffer[leftLen + 1] = '.'; buffer[leftLen + 2] = '.'; traits_t::char_copy(buffer + leftLen + 3, file_ptr + (fileLen - rightLen), rightLen); buffer[leftLen + 3 + rightLen] = '\0'; } else if(cchBuffer < rootLen + 3 + 1 + fileLen + 1) { // File (name + ext) only traits_t::char_copy(buffer, file_ptr, fileLen); buffer[fileLen] = '\0'; if(cchBuffer > fileLen) { cchBuffer = fileLen + 1; } } else { WINSTL_ASSERT(cchBuffer < pathLen + 1); // Squeezing size_t rightLen = 1 + fileLen; size_t leftLen = (cchBuffer - 3 - 1) - rightLen; traits_t::char_copy(buffer, path_ptr, leftLen); buffer[leftLen + 0] = '.'; buffer[leftLen + 1] = '.'; buffer[leftLen + 2] = '.'; traits_t::char_copy(buffer + leftLen + 3, file_ptr - 1, rightLen); buffer[leftLen + 3 + rightLen] = '\0'; } } } return cchBuffer; }