11.5Smsaitoh/* $NetBSD: lock.h,v 1.5 2017/10/23 06:43:00 msaitoh Exp $ */
21.1Sjmcneill
31.1Sjmcneill/*-
41.1Sjmcneill * Copyright (c) 2007 Jared D. McNeill <jmcneill@invisible.ca>
51.1Sjmcneill * All rights reserved.
61.1Sjmcneill *
71.1Sjmcneill * Redistribution and use in source and binary forms, with or without
81.1Sjmcneill * modification, are permitted provided that the following conditions
91.1Sjmcneill * are met:
101.1Sjmcneill * 1. Redistributions of source code must retain the above copyright
111.1Sjmcneill *    notice, this list of conditions and the following disclaimer.
121.1Sjmcneill * 2. Redistributions in binary form must reproduce the above copyright
131.1Sjmcneill *    notice, this list of conditions and the following disclaimer in the
141.1Sjmcneill *    documentation and/or other materials provided with the distribution.
151.1Sjmcneill *
161.1Sjmcneill * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
171.1Sjmcneill * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
181.1Sjmcneill * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
191.1Sjmcneill * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
201.1Sjmcneill * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
211.1Sjmcneill * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
221.1Sjmcneill * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
231.1Sjmcneill * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
241.1Sjmcneill * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
251.1Sjmcneill * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
261.1Sjmcneill * POSSIBILITY OF SUCH DAMAGE.
271.1Sjmcneill */
281.1Sjmcneill
291.1Sjmcneill#ifndef _ARCH_USERMODE_INCLUDE_LOCK_H
301.1Sjmcneill#define _ARCH_USERMODE_INCLUDE_LOCK_H
311.1Sjmcneill
321.1Sjmcneill__inline static void
331.5Smsaitoh__cpu_simple_lock_init(__cpu_simple_lock_t *lockp)
341.1Sjmcneill{
351.3Sjmcneill	*lockp = __SIMPLELOCK_UNLOCKED;
361.3Sjmcneill}
371.3Sjmcneill
381.3Sjmcneill__inline static int
391.5Smsaitoh__cpu_simple_lock_try(__cpu_simple_lock_t *lockp)
401.3Sjmcneill{
411.3Sjmcneill	if (*lockp == __SIMPLELOCK_LOCKED)
421.3Sjmcneill		return 0;
431.3Sjmcneill	*lockp = __SIMPLELOCK_LOCKED;
441.3Sjmcneill	return 1;
451.1Sjmcneill}
461.1Sjmcneill
471.1Sjmcneill__inline static void
481.1Sjmcneill__cpu_simple_lock(__cpu_simple_lock_t *lockp)
491.1Sjmcneill{
501.3Sjmcneill	while (!__cpu_simple_lock_try(lockp))
511.3Sjmcneill		;
521.1Sjmcneill}
531.1Sjmcneill
541.1Sjmcneill__inline static void
551.1Sjmcneill__cpu_simple_unlock(__cpu_simple_lock_t *lockp)
561.1Sjmcneill{
571.3Sjmcneill	*lockp = __SIMPLELOCK_UNLOCKED;
581.1Sjmcneill}
591.1Sjmcneill
601.1Sjmcneill__inline static int
611.5Smsaitoh__SIMPLELOCK_LOCKED_P(const __cpu_simple_lock_t *lockp)
621.1Sjmcneill{
631.1Sjmcneill	return *lockp == __SIMPLELOCK_LOCKED;
641.1Sjmcneill}
651.1Sjmcneill
661.1Sjmcneill__inline static int
671.5Smsaitoh__SIMPLELOCK_UNLOCKED_P(const __cpu_simple_lock_t *lockp)
681.1Sjmcneill{
691.1Sjmcneill	return *lockp == __SIMPLELOCK_UNLOCKED;
701.1Sjmcneill}
711.1Sjmcneill
721.1Sjmcneill#endif /* !_ARCH_USERMODE_INCLUDE_LOCK_H */
73