From 8d3549ebb0d72fdce64595ca1c7a02e3b6bfefd1 Mon Sep 17 00:00:00 2001 From: yamt Date: Sat, 29 Oct 2005 11:13:21 +0000 Subject: [PATCH] add something like pthread_once(). --- sys/kern/subr_once.c | 58 ++++++++++++++++++++++++++++++++++++++++++++ sys/sys/once.h | 56 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 sys/kern/subr_once.c create mode 100644 sys/sys/once.h diff --git a/sys/kern/subr_once.c b/sys/kern/subr_once.c new file mode 100644 index 000000000000..09c2ff8d2fd1 --- /dev/null +++ b/sys/kern/subr_once.c @@ -0,0 +1,58 @@ +/* $NetBSD: subr_once.c,v 1.1 2005/10/29 11:13:21 yamt Exp $ */ + +/*- + * Copyright (c)2005 YAMAMOTO Takashi, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__KERNEL_RCSID(0, "$NetBSD: subr_once.c,v 1.1 2005/10/29 11:13:21 yamt Exp $"); + +#include +#include +#include +#include + +void +_run_once(once_t *o, void (*fn)(void)) +{ + + simple_lock(&o->o_lock); + while ((o->o_flags & ONCE_RUNNING) != 0) { + ltsleep(o, PUSER, "runonce", 0, &o->o_lock); + } + if (o->o_flags & ONCE_DONE) { + goto done; + } + o->o_flags |= ONCE_RUNNING; + simple_unlock(&o->o_lock); + + (*fn)(); + + simple_lock(&o->o_lock); + o->o_flags = ONCE_DONE; + wakeup(o); +done: + simple_unlock(&o->o_lock); +} diff --git a/sys/sys/once.h b/sys/sys/once.h new file mode 100644 index 000000000000..a4f71790b5df --- /dev/null +++ b/sys/sys/once.h @@ -0,0 +1,56 @@ +/* $NetBSD: once.h,v 1.1 2005/10/29 11:13:21 yamt Exp $ */ + +/*- + * Copyright (c)2005 YAMAMOTO Takashi, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if !defined(_SYS_ONCE_H_) +#define _SYS_ONCE_H_ + +#include + +typedef struct { + struct simplelock o_lock; + int o_flags; +#define ONCE_RUNNING 1 +#define ONCE_DONE 2 +} once_t; + +void _run_once(once_t *, void (*)(void)); + +#define ONCE_DECL(o) \ + once_t (o) = { \ + .o_lock = SIMPLELOCK_INITIALIZER, \ + .o_flags = 0, \ + }; + +#define RUN_ONCE(o, fn) \ + do { \ + if (__predict_false(((o)->o_flags & ONCE_DONE) == 0)) { \ + _run_once((o), (fn)); \ + } \ + } while (0 /* CONSTCOND */) + +#endif /* !defined(_SYS_ONCE_H_) */