VirtualBox

Changeset 39350 in vbox


Ignore:
Timestamp:
Nov 17, 2011 3:07:24 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
74932
Message:

Runtime: add methods for checking if something is in use in a circular buffer

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/include/iprt/circbuf.h

    r37210 r39350  
    9292RTDECL(size_t) RTCircBufSize(PRTCIRCBUF pBuf);
    9393
     94RTDECL(bool) RTCircBufIsReading(PRTCIRCBUF pBuf);
     95RTDECL(bool) RTCircBufIsWriting(PRTCIRCBUF pBuf);
     96
    9497/**
    9598 * Acquire a block of the circular buffer for reading.
  • TabularUnified trunk/include/iprt/mangling.h

    r39046 r39350  
    279279# define RTCircBufDestroy                               RT_MANGLER(RTCircBufDestroy)
    280280# define RTCircBufFree                                  RT_MANGLER(RTCircBufFree)
     281# define RTCircBufIsReading                             RT_MANGLER(RTCircBufIsReading)
     282# define RTCircBufIsWriting                             RT_MANGLER(RTCircBufIsWriting)
    281283# define RTCircBufReleaseReadBlock                      RT_MANGLER(RTCircBufReleaseReadBlock)
    282284# define RTCircBufReleaseWriteBlock                     RT_MANGLER(RTCircBufReleaseWriteBlock)
  • TabularUnified trunk/src/VBox/Runtime/common/misc/circbuf.cpp

    r39032 r39350  
    4444    /** The current read position in the buffer. */
    4545    size_t          offRead;
     46    /** Is a read block acquired currently? */
     47    bool            fReading;
     48    /** Is a write block acquired currently? */
     49    bool            fWriting;
    4650    /** The current write position in the buffer. */
    4751    size_t          offWrite;
     
    97101    pBuf->offRead  = 0;
    98102    pBuf->offWrite = 0;
    99     pBuf->cbUsed = 0;
     103    pBuf->cbUsed   = 0;
     104    pBuf->fReading = false;
     105    pBuf->fWriting = false;
    100106}
    101107
     
    118124}
    119125
    120 
    121126RTDECL(size_t) RTCircBufSize(PRTCIRCBUF pBuf)
    122127{
     
    127132}
    128133
     134RTDECL(bool) RTCircBufIsReading(PRTCIRCBUF pBuf)
     135{
     136    /* Validate input. */
     137    AssertPtrReturn(pBuf, 0);
     138
     139    return ASMAtomicReadBool(&pBuf->fReading);
     140}
     141
     142RTDECL(bool) RTCircBufIsWriting(PRTCIRCBUF pBuf)
     143{
     144    /* Validate input. */
     145    AssertPtrReturn(pBuf, 0);
     146
     147    return ASMAtomicReadBool(&pBuf->fWriting);
     148}
    129149
    130150RTDECL(void) RTCircBufAcquireReadBlock(PRTCIRCBUF pBuf, size_t cbReqSize, void **ppvStart, size_t *pcbSize)
     
    152172            *ppvStart = (char *)pBuf->pvBuf + pBuf->offRead;
    153173            *pcbSize = cbSize;
     174
     175            ASMAtomicWriteBool(&pBuf->fReading, true);
    154176        }
    155177    }
     
    166188
    167189    ASMAtomicSubZ(&pBuf->cbUsed, cbSize);
     190    ASMAtomicWriteBool(&pBuf->fReading, false);
    168191}
    169192
     
    193216            *ppvStart = (char*)pBuf->pvBuf + pBuf->offWrite;
    194217            *pcbSize = cbSize;
     218
     219            ASMAtomicWriteBool(&pBuf->fWriting, true);
    195220        }
    196221    }
     
    207232
    208233    ASMAtomicAddZ(&pBuf->cbUsed, cbSize);
    209 }
    210 
     234    ASMAtomicWriteBool(&pBuf->fWriting, false);
     235}
     236
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette