* socket.c: Added declaration of inet_aton to avoid compiler
[bpt/guile.git] / libguile / arbiters.c
CommitLineData
0f2d19dd
JB
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
54static long scm_tc16_arbiter;
55
56#ifdef __STDC__
57static int
58prinarb (SCM exp, SCM port, int writing)
59#else
60static int
61prinarb (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
75static scm_smobfuns arbsmob =
76{
77 scm_markcdr, scm_free0, prinarb, 0
78};
79
80SCM_PROC(s_make_arbiter, "make-arbiter", 1, 0, 0, scm_make_arbiter);
81#ifdef __STDC__
82SCM
83scm_make_arbiter (SCM name)
84#else
85SCM
86scm_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
97SCM_PROC(s_try_arbiter, "try-arbiter", 1, 0, 0, scm_try_arbiter);
98#ifdef __STDC__
99SCM
100scm_try_arbiter (SCM arb)
101#else
102SCM
103scm_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
121SCM_PROC(s_release_arbiter, "release-arbiter", 1, 0, 0, scm_release_arbiter);
122#ifdef __STDC__
123SCM
124scm_release_arbiter (SCM arb)
125#else
126SCM
127scm_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__
140void
141scm_init_arbiters (void)
142#else
143void
144scm_init_arbiters ()
145#endif
146{
147 scm_tc16_arbiter = scm_newsmob (&arbsmob);
148#include "arbiters.x"
149}
150