Files
mercury/library/gc.m
Zoltan Somogyi a12692a0de Replace /* */ comments with // in the library.
Keep the old style comments where they do not go to the end of the line,
or where it is important that the comment line not have a // on it.
2018-06-21 18:55:08 +02:00

79 lines
2.3 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%---------------------------------------------------------------------------%
% Copyright (C) 1999,2001-2007 The University of Melbourne.
% Copyright (C) 2014-2015, 2018 The Mercury team.
% This file is distributed under the terms specified in COPYING.LIB.
%---------------------------------------------------------------------------%
%
% File: gc.m.
% Author: fjh.
% Stability: medium.
%
% This module defines some procedures for controlling the actions of the
% garbage collector.
%
%---------------------------------------------------------------------------%
%---------------------------------------------------------------------------%
:- module gc.
:- interface.
:- import_module io.
%---------------------------------------------------------------------------%
% Force a garbage collection.
%
:- pred garbage_collect(io.state::di, io.state::uo) is det.
% Force a garbage collection.
% Note that this version is not really impure, but it needs to be
% declared impure to ensure that the compiler won't try to
% optimize it away.
%
:- impure pred garbage_collect is det.
%---------------------------------------------------------------------------%
%---------------------------------------------------------------------------%
:- implementation.
:- pragma promise_pure(garbage_collect/2).
garbage_collect(!IO) :-
impure garbage_collect.
:- pragma no_inline(garbage_collect/0).
:- pragma foreign_export("C", garbage_collect, "ML_garbage_collect").
:- pragma foreign_proc("C",
garbage_collect,
[may_call_mercury, thread_safe, terminates],
"
#ifdef MR_CONSERVATIVE_GC
#ifndef MR_HIGHLEVEL_CODE
// clear out the stacks and registers before garbage collecting.
MR_clear_zone_for_GC(MR_CONTEXT(MR_ctxt_detstack_zone), MR_sp + 1);
MR_clear_zone_for_GC(MR_CONTEXT(MR_ctxt_nondetstack_zone),
MR_maxfr + 1);
MR_clear_regs_for_GC();
#endif
GC_gcollect();
#elif defined(MR_NATIVE_GC)
#ifdef MR_HIGHLEVEL_CODE
MR_garbage_collect();
#else
// XXX not yet implemented
#endif
#endif
").
garbage_collect :-
impure private_builtin.imp.
%---------------------------------------------------------------------------%
%---------------------------------------------------------------------------%