Macaulay2 Engine
Loading...
Searching...
No Matches
finalize.cpp
Go to the documentation of this file.
1// Copyright 2010 Michael E. Stillman.
2
3#include "finalize.hpp"
4#include "engine-includes.hpp"
5
6#include <atomic>
7
8#include "monideal.hpp"
9#include "comp-gb.hpp"
10#include "comp-res.hpp"
11#include "schorder.hpp"
12#include "mat.hpp"
13
14#include <M2/gc-include.h>
15
16#ifdef MEMDEBUG
17#include "memdebug.h"
18#endif
19
20static volatile std::atomic<int> monideals_nfinalized = 0;
21static volatile std::atomic<int> monideals_nremoved = 0;
22
23static volatile std::atomic<int> mutablematrices_nfinalized = 0;
24static volatile std::atomic<int> mutablematrices_nremoved = 0;
25
26static volatile std::atomic<int> polyrings_nfinalized = 0;
27static volatile std::atomic<int> polyrings_nremoved = 0;
28
29static volatile std::atomic<int> gbs_nfinalized = 0;
30static volatile std::atomic<int> gbs_nremoved = 0;
31
32static volatile std::atomic<int> res_nfinalized = 0;
33static volatile std::atomic<int> res_nremoved = 0;
34
35static volatile std::atomic<int> comp_nfinalized = 0;
36static volatile std::atomic<int> comp_nremoved = 0;
37
38static volatile std::atomic<int> schorder_nfinalized = 0;
39static volatile std::atomic<int> schorder_nremoved = 0;
40
42extern "C" void remove_monideal(void *p, void *cd)
43{
44 (void) cd;
45#ifdef MEMDEBUG
46 p = M2_debug_to_inner(p);
47#endif
48 MonomialIdeal *G = static_cast<MonomialIdeal *>(p);
49 std::atomic<int> nremoved = monideals_nremoved++;
50 if (M2_gbTrace >= 3)
51 fprintf(stderr, "\n -- removing monomial ideal %d at %p\n", nremoved.load(),
52 G);
53 G->remove_MonomialIdeal();
54}
56{
57#ifdef MEMDEBUG
58 GC_REGISTER_FINALIZER(M2_debug_to_outer(G), remove_monideal, 0, 0, 0);
59#else
60 GC_REGISTER_FINALIZER(G, remove_monideal, nullptr, nullptr, nullptr);
61#endif
62 std::atomic<int> nfinalized = monideals_nfinalized++;
63 if (M2_gbTrace >= 3)
64 fprintf(stderr,
65 "\n -- registering monomial ideal %d at %p\n",
66 nfinalized.load(),
67 (void *)G);
68}
69
70// extern "C" void remove_polyring(void *p, void *cd)
71// {
72// #ifdef MEMDEBUG
73// p = M2_debug_to_inner(p);
74// #endif
75// PolynomialRing *G = static_cast<PolynomialRing *>(p);
76// AO_t nremoved = AO_fetch_and_add1(&polyrings_nremoved);
77// if (M2_gbTrace >= 3)
78// fprintf(stderr, "\n -- removing polynomial ring %zd at %p\n", nremoved, G);
79// G->clear();
80// }
82{
83 (void) G;
84 // We are already setting a finalizer for rings in newdelete.hpp,
85 // I believe this one is just unsetting that one.
86 return;
87// #ifdef MEMDEBUG
88// GC_REGISTER_FINALIZER_IGNORE_SELF(M2_debug_to_outer(const_cast<PolynomialRing *>(G)), remove_polyring, 0, 0, 0);
89// #else
90// GC_REGISTER_FINALIZER_IGNORE_SELF( const_cast<PolynomialRing *>(G) , remove_polyring, 0, 0, 0);
91// #endif
92// AO_t nfinalized = AO_fetch_and_add1(&polyrings_nfinalized);
93// if (M2_gbTrace >= 3)
94// fprintf(stderr,
95// "\n -- registering polynomial ring %zd at %p\n",
96// nfinalized,
97// (const void *)G);
98}
99
100extern "C" void remove_gb(void *p, void *cd)
101{
102 (void) cd;
103#ifdef MEMDEBUG
104 p = M2_debug_to_inner(p);
105#endif
106 GBComputation *G = static_cast<GBComputation *>(p);
107 std::atomic<int> nremoved = gbs_nremoved++;
108 if (M2_gbTrace >= 3)
109 fprintf(stderr, "\n --removing gb %d at %p\n", nremoved.load(), G);
110 G->remove_gb();
111}
113{
114#ifdef MEMDEBUG
115 GC_REGISTER_FINALIZER_IGNORE_SELF(M2_debug_to_outer(G), remove_gb, 0, 0, 0);
116#else
117 GC_REGISTER_FINALIZER_IGNORE_SELF( G , remove_gb, nullptr, nullptr, nullptr);
118#endif
119 std::atomic<int> nfinalized = gbs_nfinalized++;
120 if (M2_gbTrace >= 3)
121 {
122 // -- there is no gettid under Solaris
123 // int tid = static_cast<int>(syscall(SYS_gettid));
124 // fprintf(stderr, "\n -- thread %d registering gb %zd at %p\n", tid,
125 // nfinalized, (void *)G);
126 fprintf(
127 stderr, "\n -- registering gb %d at %p\n", nfinalized.load(),
128 (void *)G);
129 }
130}
131
132extern "C" void remove_res(void *p, void *cd)
133{
134 (void) cd;
135#ifdef MEMDEBUG
136 p = M2_debug_to_inner(p);
137#endif
139 std::atomic<int> nremoved = res_nremoved++;
140 if (M2_gbTrace >= 3)
141 fprintf(stderr, "\n -- removing res %d at %p\n", nremoved.load(), G);
142 delete G;
143}
145{
146#ifdef MEMDEBUG
147 GC_REGISTER_FINALIZER(M2_debug_to_outer(G), remove_res, 0, 0, 0);
148#else
149 GC_REGISTER_FINALIZER( G , remove_res, nullptr, nullptr, nullptr);
150#endif
151 std::atomic<int> nfinalized = res_nfinalized++;
152 if (M2_gbTrace >= 3)
153 fprintf(
154 stderr, "\n -- registering res %d at %p\n", nfinalized.load(),
155 (void *)G);
156}
157
158extern "C" void remove_SchreyerOrder(void *p, void *cd)
159{
160 (void) cd;
161#ifdef MEMDEBUG
162 p = M2_debug_to_inner(p);
163#endif
164 SchreyerOrder *G = static_cast<SchreyerOrder *>(p);
165 std::atomic<int> nremoved = schorder_nremoved++;
166 if (M2_gbTrace >= 3)
167 fprintf(stderr, "\n -- removing SchreyerOrder %d at %p\n", nremoved.load(),
168 G);
169 G->remove();
170}
172{
173#ifdef MEMDEBUG
174 GC_REGISTER_FINALIZER(M2_debug_to_outer(G), remove_SchreyerOrder, 0, 0, 0);
175#else
176 GC_REGISTER_FINALIZER( G , remove_SchreyerOrder, nullptr, nullptr, nullptr);
177#endif
178 std::atomic<int> nfinalized = schorder_nfinalized++;
179 if (M2_gbTrace >= 3)
180 fprintf(stderr,
181 "\n -- registering SchreyerOrder %d at %p\n",
182 nfinalized.load(),
183 (void *)G);
184}
185
186
187extern "C" void remove_MutableMatrix(void *p, void *cd)
188{
189 (void) cd;
190#ifdef MEMDEBUG
191 p = M2_debug_to_inner(p);
192#endif
193 MutableMatrix *G = static_cast<MutableMatrix *>(p);
194 std::atomic<int> nremoved = mutablematrices_nremoved++;
195 if (M2_gbTrace >= 3)
196 fprintf(stderr, "\n -- removing mutable matrix %d at %p\n", nremoved.load(),
197 G);
198 G->~MutableMatrix();
199}
201{
202 if (G == nullptr) return nullptr;
203#ifdef MEMDEBUG
204 GC_REGISTER_FINALIZER(M2_debug_to_outer(G), remove_MutableMatrix, 0, 0, 0);
205#else
206 GC_REGISTER_FINALIZER( G, remove_MutableMatrix, nullptr, nullptr, nullptr);
207#endif
208 std::atomic<int> nfinalized = mutablematrices_nfinalized++;
209 if (M2_gbTrace >= 3)
210 fprintf(stderr,
211 "\n -- registering mutable matrix %d at %p\n",
212 nfinalized.load(),
213 (void *)G);
214 return G;
215}
216
217extern long nres;
218extern long nres_destruct;
219
220extern "C" // TODO: remove when this function is in e/interface
221M2_string engineMemory()
222{
223 buffer o;
224 try
225 {
226 stash::stats(o);
227 o << newline;
228
229 o << "Finalizations of new resolutions:" << newline;
230 o << "# of res objects constructed/deconstructed=(" << nres << ","
231 << nres_destruct << ") #left = " << (nres - nres_destruct) << newline;
232 o << newline;
233
234 o << "# of GB objects registered/finalized=(" << gbs_nfinalized
235 << "," << gbs_nremoved
236 << ") #left = " << (gbs_nfinalized - gbs_nremoved) << newline;
237
238 o << "# of res objects registered/finalized=(" << res_nfinalized
239 << "," << res_nremoved
240 << ") #left = " << (res_nfinalized - res_nremoved) << newline;
241
242 o << "# of computations registered/finalized=(" << comp_nfinalized
243 << "," << comp_nremoved
244 << ") #left = " << (comp_nfinalized - comp_nremoved) << newline;
245
246 o << newline;
247
248 o << "# of monomial ideals registered/finalized=("
250 << ") #left = " << (monideals_nfinalized - monideals_nremoved)
251 << newline;
252
253 o << "# of mutable matrices registered/finalized=("
255 << ") #left = "
257
258 o << "# of polynomial rings registered/finalized=("
260 << ") #left = " << (polyrings_nfinalized - polyrings_nremoved)
261 << newline;
262
263 o << "# of schreyer orders registered/finalized=(" << schorder_nfinalized
264 << "," << schorder_nremoved
265 << ") #left = " << (schorder_nfinalized - schorder_nremoved) << newline;
266
267 return o.to_string();
268 } catch (const exc::engine_error& e)
269 {
270 o << "Internal error: [unprintable memory display]";
271 return o.to_string();
272 }
273}
274
275// Local Variables:
276// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
277// indent-tabs-mode: nil
278// End:
base class for Groebner basis computations.
Definition comp-gb.hpp:69
Engine-side monomial ideal: a decision tree of Nmi_nodes storing the (typically minimal) generators b...
Definition monideal.hpp:136
Abstract base class for mutable matrices over an arbitrary engine Ring, the in-place counterpart of t...
Definition mat.hpp:79
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
Base class for free resolution computation classes.
Definition comp-res.hpp:52
Per-component tie-breaker data for a Schreyer monomial order on a FreeModule.
Definition schorder.hpp:68
M2_string to_string()
Definition buffer.cpp:20
static void stats(buffer &o)
Definition mem.cpp:93
GBComputation — abstract base of every Groebner-basis algorithm in the engine.
ResolutionComputation — abstract base for every free-resolution algorithm in the engine.
Engine-wide include prelude — a single point of truth for portability shims.
void intern_GB(GBComputation *G)
Definition finalize.cpp:112
static volatile std::atomic< int > monideals_nremoved
Definition finalize.cpp:21
long nres_destruct
void remove_MutableMatrix(void *p, void *cd)
Definition finalize.cpp:187
long nres
static volatile std::atomic< int > monideals_nfinalized
Definition finalize.cpp:20
static volatile std::atomic< int > gbs_nremoved
Definition finalize.cpp:30
void remove_SchreyerOrder(void *p, void *cd)
Definition finalize.cpp:158
void intern_monideal(MonomialIdeal *G)
Definition finalize.cpp:55
MutableMatrix * internMutableMatrix(MutableMatrix *G)
Definition finalize.cpp:200
void remove_monideal(void *p, void *cd)
Definition finalize.cpp:42
static volatile std::atomic< int > gbs_nfinalized
Definition finalize.cpp:29
void intern_polyring(const PolynomialRing *G)
Definition finalize.cpp:81
M2_string engineMemory()
Definition finalize.cpp:221
void intern_SchreyerOrder(SchreyerOrder *G)
Definition finalize.cpp:171
void intern_res(ResolutionComputation *G)
Definition finalize.cpp:144
static volatile std::atomic< int > polyrings_nfinalized
Definition finalize.cpp:26
static volatile std::atomic< int > schorder_nremoved
Definition finalize.cpp:39
static volatile std::atomic< int > polyrings_nremoved
Definition finalize.cpp:27
void remove_res(void *p, void *cd)
Definition finalize.cpp:132
void remove_gb(void *p, void *cd)
Definition finalize.cpp:100
static volatile std::atomic< int > res_nremoved
Definition finalize.cpp:33
static volatile std::atomic< int > res_nfinalized
Definition finalize.cpp:32
static volatile std::atomic< int > comp_nremoved
Definition finalize.cpp:36
static volatile std::atomic< int > comp_nfinalized
Definition finalize.cpp:35
static volatile std::atomic< int > schorder_nfinalized
Definition finalize.cpp:38
static volatile std::atomic< int > mutablematrices_nremoved
Definition finalize.cpp:24
static volatile std::atomic< int > mutablematrices_nfinalized
Definition finalize.cpp:23
intern_* helpers that register long-lived engine objects with bdwgc finalisers.
int p
char newline[]
Definition m2-types.cpp:49
int M2_gbTrace
Definition m2-types.cpp:52
MutableMatrix — abstract base of every mutable matrix the engine hands across the boundary.
MonomialIdeal — exponent-vector-only representation of an ideal generated by monomials.
tbb::flow::graph G
SchreyerOrder — per-basis-element data backing the Schreyer order on a free module.