Changeset 2849


Ignore:
Timestamp:
Aug 15, 2013, 7:31:24 PM (6 years ago)
Author:
sam
Message:

thread: implement Queue::TryPush and Queue::TryPop.

Location:
trunk
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/platform/ps3/threadbase.h

    r2816 r2849  
    9797    }
    9898
     99    bool TryPush(T value)
     100    {
     101        sys_lwmutex_lock(&m_mutex, 0);
     102        if (m_count == CAPACITY)
     103        {
     104            sys_lwmutex_unlock(&m_mutex);
     105            return false;
     106        }
     107        m_values[(m_start + m_count) % CAPACITY] = value;
     108        m_count++;
     109        if (m_poppers)
     110            sys_lwcond_signal(&m_empty_cond);
     111        sys_lwmutex_unlock(&m_mutex);
     112        return true;
     113    }
     114
    99115    T Pop()
    100116    {
     
    111127        sys_lwmutex_unlock(&m_mutex);
    112128        return ret;
     129    }
     130
     131    bool TryPop(T &ret)
     132    {
     133        sys_lwmutex_lock(&m_mutex, 0);
     134        if (m_count == 0)
     135        {
     136            sys_lwmutex_unlock(&m_mutex);
     137            return false;
     138        }
     139        ret = m_values[m_start];
     140        m_start = (m_start + 1) % CAPACITY;
     141        m_count--;
     142        if (m_pushers)
     143            sys_lwcond_signal(&m_full_cond);
     144        sys_lwmutex_unlock(&m_mutex);
     145        return true;
    113146    }
    114147
  • trunk/src/sys/threadbase.h

    r2816 r2849  
    139139        ReleaseSemaphore(m_full_sem, 1, nullptr);
    140140#endif
     141    }
     142
     143    bool TryPush(T value)
     144    {
     145#if defined HAVE_PTHREAD_H
     146        pthread_mutex_lock(&m_mutex);
     147        /* If queue is full, wait on the "full" cond var. */
     148        if (m_count == CAPACITY)
     149        {
     150            pthread_mutex_unlock(&m_mutex);
     151            return false;
     152        }
     153#elif defined _WIN32
     154        DWORD status = WaitForSingleObject(m_empty_sem, 0);
     155        if (status == WAIT_TIMEOUT)
     156            return false;
     157        EnterCriticalSection(&m_mutex);
     158#endif
     159
     160        /* Push value */
     161        m_values[(m_start + m_count) % CAPACITY] = value;
     162        m_count++;
     163
     164#if defined HAVE_PTHREAD_H
     165        /* If there were poppers waiting, signal the "empty" cond var. */
     166        if (m_poppers)
     167            pthread_cond_signal(&m_empty_cond);
     168        pthread_mutex_unlock(&m_mutex);
     169#elif defined _WIN32
     170        LeaveCriticalSection(&m_mutex);
     171        ReleaseSemaphore(m_full_sem, 1, nullptr);
     172#endif
     173
     174        return true;
    141175    }
    142176
     
    175209    }
    176210
     211    bool TryPop(T &ret)
     212    {
     213#if defined HAVE_PTHREAD_H
     214        pthread_mutex_lock(&m_mutex);
     215        if (m_count == 0)
     216        {
     217            pthread_mutex_unlock(&m_mutex);
     218            return false;
     219        }
     220#elif defined _WIN32
     221        DWORD status = WaitForSingleObject(m_full_sem, 0);
     222        if (status == WAIT_TIMEOUT)
     223            return false;
     224        EnterCriticalSection(&m_mutex);
     225#endif
     226
     227        /* Pop value */
     228        ret = m_values[m_start];
     229        m_start = (m_start + 1) % CAPACITY;
     230        m_count--;
     231
     232#if defined HAVE_PTHREAD_H
     233        /* If there were pushers waiting, signal the "full" cond var. */
     234        if (m_pushers)
     235            pthread_cond_signal(&m_full_cond);
     236        pthread_mutex_unlock(&m_mutex);
     237#else
     238        LeaveCriticalSection(&m_mutex);
     239        ReleaseSemaphore(m_empty_sem, 1, nullptr);
     240#endif
     241
     242        return true;
     243    }
     244
    177245private:
    178246    static size_t const CAPACITY = N;
  • trunk/test/Makefile.am

    r2575 r2849  
    2121    unit/array.cpp unit/rotation.cpp unit/string.cpp unit/map.cpp \
    2222    unit/color.cpp unit/atomic.cpp unit/interp.cpp unit/box.cpp \
    23     unit/rand.cpp
     23    unit/rand.cpp unit/thread.cpp
    2424testsuite_CPPFLAGS = $(AM_CPPFLAGS)
    2525testsuite_DEPENDENCIES = @LOL_DEPS@
  • trunk/test/testsuite.vcxproj

    r2788 r2849  
    6060    <ClCompile Include="unit\rotation.cpp" />
    6161    <ClCompile Include="unit\string.cpp" />
     62    <ClCompile Include="unit\thread.cpp" />
    6263    <ClCompile Include="unit\trig.cpp" />
    6364    <ClCompile Include="unit\vector.cpp" />
Note: See TracChangeset for help on using the changeset viewer.