summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-03-24 15:51:50 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-03-24 15:51:50 +0000
commitb67418620bf9f28e5220c24283b8868bdb29adc8 (patch)
tree9cf5b244ee9d851d5acc5c7a15e478511116db35
parent3079674ed21a826de7d5d3ab0c65b234e1d49c1c (diff)
downloadnuttx-b67418620bf9f28e5220c24283b8868bdb29adc8.tar.gz
nuttx-b67418620bf9f28e5220c24283b8868bdb29adc8.tar.bz2
nuttx-b67418620bf9f28e5220c24283b8868bdb29adc8.zip
Correct errno handling
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@136 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/sched/pthread_getschedparam.c63
-rw-r--r--nuttx/sched/pthread_setschedparam.c92
-rw-r--r--nuttx/sched/sched_setparam.c19
3 files changed, 117 insertions, 57 deletions
diff --git a/nuttx/sched/pthread_getschedparam.c b/nuttx/sched/pthread_getschedparam.c
index 0e410ef9e..02dbd8faa 100644
--- a/nuttx/sched/pthread_getschedparam.c
+++ b/nuttx/sched/pthread_getschedparam.c
@@ -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)
diff --git a/nuttx/sched/pthread_setschedparam.c b/nuttx/sched/pthread_setschedparam.c
index bb0435aa0..32e5326f1 100644
--- a/nuttx/sched/pthread_setschedparam.c
+++ b/nuttx/sched/pthread_setschedparam.c
@@ -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;
+ }
diff --git a/nuttx/sched/sched_setparam.c b/nuttx/sched/sched_setparam.c
index 30978b02e..7ee22ffb6 100644
--- a/nuttx/sched/sched_setparam.c
+++ b/nuttx/sched/sched_setparam.c
@@ -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;
}