forked from Imagelibrary/rtems
+ Corrected enable/disable of dispatch.
+ Cleaned up code.
This commit is contained in:
@@ -17,6 +17,11 @@
|
|||||||
#include <rtems/posix/seterr.h>
|
#include <rtems/posix/seterr.h>
|
||||||
|
|
||||||
/*PAGE
|
/*PAGE
|
||||||
|
*
|
||||||
|
* sem_unlink
|
||||||
|
*
|
||||||
|
* Unlinks a named semaphore, sem_close must also be called to remove
|
||||||
|
* the semaphore.
|
||||||
*
|
*
|
||||||
* 11.2.5 Remove a Named Semaphore, P1003.1b-1993, p.225
|
* 11.2.5 Remove a Named Semaphore, P1003.1b-1993, p.225
|
||||||
*/
|
*/
|
||||||
@@ -30,35 +35,38 @@ int sem_unlink(
|
|||||||
Objects_Id the_semaphore_id;
|
Objects_Id the_semaphore_id;
|
||||||
Objects_Locations location;
|
Objects_Locations location;
|
||||||
|
|
||||||
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
|
_Thread_Disable_dispatch();
|
||||||
if ( status != 0 )
|
|
||||||
set_errno_and_return_minus_one( status );
|
|
||||||
|
|
||||||
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
|
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
|
||||||
switch ( location ) {
|
if ( status != 0 ) {
|
||||||
case OBJECTS_ERROR:
|
_Thread_Enable_dispatch();
|
||||||
set_errno_and_return_minus_one( EINVAL );
|
set_errno_and_return_minus_one( status );
|
||||||
case OBJECTS_REMOTE:
|
}
|
||||||
_Thread_Dispatch();
|
|
||||||
return POSIX_MP_NOT_IMPLEMENTED();
|
/*
|
||||||
set_errno_and_return_minus_one( EINVAL );
|
* Don't support unlinking a remote semaphore.
|
||||||
case OBJECTS_LOCAL:
|
*/
|
||||||
|
|
||||||
|
if ( !_Objects_Is_local_id(the_semaphore_id) ) {
|
||||||
|
_Thread_Enable_dispatch();
|
||||||
|
set_errno_and_return_minus_one( ENOSYS );
|
||||||
|
}
|
||||||
|
|
||||||
|
the_semaphore = _Objects_Get_local_object(
|
||||||
|
&_POSIX_Semaphore_Information,
|
||||||
|
_Objects_Get_index( the_semaphore_id )
|
||||||
|
);
|
||||||
|
|
||||||
#if defined(RTEMS_MULTIPROCESSING)
|
#if defined(RTEMS_MULTIPROCESSING)
|
||||||
if ( the_semaphore->process_shared == PTHREAD_PROCESS_SHARED ) {
|
if ( the_semaphore->process_shared == PTHREAD_PROCESS_SHARED ) {
|
||||||
_Objects_MP_Close(
|
_Objects_MP_Close( &_POSIX_Semaphore_Information, the_semaphore_id );
|
||||||
&_POSIX_Semaphore_Information,
|
}
|
||||||
the_semaphore->Object.id
|
|
||||||
);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
the_semaphore->linked = FALSE;
|
the_semaphore->linked = FALSE;
|
||||||
_POSIX_Semaphore_Namespace_remove( the_semaphore );
|
_POSIX_Semaphore_Namespace_remove( the_semaphore );
|
||||||
_POSIX_Semaphore_Delete( the_semaphore );
|
_POSIX_Semaphore_Delete( the_semaphore );
|
||||||
|
|
||||||
_Thread_Enable_dispatch();
|
_Thread_Enable_dispatch();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
return POSIX_BOTTOM_REACHED();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,11 @@
|
|||||||
#include <rtems/posix/seterr.h>
|
#include <rtems/posix/seterr.h>
|
||||||
|
|
||||||
/*PAGE
|
/*PAGE
|
||||||
|
*
|
||||||
|
* sem_unlink
|
||||||
|
*
|
||||||
|
* Unlinks a named semaphore, sem_close must also be called to remove
|
||||||
|
* the semaphore.
|
||||||
*
|
*
|
||||||
* 11.2.5 Remove a Named Semaphore, P1003.1b-1993, p.225
|
* 11.2.5 Remove a Named Semaphore, P1003.1b-1993, p.225
|
||||||
*/
|
*/
|
||||||
@@ -30,35 +35,38 @@ int sem_unlink(
|
|||||||
Objects_Id the_semaphore_id;
|
Objects_Id the_semaphore_id;
|
||||||
Objects_Locations location;
|
Objects_Locations location;
|
||||||
|
|
||||||
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
|
_Thread_Disable_dispatch();
|
||||||
if ( status != 0 )
|
|
||||||
set_errno_and_return_minus_one( status );
|
|
||||||
|
|
||||||
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
|
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
|
||||||
switch ( location ) {
|
if ( status != 0 ) {
|
||||||
case OBJECTS_ERROR:
|
_Thread_Enable_dispatch();
|
||||||
set_errno_and_return_minus_one( EINVAL );
|
set_errno_and_return_minus_one( status );
|
||||||
case OBJECTS_REMOTE:
|
}
|
||||||
_Thread_Dispatch();
|
|
||||||
return POSIX_MP_NOT_IMPLEMENTED();
|
/*
|
||||||
set_errno_and_return_minus_one( EINVAL );
|
* Don't support unlinking a remote semaphore.
|
||||||
case OBJECTS_LOCAL:
|
*/
|
||||||
|
|
||||||
|
if ( !_Objects_Is_local_id(the_semaphore_id) ) {
|
||||||
|
_Thread_Enable_dispatch();
|
||||||
|
set_errno_and_return_minus_one( ENOSYS );
|
||||||
|
}
|
||||||
|
|
||||||
|
the_semaphore = _Objects_Get_local_object(
|
||||||
|
&_POSIX_Semaphore_Information,
|
||||||
|
_Objects_Get_index( the_semaphore_id )
|
||||||
|
);
|
||||||
|
|
||||||
#if defined(RTEMS_MULTIPROCESSING)
|
#if defined(RTEMS_MULTIPROCESSING)
|
||||||
if ( the_semaphore->process_shared == PTHREAD_PROCESS_SHARED ) {
|
if ( the_semaphore->process_shared == PTHREAD_PROCESS_SHARED ) {
|
||||||
_Objects_MP_Close(
|
_Objects_MP_Close( &_POSIX_Semaphore_Information, the_semaphore_id );
|
||||||
&_POSIX_Semaphore_Information,
|
}
|
||||||
the_semaphore->Object.id
|
|
||||||
);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
the_semaphore->linked = FALSE;
|
the_semaphore->linked = FALSE;
|
||||||
_POSIX_Semaphore_Namespace_remove( the_semaphore );
|
_POSIX_Semaphore_Namespace_remove( the_semaphore );
|
||||||
_POSIX_Semaphore_Delete( the_semaphore );
|
_POSIX_Semaphore_Delete( the_semaphore );
|
||||||
|
|
||||||
_Thread_Enable_dispatch();
|
_Thread_Enable_dispatch();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
return POSIX_BOTTOM_REACHED();
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user