Fix bug #27450 ("Fat mutexes not GC'd until their owner dies").
[bpt/guile.git] / libguile / weaks.h
CommitLineData
0f2d19dd
JB
1/* classes: h_files */
2
592996c9
DH
3#ifndef SCM_WEAKS_H
4#define SCM_WEAKS_H
0527e687 5
aef9e3bd 6/* Copyright (C) 1995,1996,2000,2001, 2003, 2006, 2008, 2009 Free Software Foundation, Inc.
0527e687 7 *
73be1d9e 8 * This library is free software; you can redistribute it and/or
53befeb7
NJ
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; either version 3 of
11 * the License, or (at your option) any later version.
0527e687 12 *
53befeb7
NJ
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
73be1d9e
MV
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
0527e687 17 *
73be1d9e
MV
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
53befeb7
NJ
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 * 02110-1301 USA
73be1d9e 22 */
d3a6bc94 23
0f2d19dd
JB
24\f
25
b4309c3c 26#include "libguile/__scm.h"
0f2d19dd
JB
27
28\f
29
c35738c1
MD
30#define SCM_WVECTF_WEAK_KEY 1
31#define SCM_WVECTF_WEAK_VALUE 2
c35738c1 32
06c1d900
MV
33#define SCM_WVECT_WEAK_KEY_P(x) (SCM_I_WVECT_EXTRA(x) & SCM_WVECTF_WEAK_KEY)
34#define SCM_WVECT_WEAK_VALUE_P(x) (SCM_I_WVECT_EXTRA(x) & SCM_WVECTF_WEAK_VALUE)
0f2d19dd 35
06c1d900
MV
36/* The DELTA field is used by the abstract hash tables. During GC,
37 this field will be set to the number of items that have been
38 dropped. The abstract hash table will then use it to update its
39 item count. DELTA is unsigned.
40*/
41
42#define SCM_I_WVECT_DELTA(x) (SCM_I_WVECT_EXTRA(x) >> 3)
43#define SCM_I_SET_WVECT_DELTA(x,n) (SCM_I_SET_WVECT_EXTRA \
44 ((x), ((SCM_I_WVECT_EXTRA (x) & 7) \
45 | ((n) << 3))))
46
47#define SCM_I_WVECT_TYPE(x) (SCM_I_WVECT_EXTRA(x) & 7)
48#define SCM_I_SET_WVECT_TYPE(x,t) (SCM_I_SET_WVECT_EXTRA \
49 ((x), (SCM_I_WVECT_EXTRA (x) & ~7) | (t)))
50#define SCM_IS_WHVEC(X) (SCM_I_WVECT_TYPE (X) == 1)
51#define SCM_IS_WHVEC_V(X) (SCM_I_WVECT_TYPE (X) == 2)
52#define SCM_IS_WHVEC_B(X) (SCM_I_WVECT_TYPE (X) == 3)
53#define SCM_IS_WHVEC_ANY(X) (SCM_I_WVECT_TYPE (X) != 0)
56a68067 54
0f2d19dd 55\f
986ec822
LC
56/* Weak pairs. */
57
58SCM_API SCM scm_weak_car_pair (SCM car, SCM cdr);
59SCM_API SCM scm_weak_cdr_pair (SCM car, SCM cdr);
60SCM_API SCM scm_doubly_weak_pair (SCM car, SCM cdr);
61
62/* Testing the weak component(s) of a cell for reachability. */
63#define SCM_WEAK_PAIR_WORD_DELETED_P(_cell, _word) \
64 (SCM_CELL_OBJECT ((_cell), (_word)) == SCM_PACK (NULL))
65#define SCM_WEAK_PAIR_CAR_DELETED_P(_cell) \
66 (SCM_WEAK_PAIR_WORD_DELETED_P ((_cell), 0))
67#define SCM_WEAK_PAIR_CDR_DELETED_P(_cell) \
68 (SCM_WEAK_PAIR_WORD_DELETED_P ((_cell), 1))
69
70#define SCM_WEAK_PAIR_DELETED_P(_cell) \
71 ((SCM_WEAK_PAIR_CAR_DELETED_P (_cell)) \
72 || (SCM_WEAK_PAIR_CDR_DELETED_P (_cell)))
73
aef9e3bd
LC
74/* Accessing the components of a weak cell. These return `SCM_UNDEFINED' if
75 the car/cdr has been collected. */
986ec822 76#define SCM_WEAK_PAIR_WORD(_cell, _word) \
aef9e3bd
LC
77 (SCM_WEAK_PAIR_WORD_DELETED_P ((_cell), (_word)) \
78 ? SCM_UNDEFINED \
79 : SCM_CELL_OBJECT ((_cell), (_word)))
986ec822
LC
80#define SCM_WEAK_PAIR_CAR(_cell) (SCM_WEAK_PAIR_WORD ((_cell), 0))
81#define SCM_WEAK_PAIR_CDR(_cell) (SCM_WEAK_PAIR_WORD ((_cell), 1))
82
83
84\f
85/* Weak vectors and weak hash tables. */
0f2d19dd 86
33b001fd
MV
87SCM_API SCM scm_make_weak_vector (SCM k, SCM fill);
88SCM_API SCM scm_weak_vector (SCM l);
89SCM_API SCM scm_weak_vector_p (SCM x);
c35738c1
MD
90SCM_API SCM scm_make_weak_key_alist_vector (SCM k);
91SCM_API SCM scm_make_weak_value_alist_vector (SCM k);
92SCM_API SCM scm_make_doubly_weak_alist_vector (SCM k);
93SCM_API SCM scm_weak_key_alist_vector_p (SCM x);
94SCM_API SCM scm_weak_value_alist_vector_p (SCM x);
95SCM_API SCM scm_doubly_weak_alist_vector_p (SCM x);
102dbb6f 96SCM_INTERNAL SCM scm_init_weaks_builtins (void);
6f03035f 97SCM_INTERNAL void scm_weaks_prehistory (void);
102dbb6f 98SCM_INTERNAL void scm_init_weaks (void);
0f2d19dd 99
102dbb6f
LC
100SCM_INTERNAL void scm_i_init_weak_vectors_for_gc (void);
101SCM_INTERNAL void scm_i_mark_weak_vector (SCM w);
102SCM_INTERNAL int scm_i_mark_weak_vectors_non_weaks (void);
103SCM_INTERNAL void scm_i_remove_weaks_from_weak_vectors (void);
06c1d900 104
5dbc6c06 105
592996c9 106#endif /* SCM_WEAKS_H */
89e00824
ML
107
108/*
109 Local Variables:
110 c-file-style: "gnu"
111 End:
112*/