Coverage Report

Created: 2026-09-14 07:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/LibRaw/libraw/libraw_alloc.h
Line
Count
Source
1
/* -*- C++ -*-
2
 * File: libraw_alloc.h
3
 * Copyright 2008-2025 LibRaw LLC (info@libraw.org)
4
 * Created: Sat Mar  22, 2008
5
 *
6
 * LibRaw C++ interface
7
 *
8
LibRaw is free software; you can redistribute it and/or modify
9
it under the terms of the one of two licenses as you choose:
10
11
1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1
12
   (See file LICENSE.LGPL provided in LibRaw distribution archive for details).
13
14
2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
15
   (See file LICENSE.CDDL provided in LibRaw distribution archive for details).
16
17
 */
18
19
#ifndef __LIBRAW_ALLOC_H
20
#define __LIBRAW_ALLOC_H
21
22
#include <stdlib.h>
23
#include <string.h>
24
#include "libraw_const.h"
25
26
#ifdef __cplusplus
27
28
77.0M
#define LIBRAW_MSIZE 512
29
30
class DllDef libraw_memmgr
31
{
32
public:
33
39.1k
  libraw_memmgr(unsigned ee) : extra_bytes(ee)
34
39.1k
  {
35
39.1k
    size_t alloc_sz = LIBRAW_MSIZE * sizeof(void *);
36
39.1k
    mems = (void **)::malloc(alloc_sz);
37
39.1k
  if(mems)
38
39.1k
    memset(mems, 0, alloc_sz);
39
39.1k
  }
40
  ~libraw_memmgr()
41
39.1k
  {
42
39.1k
    cleanup();
43
39.1k
  if(mems)
44
39.1k
    ::free(mems);
45
39.1k
  }
46
  void *malloc(size_t sz)
47
7.13k
  {
48
#ifdef LIBRAW_USE_CALLOC_INSTEAD_OF_MALLOC
49
    void *ptr = ::calloc(sz + extra_bytes, 1);
50
#else
51
7.13k
    void *ptr = ::malloc(sz + extra_bytes);
52
7.13k
#endif
53
7.13k
    mem_ptr(ptr);
54
7.13k
    return ptr;
55
7.13k
  }
56
  void *calloc(size_t n, size_t sz)
57
400k
  {
58
400k
    void *ptr = ::calloc(n + (extra_bytes + sz - 1) / (sz ? sz : 1), sz);
59
400k
    mem_ptr(ptr);
60
400k
    return ptr;
61
400k
  }
62
  void *realloc(void *ptr, size_t newsz)
63
0
  {
64
0
    void *ret = ::realloc(ptr, newsz + extra_bytes);
65
0
    forget_ptr(ptr);
66
0
    mem_ptr(ret);
67
0
    return ret;
68
0
  }
69
  void free(void *ptr)
70
356k
  {
71
356k
    forget_ptr(ptr);
72
356k
    ::free(ptr);
73
356k
  }
74
  void cleanup(void)
75
134k
  {
76
134k
  if (!mems) return;
77
69.1M
    for (int i = 0; i < LIBRAW_MSIZE; i++)
78
68.9M
      if (mems[i])
79
51.0k
      {
80
51.0k
        ::free(mems[i]);
81
51.0k
        mems[i] = NULL;
82
51.0k
      }
83
134k
  }
84
85
private:
86
  void **mems;
87
  unsigned extra_bytes;
88
  void mem_ptr(void *ptr)
89
407k
  {
90
407k
    if (!mems) return;
91
#if defined(LIBRAW_USE_OPENMP)
92
      bool ok = false; /* do not return from critical section */
93
#endif
94
95
#if defined(LIBRAW_USE_OPENMP)
96
#pragma omp critical
97
      {
98
#endif
99
407k
          if (ptr)
100
407k
          {
101
6.15M
              for (int i = 0; i < LIBRAW_MSIZE - 1; i++)
102
6.15M
                  if (!mems[i])
103
407k
                  {
104
407k
                      mems[i] = ptr;
105
#if defined(LIBRAW_USE_OPENMP)
106
          ok = true;
107
          break;
108
#else
109
407k
                      return;
110
407k
#endif
111
407k
                  }
112
18
#ifdef LIBRAW_MEMPOOL_CHECK
113
18
#if !defined(LIBRAW_USE_OPENMP)
114
              /* remember ptr in last mems item to be free'ed at cleanup */
115
18
              if (!mems[LIBRAW_MSIZE - 1])
116
18
                  mems[LIBRAW_MSIZE - 1] = ptr;
117
18
              throw LIBRAW_EXCEPTION_MEMPOOL;
118
407k
#endif
119
407k
#endif
120
407k
          }
121
#if defined(LIBRAW_USE_OPENMP)
122
      }
123
      if(!ok)
124
      {
125
          if (!mems[LIBRAW_MSIZE - 1])
126
              mems[LIBRAW_MSIZE - 1] = ptr;
127
          throw LIBRAW_EXCEPTION_MEMPOOL;
128
      }
129
#endif
130
407k
  }
131
  void forget_ptr(void *ptr)
132
356k
  {
133
356k
  if (!mems) return;
134
#if defined(LIBRAW_USE_OPENMP)
135
#pragma omp critical
136
    {
137
#endif
138
356k
     if (ptr)
139
1.78M
      for (int i = 0; i < LIBRAW_MSIZE; i++)
140
1.78M
        if (mems[i] == ptr)
141
356k
        {
142
356k
          mems[i] = NULL;
143
356k
          break;
144
356k
        }
145
#if defined(LIBRAW_USE_OPENMP)
146
    }
147
#endif
148
356k
  }
149
};
150
151
#endif /* C++ */
152
153
#endif