mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	The function sem_close is AC-unsafe because lll_lock* leaks a lock (aculock) and not because of twalk.
		
			
				
	
	
		
			117 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| @node Inter-Process Communication, Job Control, Processes, Top
 | |
| @c %MENU% All about inter-process communication
 | |
| @chapter Inter-Process Communication
 | |
| @cindex ipc
 | |
| 
 | |
| This chapter describes the @glibcadj{} inter-process communication primitives.
 | |
| 
 | |
| @menu
 | |
| * Semaphores::	Support for creating and managing semaphores
 | |
| @end menu
 | |
| 
 | |
| @node Semaphores
 | |
| @section Semaphores
 | |
| 
 | |
| @Theglibc{} implements the semaphore APIs as defined in POSIX and
 | |
| System V.  Semaphores can be used by multiple processes to coordinate shared
 | |
| resources.  The following is a complete list of the semaphore functions provided
 | |
| by @theglibc{}.
 | |
| 
 | |
| @c Need descriptions for all of these functions.
 | |
| 
 | |
| @subsection System V Semaphores
 | |
| @deftypefun int semctl (int @var{semid}, int @var{semnum}, int @var{cmd});
 | |
| @safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{/linux}}}
 | |
| @c syscall(ipc) ok
 | |
| @c
 | |
| @c AC-unsafe because we need to translate the new kernel
 | |
| @c semid_ds buf into the userspace layout.  Cancellation
 | |
| @c at that point results in an inconsistent userspace
 | |
| @c semid_ds.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int semget (key_t @var{key}, int @var{nsems}, int @var{semflg});
 | |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 | |
| @c syscall(ipc) ok
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int semop (int @var{semid}, struct sembuf *@var{sops}, size_t @var{nsops});
 | |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 | |
| @c syscall(ipc) ok
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int semtimedop (int @var{semid}, struct sembuf *@var{sops}, size_t @var{nsops}, const struct timespec *@var{timeout});
 | |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 | |
| @c syscall(ipc) ok
 | |
| @end deftypefun
 | |
| 
 | |
| @subsection POSIX Semaphores
 | |
| 
 | |
| @deftypefun int sem_init (sem_t *@var{sem}, int @var{pshared}, unsigned int @var{value});
 | |
| @safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
 | |
| @c Does not atomically update sem_t therefore AC-unsafe
 | |
| @c because it can leave sem_t partially initialized.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int sem_destroy (sem_t *@var{sem});
 | |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 | |
| @c Function does nothing and is therefore always safe.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun sem_t *sem_open (const char *@var{name}, int @var{oflag}, ...);
 | |
| @safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acuinit{}}}
 | |
| @c pthread_once asuinit
 | |
| @c
 | |
| @c We are AC-Unsafe becuase we use pthread_once to initialize
 | |
| @c a global variable that holds the location of the mounted
 | |
| @c shmfs on Linux.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int sem_close (sem_t *@var{sem});
 | |
| @safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
 | |
| @c lll_lock asulock aculock
 | |
| @c twalk mtsrace{:root}
 | |
| @c
 | |
| @c We are AS-unsafe because we take a non-recursive lock.
 | |
| @c We are AC-unsafe because several internal data structures
 | |
| @c are not updated atomically.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int sem_unlink (const char *@var{name});
 | |
| @safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acucorrupt{}}}
 | |
| @c pthread_once asuinit acucorrupt aculock
 | |
| @c mempcpy acucorrupt
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int sem_wait (sem_t *@var{sem});
 | |
| @safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
 | |
| @c atomic_increment (nwaiters) acucorrupt
 | |
| @c
 | |
| @c Given the use atomic operations this function seems
 | |
| @c to be AS-safe.  It is AC-unsafe because there is still
 | |
| @c a window between atomic_decrement and the pthread_push
 | |
| @c of the handler that undoes that operation.  A cancellation
 | |
| @c at that point would fail to remove the process from the
 | |
| @c waiters count.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int sem_timedwait (sem_t *@var{sem}, const struct timespec *@var{abstime});
 | |
| @safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
 | |
| @c Same safety issues as sem_wait.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int sem_trywait (sem_t *@var{sem});
 | |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 | |
| @c All atomic operations are safe in all contexts.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int sem_post (sem_t *@var{sem});
 | |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 | |
| @c Same safety as sem_trywait.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int sem_getvalue (sem_t *@var{sem}, int *@var{sval});
 | |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 | |
| @c Atomic write of a value is safe in all contexts.
 | |
| @end deftypefun
 |