LCOV - code coverage report
Current view: top level - source/lib/file/common - trace.h (source / functions) Hit Total Coverage
Test: 0 A.D. test coverage report Lines: 8 8 100.0 %
Date: 2023-01-19 00:18:29 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /* Copyright (C) 2021 Wildfire Games.
       2             :  *
       3             :  * Permission is hereby granted, free of charge, to any person obtaining
       4             :  * a copy of this software and associated documentation files (the
       5             :  * "Software"), to deal in the Software without restriction, including
       6             :  * without limitation the rights to use, copy, modify, merge, publish,
       7             :  * distribute, sublicense, and/or sell copies of the Software, and to
       8             :  * permit persons to whom the Software is furnished to do so, subject to
       9             :  * the following conditions:
      10             :  *
      11             :  * The above copyright notice and this permission notice shall be included
      12             :  * in all copies or substantial portions of the Software.
      13             :  *
      14             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
      15             :  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
      16             :  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
      17             :  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
      18             :  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
      19             :  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
      20             :  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      21             :  */
      22             : 
      23             : /*
      24             :  * IO event recording
      25             :  */
      26             : 
      27             : // traces are useful for determining the optimal ordering of archived files
      28             : // and can also serve as a repeatable IO benchmark.
      29             : 
      30             : // note: since FileContents are smart pointers, the trace can't easily
      31             : // be notified when they are released (relevant for cache simulation).
      32             : // we have to assume that users process one file at a time -- as they
      33             : // should.
      34             : 
      35             : #ifndef INCLUDED_TRACE
      36             : #define INCLUDED_TRACE
      37             : 
      38             : #include "lib/os_path.h"
      39             : 
      40             : // stores information about an IO event.
      41           5 : class TraceEntry
      42             : {
      43             : public:
      44             :     enum EAction
      45             :     {
      46             :         Load = 'L',
      47             :         Store = 'S'
      48             :     };
      49             : 
      50             :     TraceEntry(EAction action, const Path& pathname, size_t size);
      51             :     TraceEntry(const std::wstring& text);
      52             : 
      53           4 :     EAction Action() const
      54             :     {
      55           4 :         return m_action;
      56             :     }
      57             : 
      58           5 :     const Path& Pathname() const
      59             :     {
      60           5 :         return m_pathname;
      61             :     }
      62             : 
      63           4 :     size_t Size() const
      64             :     {
      65           4 :         return m_size;
      66             :     }
      67             : 
      68             :     std::wstring EncodeAsText() const;
      69             : 
      70             : private:
      71             :     // note: keep an eye on the class size because all instances are kept
      72             :     // in memory (see ITrace)
      73             : 
      74             :     // time (as returned by timer_Time) after the operation completes.
      75             :     // rationale: when loading, the VFS doesn't know file size until
      76             :     // querying the cache or retrieving file information.
      77             :     float m_timestamp;
      78             : 
      79             :     EAction m_action;
      80             : 
      81             :     Path m_pathname;
      82             : 
      83             :     // size of file.
      84             :     // rationale: other applications using this trace format might not
      85             :     // have access to the VFS and its file information.
      86             :     size_t m_size;
      87             : };
      88             : 
      89             : 
      90             : // note: to avoid interfering with measurements, this trace container
      91             : // does not cause any IOs (except of course in Load/Store)
      92          83 : struct ITrace
      93             : {
      94             :     virtual ~ITrace();
      95             : 
      96             :     virtual void NotifyLoad(const Path& pathname, size_t size) = 0;
      97             :     virtual void NotifyStore(const Path& pathname, size_t size) = 0;
      98             : 
      99             :     /**
     100             :      * store all entries into a file.
     101             :      *
     102             :      * @param pathname (native, absolute)
     103             :      *
     104             :      * note: the file format is text-based to allow human inspection and
     105             :      * because storing filename strings in a binary format would be a
     106             :      * bit awkward.
     107             :      **/
     108             :     virtual Status Store(const OsPath& pathname) const = 0;
     109             : 
     110             :     /**
     111             :      * load entries from file.
     112             :      *
     113             :      * @param pathname (native, absolute)
     114             :      *
     115             :      * replaces any existing entries.
     116             :      **/
     117             :     virtual Status Load(const OsPath& pathname) = 0;
     118             : 
     119             :     virtual const TraceEntry* Entries() const = 0;
     120             :     virtual size_t NumEntries() const = 0;
     121             : };
     122             : 
     123             : typedef std::shared_ptr<ITrace> PITrace;
     124             : 
     125             : extern PITrace CreateDummyTrace(size_t maxSize);
     126             : extern PITrace CreateTrace(size_t maxSize);
     127             : 
     128             : #endif  // #ifndef INCLUDED_TRACE

Generated by: LCOV version 1.13