xref: /dflybsd-src/lib/libc/sysvipc/sysvipc_lock_generic.h (revision ff86f40163b90743b832c47e55fc6ca83aa45121)
182657471SMarkus Pfeiffer /*-
282657471SMarkus Pfeiffer  * Copyright (c) 2003 David Xu <davidxu@freebsd.org>
382657471SMarkus Pfeiffer  * All rights reserved.
482657471SMarkus Pfeiffer  *
582657471SMarkus Pfeiffer  * Redistribution and use in source and binary forms, with or without
682657471SMarkus Pfeiffer  * modification, are permitted provided that the following conditions
782657471SMarkus Pfeiffer  * are met:
882657471SMarkus Pfeiffer  * 1. Redistributions of source code must retain the above copyright
982657471SMarkus Pfeiffer  *    notice, this list of conditions and the following disclaimer.
1082657471SMarkus Pfeiffer  * 2. Redistributions in binary form must reproduce the above copyright
1182657471SMarkus Pfeiffer  *    notice, this list of conditions and the following disclaimer in the
1282657471SMarkus Pfeiffer  *    documentation and/or other materials provided with the distribution.
1382657471SMarkus Pfeiffer  *
1482657471SMarkus Pfeiffer  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1582657471SMarkus Pfeiffer  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1682657471SMarkus Pfeiffer  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1782657471SMarkus Pfeiffer  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1882657471SMarkus Pfeiffer  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1982657471SMarkus Pfeiffer  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2082657471SMarkus Pfeiffer  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2182657471SMarkus Pfeiffer  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2282657471SMarkus Pfeiffer  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2382657471SMarkus Pfeiffer  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2482657471SMarkus Pfeiffer  * SUCH DAMAGE.
2582657471SMarkus Pfeiffer  */
2682657471SMarkus Pfeiffer 
27*ff86f401SSascha Wildner #ifndef _SYSVIPC_LOCK_GENERIC_H_
28*ff86f401SSascha Wildner #define _SYSVIPC_LOCK_GENERIC_H_
2982657471SMarkus Pfeiffer 
3082657471SMarkus Pfeiffer #include <unistd.h>
3182657471SMarkus Pfeiffer #include <machine/atomic.h>
3282657471SMarkus Pfeiffer 
3382657471SMarkus Pfeiffer #define SYSV_TIMEOUT		4000
3482657471SMarkus Pfeiffer 
3582657471SMarkus Pfeiffer typedef int umtx_t;
3682657471SMarkus Pfeiffer 
3782657471SMarkus Pfeiffer int	__sysv_umtx_lock(volatile umtx_t *mtx, int timo);
3882657471SMarkus Pfeiffer void	__sysv_umtx_unlock(volatile umtx_t *mtx);
3982657471SMarkus Pfeiffer 
4082657471SMarkus Pfeiffer static inline void
_sysv_umtx_init(volatile umtx_t * mtx)4182657471SMarkus Pfeiffer _sysv_umtx_init(volatile umtx_t *mtx)
4282657471SMarkus Pfeiffer {
4382657471SMarkus Pfeiffer     *mtx = 0;
4482657471SMarkus Pfeiffer }
4582657471SMarkus Pfeiffer 
4682657471SMarkus Pfeiffer static inline int
_sysv_umtx_lock(volatile umtx_t * mtx)4782657471SMarkus Pfeiffer _sysv_umtx_lock(volatile umtx_t *mtx)
4882657471SMarkus Pfeiffer {
4982657471SMarkus Pfeiffer     if (atomic_cmpset_acq_int(mtx, 0, 1))
5082657471SMarkus Pfeiffer 	return (0);
5182657471SMarkus Pfeiffer     return (__sysv_umtx_lock(mtx, 0));
5282657471SMarkus Pfeiffer }
5382657471SMarkus Pfeiffer 
5482657471SMarkus Pfeiffer static inline void
_sysv_umtx_unlock(volatile umtx_t * mtx)5582657471SMarkus Pfeiffer _sysv_umtx_unlock(volatile umtx_t *mtx)
5682657471SMarkus Pfeiffer {
5782657471SMarkus Pfeiffer     if (atomic_cmpset_acq_int(mtx, 1, 0))
5882657471SMarkus Pfeiffer 	return;
5982657471SMarkus Pfeiffer     __sysv_umtx_unlock(mtx);
6082657471SMarkus Pfeiffer }
6182657471SMarkus Pfeiffer 
62*ff86f401SSascha Wildner #endif /* !_SYSVIPC_LOCK_GENERIC_H_ */
63