maintainer changed: was lord, now jimb; first import
[bpt/guile.git] / libguile / arbiters.c
1 /* Copyright (C) 1995,1996 Free Software Foundation, Inc.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2, or (at your option)
6 * any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; see the file COPYING. If not, write to
15 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
16 *
17 * As a special exception, the Free Software Foundation gives permission
18 * for additional uses of the text contained in its release of GUILE.
19 *
20 * The exception is that, if you link the GUILE library with other files
21 * to produce an executable, this does not by itself cause the
22 * resulting executable to be covered by the GNU General Public License.
23 * Your use of that executable is in no way restricted on account of
24 * linking the GUILE library code into it.
25 *
26 * This exception does not however invalidate any other reasons why
27 * the executable file might be covered by the GNU General Public License.
28 *
29 * This exception applies only to the code released by the
30 * Free Software Foundation under the name GUILE. If you copy
31 * code from other Free Software Foundation releases into a copy of
32 * GUILE, as the General Public License permits, the exception does
33 * not apply to the code that you add in this way. To avoid misleading
34 * anyone as to the status of such modified files, you must delete
35 * this exception notice from them.
36 *
37 * If you write modifications of your own for GUILE, it is your choice
38 * whether to permit this exception to apply to your modifications.
39 * If you do not wish that, delete this exception notice.
40 */
41 \f
42
43 #include <stdio.h>
44 #include "_scm.h"
45
46 \f
47 /* {Arbiters}
48 *
49 * These procedures implement synchronization primitives. Processors
50 * with an atomic test-and-set instruction can use it here (and not
51 * SCM_DEFER_INTS).
52 */
53
54 static long scm_tc16_arbiter;
55
56 #ifdef __STDC__
57 static int
58 prinarb (SCM exp, SCM port, int writing)
59 #else
60 static int
61 prinarb (exp, port, writing)
62 SCM exp;
63 SCM port;
64 int writing;
65 #endif
66 {
67 scm_gen_puts (scm_regular_string, "#<arbiter ", port);
68 if (SCM_CAR (exp) & (1L << 16))
69 scm_gen_puts (scm_regular_string, "locked ", port);
70 scm_iprin1 (SCM_CDR (exp), port, writing);
71 scm_gen_putc ('>', port);
72 return !0;
73 }
74
75 static scm_smobfuns arbsmob =
76 {
77 scm_markcdr, scm_free0, prinarb, 0
78 };
79
80 SCM_PROC(s_make_arbiter, "make-arbiter", 1, 0, 0, scm_make_arbiter);
81 #ifdef __STDC__
82 SCM
83 scm_make_arbiter (SCM name)
84 #else
85 SCM
86 scm_make_arbiter (name)
87 SCM name;
88 #endif
89 {
90 register SCM z;
91 SCM_NEWCELL (z);
92 SCM_CDR (z) = name;
93 SCM_CAR (z) = scm_tc16_arbiter;
94 return z;
95 }
96
97 SCM_PROC(s_try_arbiter, "try-arbiter", 1, 0, 0, scm_try_arbiter);
98 #ifdef __STDC__
99 SCM
100 scm_try_arbiter (SCM arb)
101 #else
102 SCM
103 scm_try_arbiter (arb)
104 SCM arb;
105 #endif
106 {
107 SCM_ASSERT ((SCM_TYP16 (arb) == scm_tc16_arbiter), arb, SCM_ARG1, s_try_arbiter);
108 SCM_DEFER_INTS;
109 if (SCM_CAR (arb) & (1L << 16))
110 arb = SCM_BOOL_F;
111 else
112 {
113 SCM_CAR (arb) = scm_tc16_arbiter | (1L << 16);
114 arb = SCM_BOOL_T;
115 }
116 SCM_ALLOW_INTS;
117 return arb;
118 }
119
120
121 SCM_PROC(s_release_arbiter, "release-arbiter", 1, 0, 0, scm_release_arbiter);
122 #ifdef __STDC__
123 SCM
124 scm_release_arbiter (SCM arb)
125 #else
126 SCM
127 scm_release_arbiter (arb)
128 SCM arb;
129 #endif
130 {
131 SCM_ASSERT ((SCM_TYP16 (arb) == scm_tc16_arbiter), arb, SCM_ARG1, s_release_arbiter);
132 if (!(SCM_CAR (arb) & (1L << 16)))
133 return SCM_BOOL_F;
134 SCM_CAR (arb) = scm_tc16_arbiter;
135 return SCM_BOOL_T;
136 }
137
138
139 #ifdef __STDC__
140 void
141 scm_init_arbiters (void)
142 #else
143 void
144 scm_init_arbiters ()
145 #endif
146 {
147 scm_tc16_arbiter = scm_newsmob (&arbsmob);
148 #include "arbiters.x"
149 }
150