1 /* sem_trywait -- wait on a semaphore. SPARC version. 2 Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. 5 6 The GNU C Library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2.1 of the License, or (at your option) any later version. 10 11 The GNU C Library is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with the GNU C Library; if not, see 18 <http://www.gnu.org/licenses/>. */ 19 20 #include <errno.h> 21 #include <sysdep.h> 22 #include <lowlevellock.h> 23 #include <internaltypes.h> 24 #include <semaphore.h> 25 26 27 int sem_trywait(sem_t * sem)28sem_trywait (sem_t *sem) 29 { 30 struct sparc_old_sem *isem = (struct sparc_old_sem *) sem; 31 int val; 32 33 if (isem->value > 0) 34 { 35 if (__atomic_is_v9) 36 val = atomic_decrement_if_positive (&isem->value); 37 else 38 { 39 __sparc32_atomic_do_lock24 (&isem->lock); 40 val = isem->value; 41 if (val > 0) 42 isem->value = val - 1; 43 __sparc32_atomic_do_unlock24 (&isem->lock); 44 } 45 if (val > 0) 46 return 0; 47 } 48 49 __set_errno (EAGAIN); 50 return -1; 51 } 52