1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2012 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                 Glenn Fowler <gsf@research.att.com>                  *
18da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
19da2e3ebdSchin *                   Phong Vo <kpv@research.att.com>                    *
20da2e3ebdSchin *                                                                      *
21da2e3ebdSchin ***********************************************************************/
22da2e3ebdSchin #pragma prototyped
23da2e3ebdSchin 
24*b30d1939SAndy Fiddaman #include <aso.h>
25da2e3ebdSchin 
26da2e3ebdSchin int
asolock(unsigned int volatile * lock,unsigned int key,int type)27*b30d1939SAndy Fiddaman asolock(unsigned int volatile* lock, unsigned int key, int type)
28da2e3ebdSchin {
29*b30d1939SAndy Fiddaman 	unsigned int	k;
30da2e3ebdSchin 
31*b30d1939SAndy Fiddaman 	if (key)
32*b30d1939SAndy Fiddaman 		switch (type)
33*b30d1939SAndy Fiddaman 		{
34*b30d1939SAndy Fiddaman 		case ASO_UNLOCK:
35*b30d1939SAndy Fiddaman 			if (*lock != 0)
36*b30d1939SAndy Fiddaman 			{
37*b30d1939SAndy Fiddaman 				if (*lock != key)
38*b30d1939SAndy Fiddaman 					return -1;
39*b30d1939SAndy Fiddaman 				*lock = 0;
40*b30d1939SAndy Fiddaman 			}
41*b30d1939SAndy Fiddaman 			return 0;
42*b30d1939SAndy Fiddaman 		case ASO_TRYLOCK:
43*b30d1939SAndy Fiddaman 			if (*lock != key)
44*b30d1939SAndy Fiddaman 			{
45*b30d1939SAndy Fiddaman 				if (*lock != 0)
46*b30d1939SAndy Fiddaman 					return -1;
47*b30d1939SAndy Fiddaman 				*lock = key;
48*b30d1939SAndy Fiddaman 			}
4934f9b3eeSRoland Mainz 			return 0;
50*b30d1939SAndy Fiddaman 		case ASO_LOCK:
51*b30d1939SAndy Fiddaman 		case ASO_SPINLOCK:
52*b30d1939SAndy Fiddaman 			*lock = key;
5334f9b3eeSRoland Mainz 			return 0;
54*b30d1939SAndy Fiddaman 		}
55*b30d1939SAndy Fiddaman 	return -1;
56da2e3ebdSchin }
57