VirtualBox

Changeset 90974 in vbox for trunk/src/VBox/Runtime/common


Ignore:
Timestamp:
Aug 28, 2021 12:45:58 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
146613
Message:

IPRT/log,VMM: Changed RTLogBulkWrite to take a before/after marker texts. Fixed buffer switching bug in rtlogFlush where we would write terminator to the previous buffer instead of the next. bugref:10086

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/log/log.cpp

    r90969 r90974  
    279279static FNRTLOGPHASEMSG rtlogPhaseMsgNormal;
    280280#endif
     281static void rtlogLoggerExFLocked(PRTLOGGERINTERNAL pLoggerInt, unsigned fFlags, unsigned iGroup, const char *pszFormat, ...);
    281282
    282283
     
    29842985 * @returns IRPT status code.
    29852986 * @param   pLogger             The logger instance (NULL for default logger).
     2987 * @param   pszBefore           Text to log before the bulk text.  Optional.
    29862988 * @param   pch                 Pointer to the block of bulk log text to write.
    29872989 * @param   cch                 Size of the block of bulk log text to write.
    2988  */
    2989 RTDECL(int) RTLogBulkWrite(PRTLOGGER pLogger, const char *pch, size_t cch)
     2990 * @param   pszAfter            Text to log after the bulk text.  Optional.
     2991 */
     2992RTDECL(int) RTLogBulkWrite(PRTLOGGER pLogger, const char *pszBefore, const char *pch, size_t cch, const char *pszAfter)
    29902993{
    29912994    PRTLOGGERINTERNAL pLoggerInt = (PRTLOGGERINTERNAL)pLogger;
     
    29983001    if (RT_SUCCESS(rc))
    29993002    {
    3000         /*
    3001          * Do the copying.
    3002          */
    3003         while (cch > 0)
    3004         {
    3005             PRTLOGBUFFERDESC const  pBufDesc = pLoggerInt->pBufDesc;
    3006             char * const            pchBuf   = pBufDesc->pchBuf;
    3007             uint32_t const          cbBuf    = pBufDesc->cbBuf;
    3008             uint32_t                offBuf   = pBufDesc->offBuf;
    3009             if (cch + 1 < cbBuf - offBuf)
     3003        if (cch > 0)
     3004        {
     3005            /*
     3006             * Heading/marker.
     3007             */
     3008            if (pszBefore)
     3009                rtlogLoggerExFLocked(pLoggerInt, RTLOGGRPFLAGS_LEVEL_1, UINT32_MAX, "%s", pszBefore);
     3010
     3011            /*
     3012             * Do the copying.
     3013             */
     3014            do
    30103015            {
    3011                 memcpy(&pchBuf[offBuf], pch, cch);
    3012                 offBuf += (uint32_t)cch;
    3013                 pchBuf[offBuf] = '\0';
    3014                 pBufDesc->offBuf = offBuf;
    3015                 if (pBufDesc->pAux)
    3016                     pBufDesc->pAux->offBuf = offBuf;
    3017                 if (!(pLoggerInt->fDestFlags & RTLOGFLAGS_BUFFERED))
    3018                     rtlogFlush(pLoggerInt, false /*fNeedSpace*/);
    3019                 break;
    3020             }
    3021 
    3022             /* Not enough space. */
    3023             if (offBuf + 1 < cbBuf)
    3024             {
    3025                 uint32_t cbToCopy = cbBuf - offBuf - 1;
    3026                 memcpy(&pchBuf[offBuf], pch, cbToCopy);
    3027                 offBuf += cbToCopy;
    3028                 pchBuf[offBuf] = '\0';
    3029                 pBufDesc->offBuf = offBuf;
    3030                 if (pBufDesc->pAux)
    3031                     pBufDesc->pAux->offBuf = offBuf;
    3032                 pch += cbToCopy;
    3033                 cch -= cbToCopy;
    3034             }
    3035 
    3036             rtlogFlush(pLoggerInt, false /*fNeedSpace*/);
     3016                PRTLOGBUFFERDESC const  pBufDesc = pLoggerInt->pBufDesc;
     3017                char * const            pchBuf   = pBufDesc->pchBuf;
     3018                uint32_t const          cbBuf    = pBufDesc->cbBuf;
     3019                uint32_t                offBuf   = pBufDesc->offBuf;
     3020                if (cch + 1 < cbBuf - offBuf)
     3021                {
     3022                    memcpy(&pchBuf[offBuf], pch, cch);
     3023                    offBuf += (uint32_t)cch;
     3024                    pchBuf[offBuf] = '\0';
     3025                    pBufDesc->offBuf = offBuf;
     3026                    if (pBufDesc->pAux)
     3027                        pBufDesc->pAux->offBuf = offBuf;
     3028                    if (!(pLoggerInt->fDestFlags & RTLOGFLAGS_BUFFERED))
     3029                        rtlogFlush(pLoggerInt, false /*fNeedSpace*/);
     3030                    break;
     3031                }
     3032
     3033                /* Not enough space. */
     3034                if (offBuf + 1 < cbBuf)
     3035                {
     3036                    uint32_t cbToCopy = cbBuf - offBuf - 1;
     3037                    memcpy(&pchBuf[offBuf], pch, cbToCopy);
     3038                    offBuf += cbToCopy;
     3039                    pchBuf[offBuf] = '\0';
     3040                    pBufDesc->offBuf = offBuf;
     3041                    if (pBufDesc->pAux)
     3042                        pBufDesc->pAux->offBuf = offBuf;
     3043                    pch += cbToCopy;
     3044                    cch -= cbToCopy;
     3045                }
     3046
     3047                rtlogFlush(pLoggerInt, false /*fNeedSpace*/);
     3048            } while (cch > 0);
     3049
     3050            /*
     3051             * Footer/marker.
     3052             */
     3053            if (pszAfter)
     3054                rtlogLoggerExFLocked(pLoggerInt, RTLOGGRPFLAGS_LEVEL_1, UINT32_MAX, "%s", pszAfter);
    30373055        }
    30383056
     
    31093127    PRTLOGBUFFERDESC    pBufDesc   = pLoggerInt->pBufDesc;
    31103128    uint32_t            cchToFlush = pBufDesc->offBuf;
    3111     char * const        pchToFlush = pBufDesc->pchBuf;
     3129    char *              pchToFlush = pBufDesc->pchBuf;
    31123130    uint32_t const      cbBuf      = pBufDesc->cbBuf;
    31133131    Assert(pBufDesc->u32Magic == RTLOGBUFFERDESC_MAGIC);
     
    31993217                pLoggerInt->idxBufDesc = (uint8_t)idxBufDesc;
    32003218                pLoggerInt->pBufDesc   = pBufDesc = &pLoggerInt->paBufDescs[idxBufDesc];
     3219                pchToFlush = pBufDesc->pchBuf;
    32013220            }
    32023221        }
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