forked from Imagelibrary/rtems
Now much closer to working.
This commit is contained in:
@@ -61,11 +61,17 @@ int _POSIX_Semaphore_Create_support(
|
|||||||
|
|
||||||
_Thread_Disable_dispatch();
|
_Thread_Disable_dispatch();
|
||||||
|
|
||||||
|
/* Sharing semaphores among processes is not currently supported */
|
||||||
|
if (pshared != 0) {
|
||||||
|
_Thread_Enable_dispatch();
|
||||||
|
set_errno_and_return_minus_one( ENOSYS );
|
||||||
|
}
|
||||||
|
|
||||||
the_semaphore = _POSIX_Semaphore_Allocate();
|
the_semaphore = _POSIX_Semaphore_Allocate();
|
||||||
|
|
||||||
if ( !the_semaphore ) {
|
if ( !the_semaphore ) {
|
||||||
_Thread_Enable_dispatch();
|
_Thread_Enable_dispatch();
|
||||||
set_errno_and_return_minus_one( ENOMEM );
|
set_errno_and_return_minus_one( ENOSPC );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(RTEMS_MULTIPROCESSING)
|
#if defined(RTEMS_MULTIPROCESSING)
|
||||||
@@ -96,7 +102,13 @@ int _POSIX_Semaphore_Create_support(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
|
the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This effectively disables limit checking.
|
||||||
|
*/
|
||||||
|
|
||||||
|
the_sem_attr->maximum_count = 0xFFFFFFFF;
|
||||||
|
|
||||||
_CORE_semaphore_Initialize(
|
_CORE_semaphore_Initialize(
|
||||||
&the_semaphore->Semaphore,
|
&the_semaphore->Semaphore,
|
||||||
OBJECTS_POSIX_SEMAPHORES,
|
OBJECTS_POSIX_SEMAPHORES,
|
||||||
@@ -243,12 +255,15 @@ sem_t *sem_open(
|
|||||||
int status;
|
int status;
|
||||||
Objects_Id the_semaphore_id;
|
Objects_Id the_semaphore_id;
|
||||||
POSIX_Semaphore_Control *the_semaphore;
|
POSIX_Semaphore_Control *the_semaphore;
|
||||||
|
Objects_Locations location;
|
||||||
|
|
||||||
|
|
||||||
if ( oflag & O_CREAT ) {
|
if ( oflag & O_CREAT ) {
|
||||||
va_start(arg, oflag);
|
va_start(arg, oflag);
|
||||||
mode = (mode_t) va_arg( arg, mode_t * );
|
/*mode = (mode_t) va_arg( arg, mode_t * );*/
|
||||||
value = (unsigned int) va_arg( arg, unsigned int * );
|
mode = va_arg( arg, mode_t );
|
||||||
|
/*value = (unsigned int) va_arg( arg, unsigned int * );*/
|
||||||
|
value = va_arg( arg, unsigned int );
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,7 +285,7 @@ sem_t *sem_open(
|
|||||||
/* we are willing to create it */
|
/* we are willing to create it */
|
||||||
}
|
}
|
||||||
/* some type of error */
|
/* some type of error */
|
||||||
set_errno_and_return_minus_one_cast( status, sem_t * );
|
/*set_errno_and_return_minus_one_cast( status, sem_t * );*/
|
||||||
|
|
||||||
} else { /* name -> ID translation succeeded */
|
} else { /* name -> ID translation succeeded */
|
||||||
|
|
||||||
@@ -283,6 +298,7 @@ sem_t *sem_open(
|
|||||||
* check the mode. This is probably a good place for a subroutine.
|
* check the mode. This is probably a good place for a subroutine.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
|
||||||
the_semaphore->open_count += 1;
|
the_semaphore->open_count += 1;
|
||||||
|
|
||||||
return (sem_t *)&the_semaphore->Object.id;
|
return (sem_t *)&the_semaphore->Object.id;
|
||||||
@@ -297,7 +313,7 @@ sem_t *sem_open(
|
|||||||
|
|
||||||
status = _POSIX_Semaphore_Create_support(
|
status = _POSIX_Semaphore_Create_support(
|
||||||
name,
|
name,
|
||||||
TRUE, /* shared across processes */
|
FALSE, /* not shared across processes */
|
||||||
value,
|
value,
|
||||||
&the_semaphore
|
&the_semaphore
|
||||||
);
|
);
|
||||||
@@ -431,6 +447,7 @@ int _POSIX_Semaphore_Wait_support(
|
|||||||
{
|
{
|
||||||
register POSIX_Semaphore_Control *the_semaphore;
|
register POSIX_Semaphore_Control *the_semaphore;
|
||||||
Objects_Locations location;
|
Objects_Locations location;
|
||||||
|
int code;
|
||||||
|
|
||||||
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
|
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
|
||||||
switch ( location ) {
|
switch ( location ) {
|
||||||
@@ -448,7 +465,20 @@ int _POSIX_Semaphore_Wait_support(
|
|||||||
timeout
|
timeout
|
||||||
);
|
);
|
||||||
_Thread_Enable_dispatch();
|
_Thread_Enable_dispatch();
|
||||||
return _Thread_Executing->Wait.return_code;
|
code = _Thread_Executing->Wait.return_code;
|
||||||
|
switch (_Thread_Executing->Wait.return_code) {
|
||||||
|
case 1:
|
||||||
|
errno = EAGAIN;
|
||||||
|
code = -1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
errno = ETIMEDOUT;
|
||||||
|
code = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*return _Thread_Executing->Wait.return_code;*/
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
return POSIX_BOTTOM_REACHED();
|
return POSIX_BOTTOM_REACHED();
|
||||||
}
|
}
|
||||||
@@ -573,3 +603,27 @@ int sem_getvalue(
|
|||||||
}
|
}
|
||||||
return POSIX_BOTTOM_REACHED();
|
return POSIX_BOTTOM_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*PAGE
|
||||||
|
*
|
||||||
|
* _POSIX_Semaphore_Name_to_id
|
||||||
|
*
|
||||||
|
* XXX
|
||||||
|
*/
|
||||||
|
|
||||||
|
int _POSIX_Semaphore_Name_to_id(
|
||||||
|
const char *name,
|
||||||
|
Objects_Id *id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Objects_Name_to_id_errors status;
|
||||||
|
|
||||||
|
status = _Objects_Name_to_id( &_POSIX_Semaphore_Information, name, 0, id );
|
||||||
|
|
||||||
|
if ( status == OBJECTS_SUCCESSFUL ) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -61,11 +61,17 @@ int _POSIX_Semaphore_Create_support(
|
|||||||
|
|
||||||
_Thread_Disable_dispatch();
|
_Thread_Disable_dispatch();
|
||||||
|
|
||||||
|
/* Sharing semaphores among processes is not currently supported */
|
||||||
|
if (pshared != 0) {
|
||||||
|
_Thread_Enable_dispatch();
|
||||||
|
set_errno_and_return_minus_one( ENOSYS );
|
||||||
|
}
|
||||||
|
|
||||||
the_semaphore = _POSIX_Semaphore_Allocate();
|
the_semaphore = _POSIX_Semaphore_Allocate();
|
||||||
|
|
||||||
if ( !the_semaphore ) {
|
if ( !the_semaphore ) {
|
||||||
_Thread_Enable_dispatch();
|
_Thread_Enable_dispatch();
|
||||||
set_errno_and_return_minus_one( ENOMEM );
|
set_errno_and_return_minus_one( ENOSPC );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(RTEMS_MULTIPROCESSING)
|
#if defined(RTEMS_MULTIPROCESSING)
|
||||||
@@ -96,7 +102,13 @@ int _POSIX_Semaphore_Create_support(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
|
the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This effectively disables limit checking.
|
||||||
|
*/
|
||||||
|
|
||||||
|
the_sem_attr->maximum_count = 0xFFFFFFFF;
|
||||||
|
|
||||||
_CORE_semaphore_Initialize(
|
_CORE_semaphore_Initialize(
|
||||||
&the_semaphore->Semaphore,
|
&the_semaphore->Semaphore,
|
||||||
OBJECTS_POSIX_SEMAPHORES,
|
OBJECTS_POSIX_SEMAPHORES,
|
||||||
@@ -243,12 +255,15 @@ sem_t *sem_open(
|
|||||||
int status;
|
int status;
|
||||||
Objects_Id the_semaphore_id;
|
Objects_Id the_semaphore_id;
|
||||||
POSIX_Semaphore_Control *the_semaphore;
|
POSIX_Semaphore_Control *the_semaphore;
|
||||||
|
Objects_Locations location;
|
||||||
|
|
||||||
|
|
||||||
if ( oflag & O_CREAT ) {
|
if ( oflag & O_CREAT ) {
|
||||||
va_start(arg, oflag);
|
va_start(arg, oflag);
|
||||||
mode = (mode_t) va_arg( arg, mode_t * );
|
/*mode = (mode_t) va_arg( arg, mode_t * );*/
|
||||||
value = (unsigned int) va_arg( arg, unsigned int * );
|
mode = va_arg( arg, mode_t );
|
||||||
|
/*value = (unsigned int) va_arg( arg, unsigned int * );*/
|
||||||
|
value = va_arg( arg, unsigned int );
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,7 +285,7 @@ sem_t *sem_open(
|
|||||||
/* we are willing to create it */
|
/* we are willing to create it */
|
||||||
}
|
}
|
||||||
/* some type of error */
|
/* some type of error */
|
||||||
set_errno_and_return_minus_one_cast( status, sem_t * );
|
/*set_errno_and_return_minus_one_cast( status, sem_t * );*/
|
||||||
|
|
||||||
} else { /* name -> ID translation succeeded */
|
} else { /* name -> ID translation succeeded */
|
||||||
|
|
||||||
@@ -283,6 +298,7 @@ sem_t *sem_open(
|
|||||||
* check the mode. This is probably a good place for a subroutine.
|
* check the mode. This is probably a good place for a subroutine.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
|
||||||
the_semaphore->open_count += 1;
|
the_semaphore->open_count += 1;
|
||||||
|
|
||||||
return (sem_t *)&the_semaphore->Object.id;
|
return (sem_t *)&the_semaphore->Object.id;
|
||||||
@@ -297,7 +313,7 @@ sem_t *sem_open(
|
|||||||
|
|
||||||
status = _POSIX_Semaphore_Create_support(
|
status = _POSIX_Semaphore_Create_support(
|
||||||
name,
|
name,
|
||||||
TRUE, /* shared across processes */
|
FALSE, /* not shared across processes */
|
||||||
value,
|
value,
|
||||||
&the_semaphore
|
&the_semaphore
|
||||||
);
|
);
|
||||||
@@ -431,6 +447,7 @@ int _POSIX_Semaphore_Wait_support(
|
|||||||
{
|
{
|
||||||
register POSIX_Semaphore_Control *the_semaphore;
|
register POSIX_Semaphore_Control *the_semaphore;
|
||||||
Objects_Locations location;
|
Objects_Locations location;
|
||||||
|
int code;
|
||||||
|
|
||||||
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
|
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
|
||||||
switch ( location ) {
|
switch ( location ) {
|
||||||
@@ -448,7 +465,20 @@ int _POSIX_Semaphore_Wait_support(
|
|||||||
timeout
|
timeout
|
||||||
);
|
);
|
||||||
_Thread_Enable_dispatch();
|
_Thread_Enable_dispatch();
|
||||||
return _Thread_Executing->Wait.return_code;
|
code = _Thread_Executing->Wait.return_code;
|
||||||
|
switch (_Thread_Executing->Wait.return_code) {
|
||||||
|
case 1:
|
||||||
|
errno = EAGAIN;
|
||||||
|
code = -1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
errno = ETIMEDOUT;
|
||||||
|
code = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*return _Thread_Executing->Wait.return_code;*/
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
return POSIX_BOTTOM_REACHED();
|
return POSIX_BOTTOM_REACHED();
|
||||||
}
|
}
|
||||||
@@ -573,3 +603,27 @@ int sem_getvalue(
|
|||||||
}
|
}
|
||||||
return POSIX_BOTTOM_REACHED();
|
return POSIX_BOTTOM_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*PAGE
|
||||||
|
*
|
||||||
|
* _POSIX_Semaphore_Name_to_id
|
||||||
|
*
|
||||||
|
* XXX
|
||||||
|
*/
|
||||||
|
|
||||||
|
int _POSIX_Semaphore_Name_to_id(
|
||||||
|
const char *name,
|
||||||
|
Objects_Id *id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Objects_Name_to_id_errors status;
|
||||||
|
|
||||||
|
status = _Objects_Name_to_id( &_POSIX_Semaphore_Information, name, 0, id );
|
||||||
|
|
||||||
|
if ( status == OBJECTS_SUCCESSFUL ) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user