Exemplo n.º 1
0
    /// \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;
            }
        }
    }
Exemplo n.º 4
0
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;
}