LCOV - code coverage report
Current view: top level - port - cpl_error_internal.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 6 6 100.0 %
Date: 2025-03-28 11:40:40 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /**********************************************************************
       2             :  *
       3             :  * Name:     cpl_error_internal.h
       4             :  * Project:  CPL - Common Portability Library
       5             :  * Purpose:  CPL Error handling
       6             :  * Author:   Even Rouault, <even.rouault at spatialys.com>
       7             :  *
       8             :  **********************************************************************
       9             :  * Copyright (c) 2019, Even Rouault, <even.rouault at spatialys.com>
      10             :  *
      11             :  * SPDX-License-Identifier: MIT
      12             :  ****************************************************************************/
      13             : 
      14             : #ifndef CPL_ERROR_INTERNAL_H_INCLUDED
      15             : #define CPL_ERROR_INTERNAL_H_INCLUDED
      16             : 
      17             : #ifdef GDAL_COMPILATION
      18             : // internal only
      19             : 
      20             : #include "cpl_error.h"
      21             : #include "cpl_string.h"
      22             : 
      23             : #include <mutex>
      24             : #include <vector>
      25             : 
      26             : /************************************************************************/
      27             : /*                CPLErrorHandlerAccumulatorStruct                      */
      28             : /************************************************************************/
      29             : 
      30             : class CPL_DLL CPLErrorHandlerAccumulatorStruct
      31             : {
      32             :   public:
      33             :     CPLErr type;
      34             :     CPLErrorNum no;
      35             :     CPLString msg{};
      36             : 
      37             :     CPLErrorHandlerAccumulatorStruct() : type(CE_None), no(CPLE_None)
      38             :     {
      39             :     }
      40             : 
      41         352 :     CPLErrorHandlerAccumulatorStruct(CPLErr eErrIn, CPLErrorNum noIn,
      42             :                                      const char *msgIn)
      43         352 :         : type(eErrIn), no(noIn), msg(msgIn)
      44             :     {
      45         352 :     }
      46             : };
      47             : 
      48             : /************************************************************************/
      49             : /*                       CPLErrorAccumulator                            */
      50             : /************************************************************************/
      51             : 
      52             : /** Class typically used by a worker thread to store errors emitted by their
      53             :  * worker functions, and replay them in the main thread.
      54             :  *
      55             :  * An instance of CPLErrorAccumulator can be shared by several
      56             :  * threads. Each thread calls InstallForCurrentScope() in its processing
      57             :  * function. The main thread may invoke ReplayErrors() to replay errors (and
      58             :  * warnings).
      59             :  *
      60             :  * @since 3.11
      61             :  */
      62             : class CPL_DLL CPLErrorAccumulator
      63             : {
      64             :   public:
      65             :     /** Constructor */
      66       70853 :     CPLErrorAccumulator() = default;
      67             : 
      68             :     struct CPL_DLL Context
      69             :     {
      70             :         ~Context();
      71             :     };
      72             : 
      73             :     /** Install a temporary error handler that will store errors and warnings.
      74             :      */
      75             :     Context InstallForCurrentScope() CPL_WARN_UNUSED_RESULT;
      76             : 
      77             :     /** Return error list. */
      78       70411 :     const std::vector<CPLErrorHandlerAccumulatorStruct> &GetErrors() const
      79             :     {
      80       70411 :         return errors;
      81             :     }
      82             : 
      83             :     /** Replay stored errors. */
      84             :     void ReplayErrors();
      85             : 
      86             :   private:
      87             :     std::mutex mutex{};
      88             :     std::vector<CPLErrorHandlerAccumulatorStruct> errors{};
      89             : 
      90             :     static void CPL_STDCALL Accumulator(CPLErr eErr, CPLErrorNum no,
      91             :                                         const char *msg);
      92             : };
      93             : 
      94             : #endif
      95             : 
      96             : #endif  // CPL_ERROR_INTERNAL_H_INCLUDED

Generated by: LCOV version 1.14