Home | History | Annotate | Line # | Download | only in rumpkern
locks.c revision 1.2.2.3
      1 /*	$NetBSD: locks.c,v 1.2.2.3 2007/11/18 19:35:55 bouyer Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
      5  *
      6  * Development of this software was supported by the
      7  * Finnish Cultural Foundation.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
     19  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     21  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     24  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     28  * SUCH DAMAGE.
     29  */
     30 
     31 #include <sys/param.h>
     32 #include <sys/mutex.h>
     33 #include <sys/rwlock.h>
     34 
     35 #include "rump_private.h"
     36 
     37 #include "rumpuser.h"
     38 
     39 void
     40 mutex_init(kmutex_t *mtx, kmutex_type_t type, int ipl)
     41 {
     42 
     43 	rumpuser_mutex_init(&mtx->kmtx_mtx);
     44 }
     45 
     46 void
     47 mutex_destroy(kmutex_t *mtx)
     48 {
     49 
     50 	rumpuser_mutex_destroy(mtx->kmtx_mtx);
     51 }
     52 
     53 void
     54 mutex_enter(kmutex_t *mtx)
     55 {
     56 
     57 	rumpuser_mutex_enter(mtx->kmtx_mtx);
     58 }
     59 
     60 int
     61 mutex_tryenter(kmutex_t *mtx)
     62 {
     63 	int rv;
     64 
     65 	rv = rumpuser_mutex_tryenter(mtx->kmtx_mtx);
     66 	if (rv)
     67 		return 0;
     68 	else
     69 		return 1;
     70 }
     71 
     72 void
     73 mutex_exit(kmutex_t *mtx)
     74 {
     75 
     76 	rumpuser_mutex_exit(mtx->kmtx_mtx);
     77 }
     78 
     79 int
     80 mutex_owned(kmutex_t *mtx)
     81 {
     82 
     83 	/* XXX */
     84 	return 1;
     85 }
     86 
     87 /* reader/writer locks */
     88 
     89 void
     90 rw_init(krwlock_t *rw)
     91 {
     92 
     93 	rumpuser_rw_init(&rw->krw_pthlock);
     94 }
     95 
     96 void
     97 rw_destroy(krwlock_t *rw)
     98 {
     99 
    100 	rumpuser_rw_destroy(rw->krw_pthlock);
    101 }
    102 
    103 void
    104 rw_enter(krwlock_t *rw, const krw_t op)
    105 {
    106 
    107 	rumpuser_rw_enter(rw->krw_pthlock, op == RW_WRITER);
    108 }
    109 
    110 int
    111 rw_tryenter(krwlock_t *rw, const krw_t op)
    112 {
    113 
    114 	return rumpuser_rw_tryenter(rw->krw_pthlock, op == RW_WRITER);
    115 }
    116 
    117 void
    118 rw_exit(krwlock_t *rw)
    119 {
    120 
    121 	rumpuser_rw_exit(rw->krw_pthlock);
    122 }
    123 
    124 /* always fails */
    125 int
    126 rw_tryupgrade(krwlock_t *rw)
    127 {
    128 
    129 	return 0;
    130 }
    131 
    132 /* curriculum vitaes */
    133 
    134 /* forgive me for I have sinned */
    135 #define RUMPCV(a) ((struct rumpuser_cv *)(__UNCONST((a)->cv_wmesg)))
    136 
    137 void
    138 cv_init(kcondvar_t *cv, const char *msg)
    139 {
    140 
    141 	rumpuser_cv_init((struct rumpuser_cv **)__UNCONST(&cv->cv_wmesg));
    142 }
    143 
    144 void
    145 cv_destroy(kcondvar_t *cv)
    146 {
    147 
    148 	rumpuser_cv_destroy(RUMPCV(cv));
    149 }
    150 
    151 void
    152 cv_wait(kcondvar_t *cv, kmutex_t *mtx)
    153 {
    154 
    155 	rumpuser_cv_wait(RUMPCV(cv), mtx->kmtx_mtx);
    156 }
    157 
    158 int
    159 cv_timedwait(kcondvar_t *cv, kmutex_t *mtx, int ticks)
    160 {
    161 	extern int hz;
    162 
    163 	KASSERT(hz == 100);
    164 	return rumpuser_cv_timedwait(RUMPCV(cv), mtx->kmtx_mtx, ticks);
    165 }
    166 
    167 void
    168 cv_signal(kcondvar_t *cv)
    169 {
    170 
    171 	rumpuser_cv_signal(RUMPCV(cv));
    172 }
    173 
    174 /* kernel biglock, only for vnode_if */
    175 
    176 void
    177 _kernel_lock(int nlocks, struct lwp *l)
    178 {
    179 
    180 	KASSERT(nlocks == 1);
    181 	mutex_enter(&rump_giantlock);
    182 }
    183 
    184 void
    185 _kernel_unlock(int nlocks, struct lwp *l, int *countp)
    186 {
    187 
    188 	KASSERT(nlocks == 1);
    189 	mutex_exit(&rump_giantlock);
    190 	if (countp)
    191 		*countp = 1;
    192 }
    193