Correct errno handling

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@136 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2007-03-24 15:51:50 +00:00
parent e689e148e8
commit b282cd3f42
3 changed files with 117 additions and 57 deletions

View File

@ -1,4 +1,4 @@
/************************************************************
/****************************************************************************
* pthread_getschedparam.c
*
* Copyright (C) 2007 Gregory Nutt. All rights reserved.
@ -31,11 +31,11 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Included Files
************************************************************/
****************************************************************************/
#include <sys/types.h>
#include <pthread.h>
@ -44,47 +44,64 @@
#include <debug.h>
#include "pthread_internal.h"
/************************************************************
/****************************************************************************
* Definitions
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Private Type Declarations
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Global Variables
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Private Variables
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Private Functions
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Public Functions
************************************************************/
*****************************************************************************/
/************************************************************
/****************************************************************************
* Function: pthread_getschedparam
*
* Description:
* Obtain the thread scheduling parameters.
* The pthread_getschedparam() functions will get the scheduling policy and
* parameters of threads. For SCHED_FIFO and SCHED_RR, the only required
* member of the sched_param structure is the priority sched_priority.
*
* The pthread_getschedparam() function will retrieve the scheduling policy
* and scheduling parameters for the thread whose thread ID is given by
* 'thread' and will store those values in 'policy' and 'param',
* respectively. The priority value returned from pthread_getschedparam()
* will be the value specified by the most recent pthread_setschedparam(),
* pthread_setschedprio(), or pthread_create() call affecting the target
* thread. It will not reflect any temporary adjustments to its priority (such
* as might result of any priority inheritance, for example).
*
* The policy parameter may have the value SCHED_FIFO, or SCHED_RR
* (SCHED_OTHER and SCHED_SPORADIC, in particular, are not supported).
* The SCHED_FIFO and SCHED_RR policies will have a single scheduling
* parameter, sched_priority.
*
* Parameters:
* thread
* policy
* param
* thread - The ID of thread whose scheduling parameters will be queried.
* policy - The location to store the thread's scheduling policy.
* param - The location to store the thread's priority.
*
* Return Value:
* 0 if successful. Otherwise, an error code.
* 0 if successful. Otherwise, the error code ESRCH if the value specified
* by thread does not refer to an existing thread.
*
* Assumptions:
*
************************************************************/
****************************************************************************/
int pthread_getschedparam(pthread_t thread, int *policy,
struct sched_param *param)

View File

@ -1,4 +1,4 @@
/************************************************************
/****************************************************************************
* pthread_setschedparam.c
*
* Copyright (C) 2007 Gregory Nutt. All rights reserved.
@ -31,11 +31,11 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Included Files
************************************************************/
****************************************************************************/
#include <sys/types.h>
#include <pthread.h>
@ -44,54 +44,96 @@
#include <debug.h>
#include "pthread_internal.h"
/************************************************************
/****************************************************************************
* Definitions
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Private Type Declarations
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Global Variables
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Private Variables
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Private Functions
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Public Functions
************************************************************/
****************************************************************************/
/************************************************************
/****************************************************************************
* Function: pthread_setschedparam
*
* Description:
* Set thread scheduling parameters.
* The pthread_setschedparam() functions will set the scheduling policy and
* parameters of threads. For SCHED_FIFO and SCHED_RR, the only required
* member of the sched_param structure is the priority sched_priority.
*
* The pthread_setschedparam() function will set the scheduling policy and
* associated scheduling parameters for the thread whose thread ID is
* given by 'thread' to the policy and associated parameters provided in
* 'policy' and 'param', respectively.
*
* The policy parameter may have the value SCHED_FIFO, or SCHED_RR
* (SCHED_OTHER and SCHED_SPORADIC, in particular, are not supported).
* The SCHED_FIFO and SCHED_RR policies will have a single scheduling
* parameter, sched_priority.
*
* If the pthread_setschedparam() function fails, the scheduling parameters
* will not be changed for the target thread.
*
* Parameters:
* thread
* policy
* param
* thread - The ID of thread whose scheduling parameters will be modified.
* policy - The new scheduling policy of the thread. Either SCHED_FIFO or
* SCHED_RR. SCHED_OTHER and SCHED_SPORADIC are not supported.
* param - Provides the new priority of the thread.
*
* Return Value:
* 0 if successful. Otherwise, an error code.
* 0 if successful. Otherwise, an error code identifying the cause of the
* failure:
*
* EINVAL The value specified by 'policy' or one of the scheduling parameters
* associated with the scheduling policy 'policy' is invalid.
* ENOTSUP An attempt was made to set the policy or scheduling parameters
* to an unsupported value (SCHED_OTHER and SCHED_SPORADIC in
* particular are not supported)
* EPERM The caller does not have the appropriate permission to set either
* the scheduling parameters or the scheduling policy of the
* specified thread. Or, the implementation does not allow the
* application to modify one of the parameters to the value
* specified.
* ESRCH The value specified by thread does not refer to a existing thread.
*
* Assumptions:
*
************************************************************/
****************************************************************************/
int pthread_setschedparam(pthread_t thread, int policy,
const struct sched_param *param)
{
int ret;
dbg("thread ID=%d policy=%d param=0x%p\n", thread, policy, param);
/* Set the errno to some non-zero value (failsafe) */
*get_errno_ptr() = EINVAL;
/* Let sched_setscheduler do all of the work */
return sched_setscheduler((pid_t)thread, policy, param);
ret = sched_setscheduler((pid_t)thread, policy, param);
if (ret != OK)
{
/* If sched_setscheduler() fails, return the errno */
ret = *get_errno_ptr();
}
return ret;
}

View File

@ -40,6 +40,7 @@
#include <nuttx/config.h>
#include <sys/types.h>
#include <sched.h>
#include <errno.h>
#include <nuttx/arch.h>
#include <nuttx/os_external.h>
#include "os_internal.h"
@ -90,14 +91,13 @@
* SCHED_PRIORITY_MIN through SCHED_PRIORITY_MAX.
*
* Return Value:
* OK if successful, otherwise ERROR. This function can
* fail for the following reasons:
* On success, sched_setparam() returns 0 (OK). On error, -1
* (ERROR) is returned, and errno is set appropriately.
*
* (1) parm is NULL or parm->sched_priority is out of
* range.
* (2) pid does not correspond to any task.
*
* (errno is not set).
* EINVAL The parameter 'param' is invalid or does not make
* sense for the current scheduling policy.
* EPERM The calling task does not have appropriate privileges.
* ESRCH The task whose ID is pid could not be found.
*
* Assumptions:
*
@ -110,7 +110,6 @@ int sched_setparam(pid_t pid, const struct sched_param *param)
tstate_t task_state;
irqstate_t saved_state;
int sched_priority = param->sched_priority;
int ret = 0;
/* Verify that the requested priority is in the valid range */
@ -118,6 +117,7 @@ int sched_setparam(pid_t pid, const struct sched_param *param)
param->sched_priority < SCHED_PRIORITY_MIN ||
param->sched_priority > SCHED_PRIORITY_MAX)
{
*get_errno_ptr() = EINVAL;
return ERROR;
}
@ -144,6 +144,7 @@ int sched_setparam(pid_t pid, const struct sched_param *param)
{
/* No task with this pid was found */
*get_errno_ptr() = ESRCH;
sched_unlock();
return ERROR;
}
@ -266,5 +267,5 @@ int sched_setparam(pid_t pid, const struct sched_param *param)
irqrestore(saved_state);
sched_unlock();
return ret;
return OK;
}