Coverage Report

Created: 2026-04-01 07:24

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
70.8M
#define LIBRAW_MSIZE 512
29
30
class DllDef libraw_memmgr
31
{
32
public:
33
37.1k
  libraw_memmgr(unsigned ee) : extra_bytes(ee)
34
37.1k
  {
35
37.1k
    size_t alloc_sz = LIBRAW_MSIZE * sizeof(void *);
36
37.1k
    mems = (void **)::malloc(alloc_sz);
37
37.1k
    memset(mems, 0, alloc_sz);
38
37.1k
  }
39
  ~libraw_memmgr()
40
37.1k
  {
41
37.1k
    cleanup();
42
37.1k
    ::free(mems);
43
37.1k
  }
44
  void *malloc(size_t sz)
45
6.88k
  {
46
#ifdef LIBRAW_USE_CALLOC_INSTEAD_OF_MALLOC
47
    void *ptr = ::calloc(sz + extra_bytes, 1);
48
#else
49
6.88k
    void *ptr = ::malloc(sz + extra_bytes);
50
6.88k
#endif
51
6.88k
    mem_ptr(ptr);
52
6.88k
    return ptr;
53
6.88k
  }
54
  void *calloc(size_t n, size_t sz)
55
371k
  {
56
371k
    void *ptr = ::calloc(n + (extra_bytes + sz - 1) / (sz ? sz : 1), sz);
57
371k
    mem_ptr(ptr);
58
371k
    return ptr;
59
371k
  }
60
  void *realloc(void *ptr, size_t newsz)
61
0
  {
62
0
    void *ret = ::realloc(ptr, newsz + extra_bytes);
63
0
    forget_ptr(ptr);
64
0
    mem_ptr(ret);
65
0
    return ret;
66
0
  }
67
  void free(void *ptr)
68
342k
  {
69
342k
    forget_ptr(ptr);
70
342k
    ::free(ptr);
71
342k
  }
72
  void cleanup(void)
73
128k
  {
74
65.7M
    for (int i = 0; i < LIBRAW_MSIZE; i++)
75
65.6M
      if (mems[i])
76
35.8k
      {
77
35.8k
        ::free(mems[i]);
78
35.8k
        mems[i] = NULL;
79
35.8k
      }
80
128k
  }
81
82
private:
83
  void **mems;
84
  unsigned extra_bytes;
85
  void mem_ptr(void *ptr)
86
378k
  {
87
#if defined(LIBRAW_USE_OPENMP)
88
      bool ok = false; /* do not return from critical section */
89
#endif
90
91
#if defined(LIBRAW_USE_OPENMP)
92
#pragma omp critical
93
      {
94
#endif
95
378k
          if (ptr)
96
378k
          {
97
3.45M
              for (int i = 0; i < LIBRAW_MSIZE - 1; i++)
98
3.45M
                  if (!mems[i])
99
378k
                  {
100
378k
                      mems[i] = ptr;
101
#if defined(LIBRAW_USE_OPENMP)
102
          ok = true;
103
          break;
104
#else
105
378k
                      return;
106
378k
#endif
107
378k
                  }
108
2
#ifdef LIBRAW_MEMPOOL_CHECK
109
2
#if !defined(LIBRAW_USE_OPENMP)
110
              /* remember ptr in last mems item to be free'ed at cleanup */
111
2
              if (!mems[LIBRAW_MSIZE - 1])
112
2
                  mems[LIBRAW_MSIZE - 1] = ptr;
113
2
              throw LIBRAW_EXCEPTION_MEMPOOL;
114
378k
#endif
115
378k
#endif
116
378k
          }
117
#if defined(LIBRAW_USE_OPENMP)
118
      }
119
      if(!ok)
120
      {
121
          if (!mems[LIBRAW_MSIZE - 1])
122
              mems[LIBRAW_MSIZE - 1] = ptr;
123
          throw LIBRAW_EXCEPTION_MEMPOOL;
124
      }
125
#endif
126
378k
  }
127
  void forget_ptr(void *ptr)
128
342k
  {
129
#if defined(LIBRAW_USE_OPENMP)
130
#pragma omp critical
131
    {
132
#endif
133
342k
     if (ptr)
134
1.65M
      for (int i = 0; i < LIBRAW_MSIZE; i++)
135
1.65M
        if (mems[i] == ptr)
136
342k
        {
137
342k
          mems[i] = NULL;
138
342k
          break;
139
342k
        }
140
#if defined(LIBRAW_USE_OPENMP)
141
    }
142
#endif
143
342k
  }
144
};
145
146
#endif /* C++ */
147
148
#endif