[799c767] | 1 | /* |
---|
| 2 | * $Id$ |
---|
| 3 | */ |
---|
| 4 | |
---|
[f42b726] | 5 | #if HAVE_CONFIG_H |
---|
| 6 | #include "config.h" |
---|
| 7 | #endif |
---|
| 8 | |
---|
[799c767] | 9 | #include <stdarg.h> |
---|
| 10 | |
---|
| 11 | #include <errno.h> |
---|
| 12 | #include <fcntl.h> |
---|
| 13 | #include <pthread.h> |
---|
| 14 | #include <semaphore.h> |
---|
| 15 | #include <limits.h> |
---|
| 16 | |
---|
| 17 | #include <rtems/system.h> |
---|
| 18 | #include <rtems/score/object.h> |
---|
| 19 | #include <rtems/posix/semaphore.h> |
---|
| 20 | #include <rtems/posix/time.h> |
---|
[188c82b] | 21 | #include <rtems/seterr.h> |
---|
[799c767] | 22 | |
---|
| 23 | /*PAGE |
---|
[cb3c1718] | 24 | * |
---|
| 25 | * sem_unlink |
---|
| 26 | * |
---|
| 27 | * Unlinks a named semaphore, sem_close must also be called to remove |
---|
| 28 | * the semaphore. |
---|
[799c767] | 29 | * |
---|
| 30 | * 11.2.5 Remove a Named Semaphore, P1003.1b-1993, p.225 |
---|
| 31 | */ |
---|
| 32 | |
---|
| 33 | int sem_unlink( |
---|
| 34 | const char *name |
---|
| 35 | ) |
---|
| 36 | { |
---|
| 37 | int status; |
---|
| 38 | register POSIX_Semaphore_Control *the_semaphore; |
---|
[32ba727] | 39 | sem_t the_semaphore_id; |
---|
[799c767] | 40 | |
---|
[cb3c1718] | 41 | _Thread_Disable_dispatch(); |
---|
| 42 | |
---|
[799c767] | 43 | status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id ); |
---|
[cb3c1718] | 44 | if ( status != 0 ) { |
---|
| 45 | _Thread_Enable_dispatch(); |
---|
[e180a77e] | 46 | rtems_set_errno_and_return_minus_one( status ); |
---|
[cb3c1718] | 47 | } |
---|
[799c767] | 48 | |
---|
[cb3c1718] | 49 | /* |
---|
| 50 | * Don't support unlinking a remote semaphore. |
---|
| 51 | */ |
---|
[799c767] | 52 | |
---|
[35ee867] | 53 | if ( !_Objects_Is_local_id((Objects_Id)the_semaphore_id) ) { |
---|
[cb3c1718] | 54 | _Thread_Enable_dispatch(); |
---|
[e180a77e] | 55 | rtems_set_errno_and_return_minus_one( ENOSYS ); |
---|
[cb3c1718] | 56 | } |
---|
| 57 | |
---|
[64f55e7] | 58 | the_semaphore = (POSIX_Semaphore_Control *) _Objects_Get_local_object( |
---|
[cb3c1718] | 59 | &_POSIX_Semaphore_Information, |
---|
| 60 | _Objects_Get_index( the_semaphore_id ) |
---|
| 61 | ); |
---|
| 62 | |
---|
[799c767] | 63 | #if defined(RTEMS_MULTIPROCESSING) |
---|
[cb3c1718] | 64 | if ( the_semaphore->process_shared == PTHREAD_PROCESS_SHARED ) { |
---|
| 65 | _Objects_MP_Close( &_POSIX_Semaphore_Information, the_semaphore_id ); |
---|
| 66 | } |
---|
[799c767] | 67 | #endif |
---|
| 68 | |
---|
[cb3c1718] | 69 | the_semaphore->linked = FALSE; |
---|
| 70 | _POSIX_Semaphore_Namespace_remove( the_semaphore ); |
---|
| 71 | _POSIX_Semaphore_Delete( the_semaphore ); |
---|
[799c767] | 72 | |
---|
[cb3c1718] | 73 | _Thread_Enable_dispatch(); |
---|
| 74 | return 0; |
---|
[799c767] | 75 | } |
---|