X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/82892beda5c053715bc3ec7063af4a129f52c5f9..ddea3325ebe6c1453fa7969ae27bde1a3e4e5327:/libguile/arbiters.c diff --git a/libguile/arbiters.c b/libguile/arbiters.c index ab1b70386..a6d17ca80 100644 --- a/libguile/arbiters.c +++ b/libguile/arbiters.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996, 1997, 2000, 2001 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,13 +38,16 @@ * If you write modifications of your own for GUILE, it is your choice * whether to permit this exception to apply to your modifications. * If you do not wish that, delete this exception notice. */ + + -#include -#include "_scm.h" -#include "smob.h" +#include "libguile/_scm.h" +#include "libguile/ports.h" +#include "libguile/smob.h" -#include "arbiters.h" +#include "libguile/validate.h" +#include "libguile/arbiters.h" /* {Arbiters} @@ -54,82 +57,85 @@ * SCM_DEFER_INTS). */ -static long scm_tc16_arbiter; +static scm_t_bits scm_tc16_arbiter; + +#define SCM_ARB_LOCKED(arb) ((SCM_CELL_WORD_0 (arb)) & (1L << 16)) +#define SCM_LOCK_ARB(arb) (SCM_SET_CELL_WORD_0 ((arb), scm_tc16_arbiter | (1L << 16))); +#define SCM_UNLOCK_ARB(arb) (SCM_SET_CELL_WORD_0 ((arb), scm_tc16_arbiter)); static int -prinarb (exp, port, pstate) - SCM exp; - SCM port; - scm_print_state *pstate; +arbiter_print (SCM exp, SCM port, scm_print_state *pstate) { - scm_gen_puts (scm_regular_string, "#', port); + scm_puts ("#', port); return !0; } -static scm_smobfuns arbsmob = -{ - scm_markcdr, scm_free0, prinarb, 0 -}; - -SCM_PROC(s_make_arbiter, "make-arbiter", 1, 0, 0, scm_make_arbiter); - -SCM -scm_make_arbiter (name) - SCM name; +SCM_DEFINE (scm_make_arbiter, "make-arbiter", 1, 0, 0, + (SCM name), + "Return an object of type arbiter and name @var{name}. Its\n" + "state is initially unlocked. Arbiters are a way to achieve\n" + "process synchronization.") +#define FUNC_NAME s_scm_make_arbiter { - register SCM z; - SCM_NEWCELL (z); - SCM_DEFER_INTS; - SCM_SETCDR (z, name); - SCM_SETCAR (z, scm_tc16_arbiter); - SCM_ALLOW_INTS; - return z; + SCM_RETURN_NEWSMOB (scm_tc16_arbiter, SCM_UNPACK (name)); } +#undef FUNC_NAME -SCM_PROC(s_try_arbiter, "try-arbiter", 1, 0, 0, scm_try_arbiter); - -SCM -scm_try_arbiter (arb) - SCM arb; +SCM_DEFINE (scm_try_arbiter, "try-arbiter", 1, 0, 0, + (SCM arb), + "Return @code{#t} and lock the arbiter @var{arb} if the arbiter\n" + "was unlocked. Otherwise, return @code{#f}.") +#define FUNC_NAME s_scm_try_arbiter { - SCM_ASSERT ((SCM_TYP16 (arb) == scm_tc16_arbiter), arb, SCM_ARG1, s_try_arbiter); + SCM_VALIDATE_SMOB (1, arb, arbiter); SCM_DEFER_INTS; - if (SCM_CAR (arb) & (1L << 16)) + if (SCM_ARB_LOCKED(arb)) arb = SCM_BOOL_F; else { - SCM_SETCAR (arb, scm_tc16_arbiter | (1L << 16)); + SCM_LOCK_ARB(arb); arb = SCM_BOOL_T; } SCM_ALLOW_INTS; return arb; } +#undef FUNC_NAME -SCM_PROC(s_release_arbiter, "release-arbiter", 1, 0, 0, scm_release_arbiter); - -SCM -scm_release_arbiter (arb) - SCM arb; +SCM_DEFINE (scm_release_arbiter, "release-arbiter", 1, 0, 0, + (SCM arb), + "Return @code{#t} and unlock the arbiter @var{arb} if the\n" + "arbiter was locked. Otherwise, return @code{#f}.") +#define FUNC_NAME s_scm_release_arbiter { - SCM_ASSERT ((SCM_TYP16 (arb) == scm_tc16_arbiter), arb, SCM_ARG1, s_release_arbiter); - if (!(SCM_CAR (arb) & (1L << 16))) + SCM_VALIDATE_SMOB (1, arb, arbiter); + if (!SCM_ARB_LOCKED(arb)) return SCM_BOOL_F; - SCM_SETCAR (arb, scm_tc16_arbiter); + SCM_UNLOCK_ARB (arb); return SCM_BOOL_T; } +#undef FUNC_NAME void scm_init_arbiters () { - scm_tc16_arbiter = scm_newsmob (&arbsmob); -#include "arbiters.x" + scm_tc16_arbiter = scm_make_smob_type ("arbiter", 0); + scm_set_smob_mark (scm_tc16_arbiter, scm_markcdr); + scm_set_smob_print (scm_tc16_arbiter, arbiter_print); +#ifndef SCM_MAGIC_SNARFER +#include "libguile/arbiters.x" +#endif } +/* + Local Variables: + c-file-style: "gnu" + End: +*/