mirror of
				https://gitlab.com/sortix/sortix.git
				synced 2023-02-13 20:55:38 -05:00 
			
		
		
		
	Add pthread_mutex_trylock(3).
This commit is contained in:
		
							parent
							
								
									23d05cba97
								
							
						
					
					
						commit
						65ed6a208c
					
				
					 3 changed files with 45 additions and 1 deletions
				
			
		| 
						 | 
					@ -14,6 +14,7 @@ OBJS=\
 | 
				
			||||||
pthread_equal.o \
 | 
					pthread_equal.o \
 | 
				
			||||||
pthread_initialize.o \
 | 
					pthread_initialize.o \
 | 
				
			||||||
pthread_mutex_lock.o \
 | 
					pthread_mutex_lock.o \
 | 
				
			||||||
 | 
					pthread_mutex_trylock.o \
 | 
				
			||||||
pthread_mutex_unlock.o \
 | 
					pthread_mutex_unlock.o \
 | 
				
			||||||
pthread_self.o \
 | 
					pthread_self.o \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -210,7 +210,7 @@ int pthread_equal(pthread_t, pthread_t);
 | 
				
			||||||
int pthread_mutex_lock(pthread_mutex_t*);
 | 
					int pthread_mutex_lock(pthread_mutex_t*);
 | 
				
			||||||
/* TODO: pthread_mutex_setprioceiling */
 | 
					/* TODO: pthread_mutex_setprioceiling */
 | 
				
			||||||
/* TODO: pthread_mutex_timedlock */
 | 
					/* TODO: pthread_mutex_timedlock */
 | 
				
			||||||
/* TODO: pthread_mutex_trylock */
 | 
					int pthread_mutex_trylock(pthread_mutex_t*);
 | 
				
			||||||
int pthread_mutex_unlock(pthread_mutex_t*);
 | 
					int pthread_mutex_unlock(pthread_mutex_t*);
 | 
				
			||||||
/* TODO: pthread_mutexattr_destroy */
 | 
					/* TODO: pthread_mutexattr_destroy */
 | 
				
			||||||
/* TODO: pthread_mutexattr_getprioceiling */
 | 
					/* TODO: pthread_mutexattr_getprioceiling */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										43
									
								
								libpthread/pthread_mutex_trylock.c++
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								libpthread/pthread_mutex_trylock.c++
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,43 @@
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Copyright(C) Jonas 'Sortie' Termansen 2013, 2014.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This file is part of Sortix libpthread.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Sortix libpthread is free software: you can redistribute it and/or modify it
 | 
				
			||||||
 | 
					    under the terms of the GNU Lesser General Public License as published by the
 | 
				
			||||||
 | 
					    Free Software Foundation, either version 3 of the License, or (at your
 | 
				
			||||||
 | 
					    option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Sortix libpthread is distributed in the hope that it will be useful, but
 | 
				
			||||||
 | 
					    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 | 
				
			||||||
 | 
					    or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
 | 
				
			||||||
 | 
					    License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You should have received a copy of the GNU Lesser General Public License
 | 
				
			||||||
 | 
					    along with Sortix libpthread. If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pthread_mutex_trylock.c++
 | 
				
			||||||
 | 
					    Attempts to lock a mutex.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <pthread.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const unsigned long UNLOCKED_VALUE = 0;
 | 
				
			||||||
 | 
					static const unsigned long LOCKED_VALUE = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern "C" int pthread_mutex_trylock(pthread_mutex_t* mutex)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if ( !__sync_bool_compare_and_swap(&mutex->lock, UNLOCKED_VALUE, LOCKED_VALUE) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( mutex->type == PTHREAD_MUTEX_RECURSIVE &&
 | 
				
			||||||
 | 
							     (pthread_t) mutex->owner == pthread_self() )
 | 
				
			||||||
 | 
									return mutex->recursion++, 0;
 | 
				
			||||||
 | 
							return errno = EBUSY;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						mutex->owner = (unsigned long) pthread_self();
 | 
				
			||||||
 | 
						mutex->recursion = 0;
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue