Update errno discussion

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@627 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2008-02-03 17:09:22 +00:00
parent 97a52f1b17
commit 2ab10a107f

View File

@ -21,7 +21,7 @@ User's Manual
<p>
Gregory Nutt
<p>
<small>Last Update: December 10, 2007</small>
<small>Last Update: Februrary 2, 2008</small>
</center>
<h1>1.0 <A NAME="Introduction">Introduction</a></h1>
@ -62,9 +62,15 @@ Gregory Nutt
<b>Section 3.0, <a href="#Data_Structures">OS Data Structures</a></b>:
This section documents the data structures that are used at the NuttX
interface.
<ul>
<li>Paragraph 3.1 <a href="#ScalarType">Scalar Types</a></li>
<li>Paragraph 3.2 <a href="#HiddenStructures">Hidden Interface Structures</a></li>
<li>Paragraph 3.3 <a href="#ErrnoAccess">Access to the <code>errno</code> Variable</a></li>
<li>Paragraph 3.4 <a href="#UserStructures">User Interface Structures</a></li>
</ul>
</li>
<li>
<a href="#index">Index</a>
<a href="#index"><b>Index</b></a>
</li>
</ul>
@ -227,7 +233,7 @@ paragraphs.
<li>
Returns the non-zero task ID of the new task or
ERROR if memory is insufficient or the task cannot be
created (errno is not set).
created (<a href="#ErrnoAccess"><code>errno</code></a> is not set).
</LI>
</ul>
@ -296,7 +302,7 @@ VxWorks provides the following similar interface:
<ul>
<li><p>OK, or ERROR if the task cannot be initialized.</P>
<p>This function can only failure is it is unable to assign
a new, unique task ID to the TCB (errno is not set).</P>
a new, unique task ID to the TCB (<a href="#ErrnoAccess"><code>errno</code></a> is not set).</P>
</ul>
<p>
<b>Assumptions/Limitations:</b>
@ -348,7 +354,7 @@ task_init argument).
<p>
<b>Returned Values:</b>
<ul>
<li>OK, or ERROR if the task cannot be activated (errno is not set).
<li>OK, or ERROR if the task cannot be activated (<a href="#ErrnoAccess"><code>errno</code></a> is not set).
</ul>
<p>
@ -399,7 +405,7 @@ zero signifies the calling task.
<b>Returned Values:</b>
<ul>
<li>OK, or ERROR if the task cannot be deleted.
This function can fail if the provided pid does not correspond to a task (errno is not set)
This function can fail if the provided pid does not correspond to a task (<a href="#ErrnoAccess"><code>errno</code></a> is not set)
</ul>
<p>
@ -613,7 +619,7 @@ Compatible with the POSIX interface of the same name.
<p>
<b>Returned Values:</b>
On success, sched_setparam() returns 0 (OK).
On error, -1 (ERROR) is returned, and<code>errno</code>is set appropriately.
On error, -1 (ERROR) is returned, and <a href="#ErrnoAccess"><code>errno</code></a> is set appropriately.
</p>
<ul>
@ -714,7 +720,7 @@ interface of the same name.
<p>
<b>Returned Values:</b>
On success, <i>sched_setscheduler()</i> returns OK (zero). On
error, ERROR (-1) is returned, and<code>errno</code>is set appropriately:
error, ERROR (-1) is returned, and <a href="#ErrnoAccess"><code>errno</code></a> is set appropriately:
</p>
<ul>
<li>EINVAL The scheduling policy is not one of the
@ -762,7 +768,7 @@ policy.
<li>
On success, <i>sched_getscheduler()</i> returns the policy for
the task (either SCHED_FIFO or SCHED_RR).
On error, ERROR (-1) is returned, and<code>errno</code>is set appropriately:
On error, ERROR (-1) is returned, and <a href="#ErrnoAccess"><code>errno</code></a> is set appropriately:
<ul>
<li>ESRCH The task whose ID is pid could not be found.</li>
</ul>
@ -775,7 +781,7 @@ policy.
interface of the same name.
Differences from the full POSIX implementation include:
<ul>
<li>Does not report errors via <I>errno</I>.
<li>Does not report errors via <a href="#ErrnoAccess"><code>errno</code></a>.
</ul>
<H3><a name="sched_yield">2.2.5 sched_yield</a></H3>
@ -894,7 +900,7 @@ priority of the calling task is returned.
<p>
<b>Returned Values:</b>
On success, sched_rr_get_interval() returns OK (0). On
error, ERROR (-1) is returned, and<code>errno</code>is set to:
error, ERROR (-1) is returned, and <a href="#ErrnoAccess"><code>errno</code></a> is set to:
</p>
<ul>
<li>EFAULT Cannot copy to interval</LI>
@ -1216,7 +1222,7 @@ interface of the same name.
<p>
<b>Returned Values:</b>
On success, <code>mq_send()</code> returns 0 (<code>OK</code>);
on error, -1 (<code>ERROR</code>) is returned, with <code>errno</code> set
on error, -1 (<code>ERROR</code>) is returned, with <a href="#ErrnoAccess"><code>errno</code></a> set
to indicate the error:
</p>
<ul>
@ -1299,7 +1305,7 @@ interface of the same name.
<p>
<b>Returned Values:</b>
On success, <code>mq_send()</code> returns 0 (<code>OK</code>);
on error, -1 (<code>ERROR</code>) is returned, with <code>errno</code> set
on error, -1 (<code>ERROR</code>) is returned, with <a href="#ErrnoAccess"><code>errno</code></a> set
to indicate the error:
</p>
<ul>
@ -1370,7 +1376,7 @@ interface of the same name.
<p>
<b>Returned Values:</b>.
One success, the length of the selected message in bytes is returned.
On failure, -1 (<code>ERROR</code>) is returned and the <code>errno</code> is set appropriately:
On failure, -1 (<code>ERROR</code>) is returned and the <a href="#ErrnoAccess"><code>errno</code></a> is set appropriately:
</p>
<ul>
<li>
@ -1451,7 +1457,7 @@ interface of the same name.
<p>
<b>Returned Values:</b>.
One success, the length of the selected message in bytes is returned.
On failure, -1 (<code>ERROR</code>) is returned and the <code>errno</code> is set appropriately:
On failure, -1 (<code>ERROR</code>) is returned and the <a href="#ErrnoAccess"><code>errno</code></a> is set appropriately:
</p>
<ul>
<li>
@ -1516,7 +1522,7 @@ registration.
<li><I>mqdes</I>. Message queue descriptor
<li><I>notification</I>. Real-time signal structure containing:
<ul>
<li><I>sigev_notify</I>. Should be osSIGEV_SIGNAL (but actually
<li><I>sigev_notify</I>. Should be SIGEV_SIGNAL (but actually
ignored)
<li><I>sigev_signo</I>. The signo to use for the notification
<li><I>sigev_value</I>. Value associated with the signal
@ -1951,9 +1957,8 @@ the lock or the call is interrupted by a signal.
</ul>
<p>
If <I>sem_wait</I> returns -1 (ERROR) then the cause of the failure
will be indicated by the thread-specific <I>errno</I> value (a pointer
to this value can be obtained using <I>get_errno_ptr()</I>). The following
lists the possible values for <I>errno</I>:
will be indicated by the thread-specific <a href="#ErrnoAccess"><code>errno</code></a>.
The following lists the possible values for <a href="#ErrnoAccess"><code>errno</code></a>:
<p>
<ul>
<li><I>EINVAL</I>: Indicates that the <I>sem</I> input parameter is
@ -1992,9 +1997,8 @@ returns without blocking.
<li>0 (OK) or -1 (ERROR) if unsuccessful
</ul>
If <I>sem_wait</I> returns -1 (ERROR) then the cause of the failure
will be indicated by the thread-specific <I>errno</I> value (a pointer
to this value can be obtained using <I>get_errno_ptr()</I>). The following
lists the possible values for <I>errno</I>:
will be indicated by the thread-specific <a href="#ErrnoAccess"><code>errno</code></a>.
The following lists the possible values for <a href="#ErrnoAccess"><code>errno</code></a>:
<p>
<ul>
<li><I>EINVAL</I>: Indicates that the <I>sem</I> input parameter is
@ -2522,7 +2526,7 @@ VxWorks provides the following comparable interface:
If the call succeeds, <code>timer_create()</code> will return 0 (<code>OK</code>) and update the
location referenced by <code>timerid</code> to a <code>timer_t</code>, which can be passed to the
other per-thread timer calls. If an error occurs, the function will return
a value of -1 (<code>ERROR</code>) and set<code>errno</code>to indicate the error.
a value of -1 (<code>ERROR</code>) and set <a href="#ErrnoAccess"><code>errno</code></a> to indicate the error.
</p>
<ul>
<li><code>EAGAIN</code>. The system lacks sufficient signal queuing resources to honor the
@ -2570,7 +2574,8 @@ VxWorks provides the following comparable interface:
</p>
<p>
If successful, the <I>timer_delete()</I> function will return zero (<I>OK</I>).
Otherwise, the function will return a value of -1 (ERROR) and set<code>errno</code>to indicate the error:
Otherwise, the function will return a value of -1 (ERROR) and set
<a href="#ErrnoAccess"><code>errno</code></a> to indicate the error:
</p>
<ul>
<li><code>EINVAL</code>. The timer specified timerid is not valid.</li>
@ -2647,7 +2652,8 @@ VxWorks provides the following comparable interface:
</p>
<p>
If the timer_gettime() succeeds, a value of 0 (OK) will be returned.
If an error occurs, the value -1 (ERROR) will be returned, and<code>errno</code>set to indicate the error.
If an error occurs, the value -1 (ERROR) will be returned, and
<a href="#ErrnoAccess"><code>errno</code></a> set to indicate the error.
</p>
<ul>
<li><code>EINVAL</code>. The timerid argument does not correspond to an ID returned by timer_create() but not yet deleted by timer_delete().</li>
@ -3065,12 +3071,12 @@ If sigprocmask() fails, the signal mask of the task is not changed.
<ul>
<li><I>how</I>. How the signal mast will be changed:
<ul>
<li><I>osSIG_BLOCK</I>. The resulting set is the union of the
<li><I>SIG_BLOCK</I>. The resulting set is the union of the
current set and the signal set pointed to by the <I>set</I> input parameter.
<li><I>osSIG_UNBLOCK</I>. The resulting set is the intersection
<li><I>SIG_UNBLOCK</I>. The resulting set is the intersection
of the current set and the complement of the signal set pointed
to by the <I>set</I> input parameter.
<li><I>osSIG_SETMASK</I>. The resulting set is the signal set
<li><I>SIG_SETMASK</I>. The resulting set is the signal set
pointed to by the <I>set</I> input parameter.
</ul>
@ -3307,7 +3313,7 @@ is delivered more than once.&quot;
<ul>
<li>
On success (at least one signal was sent), zero (OK) is returned.
On error, -1 (ERROR) is returned, and<code>errno</code>is set appropriately.
On error, -1 (ERROR) is returned, and <a href="#ErrnoAccess"><code>errno</code></a> is set appropriately.
<ul>
<li><code>EGAIN</code>. The limit of signals which may be queued has been reached.</li>
<li><code>EINVAL</code>. signo was invalid.</li>
@ -5860,7 +5866,7 @@ Those socket APIs are discussed in the following paragraphs.</p>
</ul>
<p>
<b>Returned Values:</b>
0 on success; -1 on error with<code>errno</code>set appropriately:
0 on success; -1 on error with <a href="#ErrnoAccess"><code>errno</code></a> set appropriately:
</p>
<ul>
<li><code>EACCES</code>.
@ -5906,7 +5912,7 @@ Those socket APIs are discussed in the following paragraphs.</p>
</ul>
<p>
<b>Returned Values:</b>
0 on success; -1 on error with<code>errno</code>set appropriately:
0 on success; -1 on error with <a href="#ErrnoAccess"><code>errno</code></a> set appropriately:
</p>
<ul>
<li><code>EACCES</code>
@ -5961,7 +5967,7 @@ Those socket APIs are discussed in the following paragraphs.</p>
</ul>
<p>
<b>Returned Values:</b>
0 on success; -1 on error with<code>errno</code>set appropriately:
0 on success; -1 on error with <a href="#ErrnoAccess"><code>errno</code></a> set appropriately:
</p>
<li><code>EACCES</code> or </code>EPERM</code>:
The user tried to connect to a broadcast address without having the
@ -6028,7 +6034,8 @@ Those socket APIs are discussed in the following paragraphs.</p>
</ul>
<p>
<b>Returned Values:</b>
On success, zero is returned. On error, -1 is returned, and errno is set appropriately.
On success, zero is returned. On error, -1 is returned, and
<a href="#ErrnoAccess"><code>errno</code></a> is set appropriately.
</p>
<ul>
<li><code>EADDRINUSE</code>: Another socket is already listening on the same port.</li>
@ -6177,7 +6184,8 @@ Those socket APIs are discussed in the following paragraphs.</p>
</ul>
<p>
<b>Returned Values:</b>
On success, returns the number of characters sent. On error, -1 is returned, and<code>errno</code>is set appropriately:
On success, returns the number of characters sent. On error, -1 is returned,
and <a href="#ErrnoAccess"><code>errno</code></a> is set appropriately:
</p>
<ul>
<li><code>EAGAIN</code> or <code>EWOULDBLOCK</code>.
@ -6284,7 +6292,7 @@ Those socket APIs are discussed in the following paragraphs.</p>
<p>
<b>Returned Values:</b>
On success, returns the number of characters sent.
On error, -1 is returned, and errno is set appropriately:
On error, -1 is returned, and <a href="#ErrnoAccess"><code>errno</code></a> is set appropriately:
</p>
<ul>
<li><code>EAGAIN</code>.
@ -6348,7 +6356,7 @@ Those socket APIs are discussed in the following paragraphs.</p>
<p>
<b>Returned Values:</b>
On success, returns the number of characters sent.
On error, -1 is returned, and errno is set appropriately:
On error, -1 is returned, and <a href="#ErrnoAccess"><code>errno</code></a> is set appropriately:
</p>
<ul>
<li><code>BADF</code>.
@ -6411,7 +6419,7 @@ Those socket APIs are discussed in the following paragraphs.</p>
<p>
<b>Returned Values:</b>
On success, returns the number of characters sent.
On error, -1 is returned, and errno is set appropriately:
On error, -1 is returned, and <a href="#ErrnoAccess"><code>errno</code></a> is set appropriately:
</p>
<ul>
<li><code>BADF</code>.
@ -6428,8 +6436,8 @@ Those socket APIs are discussed in the following paragraphs.</p>
</ul>
<hr>
<h1>3.0 <A NAME="Data_Structures">OS Data Structures</a></h1>
<H2>3.1 Scalar types</H2>
<h1>3.0 <A NAME="Data_Structures">OS Data Structures</A></h1>
<H2>3.1 <A NAME="ScalarType">Scalar Types</A></H2>
<p>
Many of the types used to communicate with NuttX are simple
scalar types. These types are used to provide architecture independence
@ -6443,7 +6451,7 @@ interface include:
<li>time_t
</ul>
<H2>3.2 Hidden Interface Structures</H2>
<H2>3.2 <A NAME="HiddenStructures">Hidden Interface Structures</A></H2>
<p>
Several of the types used to interface with NuttX are
structures that are intended to be hidden from the application.
@ -6461,34 +6469,44 @@ OS resources. These hidden structures include:
In order to maintain portability, applications should not reference
specific elements within these hidden structures. These hidden
structures will not be described further in this user's manual.
</p>
<p>
<H2>3.3. Access to the <I>errno</I> Variable</H2>
<H2>3.3 <A NAME="ErrnoAccess">Access to the <code>errno</code> Variable</A></H2>
<p>
A pointer to the thread-specific <I>errno</I>. value is available through a
A pointer to the thread-specific <code>errno</code> value is available through a
function call:
</p>
<p>
<b>Function Prototype:</b>
<p>
<pre> int *get_errno_ptr( void )</pre>
<pre> #include <errno.h>
#define errno *get_errno_ptr()
int *get_errno_ptr( void )</pre>
<p>
<b>Description</b>: <I>osGetErrnorPtr()</I> returns a pointer to
the thread-specific <I>errno</I> value.
<b>Description</b>:
<code>get_errno_ptr()</code> returns a pointer to the thread-specific <code>errno</code> value.
Note that the symbol <code>errno</code> is defined to be <code>get_errno_ptr()</code> so that the usual
access by referencing the symbol <code>errno</code> will work as expected.
</p>
<p>
This differs somewhat from the use for<code>errno</code>in a multi-threaded process environment:
Each pthread will have its own private copy of<code>errno</code>and the<code>errno</code>will not be shared
between pthreads.
There is a unique, private <code>errno</code> value for each NuttX task.
However, the implementation of <code>errno</code> differs somewhat from the use of
<code>errno</code> in most multi-threaded process environments:
In NuttX, each pthread will also have its own private copy of <code>errno</code> and the
<code>errno</code> will not be shared between pthreads.
This is, perhaps, non-standard but promotes better thread independence.
<p>
<b>Input Parameters</b>: None
<p>
<b>Returned Values</b>:
<p>
<ul>
<li>A pointer to the thread-specific <I>errno</I> value.
<li>A pointer to the thread-specific <code>errno</code> value.
</ul>
<p>
<H2>3.4 User Interface Structures</H2>
<H2>3.4 <A NAME="UserStructures">User Interface Structures</A></H2>
<p>
<H3>3.4.1 main_t</H3>
<p>