annotate src/nucleus/quc.c @ 9:6da1d56a96a3

cdg-hybrid: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 21:08:11 +0000
parents 0f80e1e4dce4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 /* Copyright Mentor Graphics Corporation 2002 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 /* All Rights Reserved. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 /* THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 /* THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 /* SUBJECT TO LICENSE TERMS. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 /* FILE NAME VERSION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 /* quc.c Nucleus PLUS 1.14 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 /* COMPONENT */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 /* QU - Queue Management */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 /* DESCRIPTION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 /* This file contains the core routines for the Queue management */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 /* component. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 /* DATA STRUCTURES */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 /* None */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 /* FUNCTIONS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 /* QUC_Create_Queue Create a message queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 /* QUC_Delete_Queue Delete a message queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 /* QUC_Send_To_Queue Send message to a queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 /* QUC_Receive_From_Queue Receive a message from queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 /* QUC_Cleanup Cleanup on timeout or a */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 /* terminate condition */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 /* DEPENDENCIES */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 /* cs_extr.h Common Service functions */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 /* tc_extr.h Thread Control functions */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 /* qu_extr.h Queue functions */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 /* hi_extr.h History functions */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 /* HISTORY */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 /* DATE REMARKS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 /* 03-01-1993 Created initial version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 /* 04-19-1993 Verified version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 /* 08-09-1993 Corrected pointer retrieval */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 /* loop, resulting in version 1.0a */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 /* 08-09-1993 Verified version 1.0a */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 /* 11-01-1993 Corrected a problem with fixed- */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 /* size queues of a size equal to */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 /* one message, resulting in */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 /* version 1.0b */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 /* 11-01-1993 Verified version 1.0b */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 /* 03-01-1994 Moved non-core functions into */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 /* supplemental files, changed */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 /* function interfaces to match */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 /* those in prototype, added */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 /* register options, changed */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 /* protection logic to reduce */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 /* overhead, corrected bug in */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 /* queue reset, optimized item */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 /* copy loops, resulting in */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 /* version 1.1 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 /* 03-18-1994 Verified version 1.1 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 /* 04-17-1996 updated to version 1.2 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 /* 01-28-1998 Corrected SPR412 resulting in */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 /* version 1.2a. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 /* 03-24-1998 Released version 1.3 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 /* 03-26-1999 Released 1.11m (new release */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 /* numbering scheme) */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 /* 04-17-2002 Released version 1.13m */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 /* 11-07-2002 Released version 1.14 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 #define NU_SOURCE_FILE
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 #include "cs_extr.h" /* Common service functions */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 #include "tc_extr.h" /* Thread control functions */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 #include "qu_extr.h" /* Queue functions */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 #include "hi_extr.h" /* History functions */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 /* Define external inner-component global data references. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 extern CS_NODE *QUD_Created_Queues_List;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 extern UNSIGNED QUD_Total_Queues;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 extern TC_PROTECT QUD_List_Protect;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 /* Define internal component function prototypes. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 VOID QUC_Cleanup(VOID *information);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 /* FUNCTION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 /* QUC_Create_Queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 /* DESCRIPTION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 /* This function creates a queue and then places it on the list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 /* of created queues. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 /* CALLED BY */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 /* Application */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 /* QUCE_Create_Queue Error checking shell */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 /* CALLS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 /* CSC_Place_On_List Add node to linked-list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 /* [HIC_Make_History_Entry] Make entry in history log */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 /* [TCT_Check_Stack] Stack checking function */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 /* TCT_Protect Protect created list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 /* TCT_Unprotect Un-protect data structure */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 /* INPUTS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 /* queue_ptr Queue control block pointer */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 /* name Queue name */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 /* start_address Starting address of actual */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 /* queue area */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 /* queue_size Total size of queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 /* message_type Type of message supported by */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 /* the queue (fixed/variable) */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 /* message_size Size of message. Variable */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 /* message-length queues, this*/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 /* represents the maximum size*/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 /* suspend_type Suspension type */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 /* OUTPUTS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 /* NU_SUCCESS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 /* HISTORY */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 /* DATE REMARKS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 /* 03-01-1993 Created initial version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 /* 04-19-1993 Verified version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 /* 03-01-1994 Changed function interfaces to */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 /* match those in prototype, */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 /* added register options, */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 /* resulting in version 1.1 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 /* 03-18-1994 Verified version 1.1 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 STATUS QUC_Create_Queue(NU_QUEUE *queue_ptr, CHAR *name,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 VOID *start_address, UNSIGNED queue_size,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 OPTION message_type, UNSIGNED message_size,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 OPTION suspend_type)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 R1 QU_QCB *queue; /* Queue control block ptr */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 INT i; /* Working index variable */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 NU_SUPERV_USER_VARIABLES
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 /* Switch to supervisor mode */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 NU_SUPERVISOR_MODE();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 /* Move input queue pointer into internal pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 queue = (QU_QCB *) queue_ptr;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 #ifdef NU_ENABLE_STACK_CHECK
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 /* Call stack checking function to check for an overflow condition. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 TCT_Check_Stack();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 #ifdef NU_ENABLE_HISTORY
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 /* Make an entry that corresponds to this function in the system history
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 log. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 HIC_Make_History_Entry(NU_CREATE_QUEUE_ID, (UNSIGNED) queue,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 (UNSIGNED) name, (UNSIGNED) start_address);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 /* First, clear the queue ID just in case it is an old Queue
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 Control Block. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 queue -> qu_id = 0;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 /* Fill in the queue name. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 for (i = 0; i < NU_MAX_NAME; i++)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 queue -> qu_name[i] = name[i];
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 /* Setup the queue suspension type. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 if (suspend_type == NU_FIFO)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 /* FIFO suspension is selected, setup the flag accordingly. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 queue -> qu_fifo_suspend = NU_TRUE;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 /* Priority suspension is selected. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 queue -> qu_fifo_suspend = NU_FALSE;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 /* Setup the queue message type. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 if (message_type == NU_FIXED_SIZE)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 /* Fixed-size messages are required. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 queue -> qu_fixed_size = NU_TRUE;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 /* Variable-size messages are required. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 queue -> qu_fixed_size = NU_FALSE;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 /* Setup the message size. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 queue -> qu_message_size = message_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 /* Clear the messages counter. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 queue -> qu_messages = 0;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 /* Setup the actual queue parameters. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 queue -> qu_queue_size = queue_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 /* If the queue supports fixed-size messages, make sure that the queue
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 size is an even multiple of the message size. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 if (queue -> qu_fixed_size)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 /* Adjust the area of the queue being used. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 queue_size = (queue_size / message_size) * message_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 queue -> qu_available = queue_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 queue -> qu_start = (UNSIGNED *) start_address;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 queue -> qu_end = queue -> qu_start + queue_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 queue -> qu_read = (UNSIGNED *) start_address;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 queue -> qu_write = (UNSIGNED *) start_address;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 /* Clear the suspension list pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 queue -> qu_suspension_list = NU_NULL;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 /* Clear the number of tasks waiting on the queue counter. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 queue -> qu_tasks_waiting = 0;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 /* Clear the urgent message list pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 queue -> qu_urgent_list = NU_NULL;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 /* Initialize link pointers. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 queue -> qu_created.cs_previous = NU_NULL;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 queue -> qu_created.cs_next = NU_NULL;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256 /* Protect against access to the list of created queues. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 TCT_Protect(&QUD_List_Protect);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 /* At this point the queue is completely built. The ID can now be
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 set and it can be linked into the created queue list. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 queue -> qu_id = QU_QUEUE_ID;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263 /* Link the queue into the list of created queues and increment the
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 total number of queues in the system. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265 CSC_Place_On_List(&QUD_Created_Queues_List, &(queue -> qu_created));
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 QUD_Total_Queues++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 #ifdef INCLUDE_PROVIEW
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 _RTProf_DumpQueue(RT_PROF_CREATE_QUEUE,queue,RT_PROF_OK);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272 /* Release protection against access to the list of created queues. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273 TCT_Unprotect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275 /* Return to user mode */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 NU_USER_MODE();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278 /* Return successful completion. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279 return(NU_SUCCESS);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285 /* FUNCTION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 /* QUC_Delete_Queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 /* DESCRIPTION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 /* This function deletes a queue and removes it from the list of */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 /* created queues. All tasks suspended on the queue are */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 /* resumed. Note that this function does not free the memory */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 /* associated with the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 /* CALLED BY */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 /* Application */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 /* QUCE_Delete_Queue Error checking shell */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 /* CALLS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 /* CSC_Remove_From_List Remove node from list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 /* [HIC_Make_History_Entry] Make entry in history log */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 /* TCC_Resume_Task Resume a suspended task */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306 /* [TCT_Check_Stack] Stack checking function */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 /* TCT_Control_To_System Transfer control to system */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 /* TCT_Protect Protect created list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309 /* TCT_Set_Current_Protect Setup current protect pointer*/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 /* TCT_System_Protect Protect against system access*/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311 /* TCT_System_Unprotect Release system protection */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 /* TCT_Unprotect Release protection */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314 /* INPUTS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 /* queue_ptr Queue control block pointer */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 /* OUTPUTS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320 /* NU_SUCCESS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 /* HISTORY */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324 /* DATE REMARKS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 /* 03-01-1993 Created initial version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 /* 04-19-1993 Verified version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328 /* 03-01-1994 Changed function interfaces to */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 /* match those in prototype, */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 /* added register options, changed */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331 /* protection logic to reduce */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 /* overhead, resulting in */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333 /* version 1.1 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335 /* 03-18-1994 Verified version 1.1 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
338 STATUS QUC_Delete_Queue(NU_QUEUE *queue_ptr)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
339 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 R1 QU_QCB *queue; /* Queue control block ptr */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
342 QU_SUSPEND *suspend_ptr; /* Suspend block pointer */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
343 QU_SUSPEND *next_ptr; /* Next suspend block pointer*/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344 STATUS preempt; /* Status for resume call */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
345 NU_SUPERV_USER_VARIABLES
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
346
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347 /* Move input queue pointer into internal pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348 queue = (QU_QCB *) queue_ptr;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
349
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
350 /* Switch to supervisor mode */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
351 NU_SUPERVISOR_MODE();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
352
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
353 #ifdef NU_ENABLE_STACK_CHECK
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
355 /* Call stack checking function to check for an overflow condition. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
356 TCT_Check_Stack();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
358 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
359
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
360 #ifdef NU_ENABLE_HISTORY
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
361
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
362 /* Make an entry that corresponds to this function in the system history
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
363 log. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
364 HIC_Make_History_Entry(NU_DELETE_QUEUE_ID, (UNSIGNED) queue,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
365 (UNSIGNED) 0, (UNSIGNED) 0);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
366
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
367 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
368
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
369 /* Protect against access to the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
370 TCT_System_Protect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
371
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
372 #ifdef INCLUDE_PROVIEW
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
373 _RTProf_DumpQueue(RT_PROF_DELETE_QUEUE,queue,RT_PROF_OK);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
374 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
375
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
376 /* Clear the queue ID. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
377 queue -> qu_id = 0;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
378
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
379 /* Release protection. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
380 TCT_Unprotect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
381
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
382 /* Protect against access to the list of created queues. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
383 TCT_Protect(&QUD_List_Protect);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
384
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
385 /* Remove the queue from the list of created queues. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
386 CSC_Remove_From_List(&QUD_Created_Queues_List, &(queue -> qu_created));
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
387
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
388 /* Decrement the total number of created queues. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
389 QUD_Total_Queues--;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
390
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
391 /* Pickup the suspended task pointer list. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
392 suspend_ptr = queue -> qu_suspension_list;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
393
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
394 /* Walk the chain task(s) currently suspended on the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
395 preempt = 0;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
396 while (suspend_ptr)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
397 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
398
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
399 /* Protect against system access. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
400 TCT_System_Protect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
401
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
402 /* Resume the suspended task. Insure that the status returned is
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
403 NU_QUEUE_DELETED. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
404 suspend_ptr -> qu_return_status = NU_QUEUE_DELETED;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
405
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
406 /* Point to the next suspend structure in the link. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
407 next_ptr = (QU_SUSPEND *) (suspend_ptr -> qu_suspend_link.cs_next);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
408
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
409 /* Resume the specified task. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
410 preempt = preempt |
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
411 TCC_Resume_Task((NU_TASK *) suspend_ptr -> qu_suspended_task,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
412 NU_QUEUE_SUSPEND);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
413
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
414 /* Determine if the next is the same as the head pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
415 if (next_ptr == queue -> qu_suspension_list)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
416
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
417 /* Clear the suspension pointer to signal the end of the list
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
418 traversal. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
419 suspend_ptr = NU_NULL;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
420 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
421
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
422 /* Position suspend pointer to the next pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
423 suspend_ptr = next_ptr;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
424
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
425 /* Modify current protection. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
426 TCT_Set_Current_Protect(&QUD_List_Protect);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
427
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
428 /* Clear the system protection. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
429 TCT_System_Unprotect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
430 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
431
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
432 /* Pickup the urgent message suspension list. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
433 suspend_ptr = queue -> qu_urgent_list;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
434
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
435 /* Walk the chain task(s) currently suspended on the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
436 while (suspend_ptr)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
437 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
438
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
439 /* Protect against system access. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
440 TCT_System_Protect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
441
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
442 /* Resume the suspended task. Insure that the status returned is
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
443 NU_QUEUE_DELETED. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
444 suspend_ptr -> qu_return_status = NU_QUEUE_DELETED;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
445
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
446 /* Point to the next suspend structure in the link. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
447 next_ptr = (QU_SUSPEND *) (suspend_ptr -> qu_suspend_link.cs_next);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
448
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
449 /* Resume the specified task. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
450 preempt = preempt |
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
451 TCC_Resume_Task((NU_TASK *) suspend_ptr -> qu_suspended_task,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
452 NU_QUEUE_SUSPEND);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
453
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
454 /* Determine if the next is the same as the head pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
455 if (next_ptr == queue -> qu_urgent_list)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
456
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
457 /* Clear the suspension pointer to signal the end of the list
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
458 traversal. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
459 suspend_ptr = NU_NULL;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
460 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
461
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
462 /* Position to the next suspend block in the list. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
463 suspend_ptr = next_ptr;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
464
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
465 /* Modify current protection. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
466 TCT_Set_Current_Protect(&QUD_List_Protect);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
467
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
468 /* Clear the system protection. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
469 TCT_System_Unprotect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
470 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
471
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
472 /* Determine if preemption needs to occur. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
473 if (preempt)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
474
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
475 /* Transfer control to system to facilitate preemption. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
476 TCT_Control_To_System();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
477
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
478 /* Release protection against access to the list of created queues. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
479 TCT_Unprotect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
480
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
481 /* Return to user mode */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
482 NU_USER_MODE();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
483
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
484 /* Return a successful completion. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
485 return(NU_SUCCESS);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
486 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
487
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
488
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
489 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
490 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
491 /* FUNCTION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
492 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
493 /* QUC_Send_To_Queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
494 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
495 /* DESCRIPTION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
496 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
497 /* This function sends a message to the specified queue. The */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
498 /* message length is determined by the caller. If there are one */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
499 /* or more tasks suspended on the queue for a message, the message */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
500 /* is copied into the message area of the first waiting task. If */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
501 /* the task's request is satisfied, it is resumed. Otherwise, if */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
502 /* the queue cannot hold the message, suspension of the calling */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
503 /* task is an option of the caller. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
504 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
505 /* CALLED BY */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
506 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
507 /* Application */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
508 /* QUCE_Send_To_Queue Error checking shell */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
509 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
510 /* CALLS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
511 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
512 /* CSC_Place_On_List Place on suspend list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
513 /* CSC_Priority_Place_On_List Place on priority list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
514 /* CSC_Remove_From_List Remove from suspend list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
515 /* [HIC_Make_History_Entry] Make entry in history log */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
516 /* TCC_Resume_Task Resume a suspended task */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
517 /* TCC_Suspend_Task Suspend calling task */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
518 /* TCC_Task_Priority Pickup task's priority */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
519 /* [TCT_Check_Stack] Stack checking function */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
520 /* TCT_Control_To_System Transfer control to system */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
521 /* TCT_Current_Thread Pickup current thread pointer*/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
522 /* TCT_System_Protect Protect queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
523 /* TCT_Unprotect Release protection */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
524 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
525 /* INPUTS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
526 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
527 /* queue_ptr Queue control block pointer */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
528 /* message Pointer to message to send */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
529 /* size Size of message to send */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
530 /* suspend Suspension option if full */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
531 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
532 /* OUTPUTS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
533 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
534 /* NU_SUCCESS If service is successful */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
535 /* NU_QUEUE_FULL If queue is currently full */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
536 /* NU_TIMEOUT If timeout on service expires*/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
537 /* NU_QUEUE_DELETED If queue was deleted during */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
538 /* suspension */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
539 /* NU_QUEUE_RESET If queue was reset during */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
540 /* suspension */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
541 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
542 /* HISTORY */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
543 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
544 /* DATE REMARKS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
545 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
546 /* 03-01-1993 Created initial version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
547 /* 04-19-1993 Verified version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
548 /* 03-01-1994 Changed function interfaces to */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
549 /* match those in prototype, */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
550 /* added register options, changed */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
551 /* protection logic to reduce */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
552 /* overhead, optimized copy loop, */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
553 /* resulting in version 1.1 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
554 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
555 /* 03-18-1994 Verified version 1.1 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
556 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
557 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
558 STATUS QUC_Send_To_Queue(NU_QUEUE *queue_ptr, VOID *message, UNSIGNED size,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
559 UNSIGNED suspend)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
560 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
561
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
562 R1 QU_QCB *queue; /* Queue control block ptr */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
563 QU_SUSPEND suspend_block; /* Allocate suspension block */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
564 QU_SUSPEND *suspend_ptr; /* Pointer to suspend block */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
565 R3 UNSIGNED_PTR source; /* Pointer to source */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
566 R4 UNSIGNED_PTR destination; /* Pointer to destination */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
567 UNSIGNED copy_size; /* Partial copy size */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
568 R2 INT i; /* Working counter */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
569 TC_TCB *task; /* Task pointer */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
570 STATUS preempt; /* Preempt flag */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
571 STATUS status; /* Completion status */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
572 NU_SUPERV_USER_VARIABLES
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
573
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
574 /* Switch to supervisor mode */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
575 NU_SUPERVISOR_MODE();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
576
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
577 /* Move input queue pointer into internal pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
578 queue = (QU_QCB *) queue_ptr;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
579
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
580
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
581 #ifdef NU_ENABLE_STACK_CHECK
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
582
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
583 /* Call stack checking function to check for an overflow condition. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
584 TCT_Check_Stack();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
585
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
586 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
587
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
588 #ifdef NU_ENABLE_HISTORY
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
589
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
590 /* Make an entry that corresponds to this function in the system history
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
591 log. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
592 HIC_Make_History_Entry(NU_SEND_TO_QUEUE_ID, (UNSIGNED) queue,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
593 (UNSIGNED) message, (UNSIGNED) size);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
594
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
595 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
596
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
597 /* Initialize the status as successful. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
598 status = NU_SUCCESS;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
599
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
600 /* Protect against simultaneous access to the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
601 TCT_System_Protect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
602
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
603 /* Determine if an extra word of overhead needs to be added to the
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
604 calculation. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
605 if (queue -> qu_fixed_size)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
606
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
607 /* No overhead. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
608 i = 0;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
609 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
610 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
611 /* Variable messages have one additional word of overhead. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
612 i = 1;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
613
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
614 /* Make special check to see if a suspension needs to be
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
615 forced for a variable length message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
616 if ((queue -> qu_suspension_list) && (queue -> qu_messages))
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
617 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
618
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
619 /* Pickup task control block pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
620 task = (TC_TCB *) TCT_Current_Thread();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
621
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
622 /* Now we know that there are other task(s) are suspended trying
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
623 to send a variable length message. Determine whether or not
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
624 a suspension should be forced. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
625 if ((queue -> qu_fifo_suspend) ||
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
626 (suspend == NU_NO_SUSPEND) ||
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
627 ((queue -> qu_suspension_list) -> qu_suspend_link.cs_priority <=
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
628 TCC_Task_Priority(task)))
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
629
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
630 /* Bump the computed size to avoid placing the new variable
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
631 length message ahead of the suspended tasks. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
632 i = (INT) queue -> qu_available;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
633 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
634 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
635
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
636 /* Determine if there is enough room in the queue for the message. The
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
637 extra logic is to prevent a variable-length message from sn*/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
638 if (queue -> qu_available < (size + i))
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
639 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
640
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
641 /* Queue does not have room for the message. Determine if
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
642 suspension is required. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
643 if (suspend)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
644 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
645
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
646 /* Suspension is requested. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
647
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
648 /* Increment the number of tasks waiting. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
649 queue -> qu_tasks_waiting++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
650
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
651 #ifdef INCLUDE_PROVIEW
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
652 _RTProf_DumpQueue(RT_PROF_SEND_TO_QUEUE,queue,RT_PROF_WAIT);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
653 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
654
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
655 /* Setup the suspend block and suspend the calling task. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
656 suspend_ptr = &suspend_block;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
657 suspend_ptr -> qu_queue = queue;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
658 suspend_ptr -> qu_suspend_link.cs_next = NU_NULL;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
659 suspend_ptr -> qu_suspend_link.cs_previous = NU_NULL;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
660 suspend_ptr -> qu_message_area = (UNSIGNED_PTR) message;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
661 suspend_ptr -> qu_message_size = size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
662 task = (TC_TCB *) TCT_Current_Thread();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
663 suspend_ptr -> qu_suspended_task = task;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
664
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
665 /* Determine if priority or FIFO suspension is associated with the
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
666 queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
667 if (queue -> qu_fifo_suspend)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
668 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
669
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
670 /* FIFO suspension is required. Link the suspend block into
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
671 the list of suspended tasks on this queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
672 CSC_Place_On_List((CS_NODE **) &(queue -> qu_suspension_list),
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
673 &(suspend_ptr -> qu_suspend_link));
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
674 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
675 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
676 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
677
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
678 /* Get the priority of the current thread so the suspend block
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
679 can be placed in the appropriate place. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
680 suspend_ptr -> qu_suspend_link.cs_priority =
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
681 TCC_Task_Priority(task);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
682
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
683 CSC_Priority_Place_On_List((CS_NODE **)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
684 &(queue -> qu_suspension_list),
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
685 &(suspend_ptr -> qu_suspend_link));
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
686 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
687
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
688 /* Finally, suspend the calling task. Note that the suspension call
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
689 automatically clears the protection on the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
690 TCC_Suspend_Task((NU_TASK *) task, NU_QUEUE_SUSPEND,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
691 QUC_Cleanup, suspend_ptr, suspend);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
692
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
693 /* Pickup the return status. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
694 status = suspend_ptr -> qu_return_status;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
695 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
696 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
697 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
698
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
699 /* Return a status of NU_QUEUE_FULL because there is no
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
700 room in the queue for the message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
701 status = NU_QUEUE_FULL;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
702
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
703 #ifdef INCLUDE_PROVIEW
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
704 _RTProf_DumpQueue(RT_PROF_SEND_TO_QUEUE,queue,RT_PROF_FAIL);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
705 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
706
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
707 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
708 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
709 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
710 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
711
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
712 /* Determine if a task is waiting on an empty queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
713 if ((queue -> qu_suspension_list) && (queue -> qu_messages == 0))
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
714 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
715
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
716 /* Task is waiting on an empty queue for a message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
717
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
718 /* Decrement the number of tasks waiting on queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
719 queue -> qu_tasks_waiting--;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
720
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
721 #ifdef INCLUDE_PROVIEW
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
722 _RTProf_DumpQueue(RT_PROF_SEND_TO_QUEUE,queue,RT_PROF_OK);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
723 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
724
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
725 /* Remove the first suspended block from the list. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
726 suspend_ptr = queue -> qu_suspension_list;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
727 CSC_Remove_From_List((CS_NODE **) &(queue -> qu_suspension_list),
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
728 &(suspend_ptr -> qu_suspend_link));
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
729
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
730 /* Setup the source and destination pointers. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
731 source = (UNSIGNED_PTR) message;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
732 destination = suspend_ptr -> qu_message_area;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
733
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
734 /* Initialize the return status. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
735 suspend_ptr -> qu_return_status = NU_SUCCESS;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
736
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
737 /* Loop to actually copy the message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
738 i = (INT) size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
739 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
740 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
741 *(destination++) = *(source);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
742 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
743 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
744 source++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
745 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
746
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
747 /* Return the size of the message copied. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
748 suspend_ptr -> qu_actual_size = size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
749
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
750 /* Wakeup the waiting task and check for preemption. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
751 preempt =
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
752 TCC_Resume_Task((NU_TASK *) suspend_ptr -> qu_suspended_task,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
753 NU_QUEUE_SUSPEND);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
754
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
755 /* Determine if preemption needs to take place. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
756 if (preempt)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
757
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
758 /* Transfer control to the system if the resumed task function
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
759 detects a preemption condition. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
760 TCT_Control_To_System();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
761 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
762 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
763 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
764
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
765 /* There is enough room in the queue and no task is waiting. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
766
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
767 /* Setup the source pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
768 source = (UNSIGNED_PTR) message;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
769 destination = queue -> qu_write;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
770
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
771 /* Process according to the type of message supported. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
772 if (queue -> qu_fixed_size)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
773 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
774
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
775 /* Fixed-size messages are supported by this queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
776
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
777 /* Loop to copy the message into the queue area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
778 i = (INT) size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
779 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
780 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
781 *(destination++) = *(source);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
782 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
783 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
784 source++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
785 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
786 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
787 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
788 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
789
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
790 /* Variable-size messages are supported. Processing must
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
791 check for queue wrap-around conditions. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
792
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
793 /* Place message size in first location. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
794 *(destination++) = size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
795
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
796 /* Check for a wrap-around condition on the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
797 if (destination >= queue -> qu_end)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
798
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
799 /* Wrap the write pointer back to the top of the queue
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
800 area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
801 destination = queue -> qu_start;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
802
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
803 /* Decrement the number of words remaining by 1 for this
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
804 extra word of overhead. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
805 queue -> qu_available--;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
806
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
807 /* Calculate the number of words remaining from the write
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
808 pointer to the bottom of the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
809 copy_size = queue -> qu_end - destination;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
810
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
811 /* Determine if the message needs to be wrapped around the
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
812 edge of the queue area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
813 if (copy_size >= size)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
814 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
815
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
816 /* Copy the whole message at once. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
817 i = (INT) size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
818 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
819 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
820 *(destination++) = *(source);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
821 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
822 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
823 source++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
824 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
825 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
826 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
827 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
828
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
829 /* Copy the first half of the message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
830 i = (INT) copy_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
831 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
832 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
833 *(destination) = *(source++);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
834 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
835 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
836 destination++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
837 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
838
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
839 /* Copy the second half of the message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
840 destination = queue -> qu_start;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
841 i = (INT) (size - copy_size);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
842 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
843 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
844 *(destination++) = *(source);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
845 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
846 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
847 source++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
848 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
849 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
850 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
851
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
852 /* Check again for wrap-around condition on the write pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
853 if (destination >= queue -> qu_end)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
854
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
855 /* Move the write pointer to the top of the queue area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
856 queue -> qu_write = queue -> qu_start;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
857 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
858
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
859 /* Simply copy the last position of the destination pointer
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
860 into the write pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
861 queue -> qu_write = destination;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
862
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
863 /* Decrement the number of available words. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
864 queue -> qu_available = queue -> qu_available - size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
865
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
866 /* Increment the number of messages in the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
867 queue -> qu_messages++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
868
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
869 #ifdef INCLUDE_PROVIEW
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
870 _RTProf_DumpQueue(RT_PROF_SEND_TO_QUEUE,queue,RT_PROF_OK);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
871 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
872
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
873 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
874 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
875
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
876 /* Release protection against access to the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
877 TCT_Unprotect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
878
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
879 /* Return to user mode */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
880 NU_USER_MODE();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
881
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
882 /* Return the completion status. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
883 return(status);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
884 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
885
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
886
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
887 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
888 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
889 /* FUNCTION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
890 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
891 /* QUC_Receive_From_Queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
892 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
893 /* DESCRIPTION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
894 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
895 /* This function receives a message from the specified queue. The */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
896 /* size of the message is specified by the caller. If there is a */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
897 /* message currently in the queue, the message is removed from the */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
898 /* queue and placed in the caller's area. Suspension is possible */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
899 /* if the request cannot be satisfied. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
900 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
901 /* CALLED BY */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
902 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
903 /* Application */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
904 /* QUCE_Receive_From_Queue Error checking shell */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
905 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
906 /* CALLS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
907 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
908 /* CSC_Place_On_List Place on suspend list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
909 /* CSC_Priority_Place_On_List Place on priority list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
910 /* CSC_Remove_From_List Remove from suspend list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
911 /* [HIC_Make_History_Entry] Make entry in history log */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
912 /* TCC_Resume_Task Resume a suspended task */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
913 /* TCC_Suspend_Task Suspend calling task */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
914 /* TCC_Task_Priority Pickup task's priority */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
915 /* [TCT_Check_Stack] Stack checking function */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
916 /* TCT_Control_To_System Transfer control to system */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
917 /* TCT_Current_Thread Pickup current thread pointer*/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
918 /* TCT_System_Protect Protect queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
919 /* TCT_Unprotect Release protection */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
920 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
921 /* INPUTS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
922 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
923 /* queue_ptr Queue control block pointer */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
924 /* message Pointer to message to send */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
925 /* size Size of the message */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
926 /* actual_size Size of message received */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
927 /* suspend Suspension option if empty */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
928 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
929 /* OUTPUTS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
930 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
931 /* NU_SUCCESS If service is successful */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
932 /* NU_QUEUE_EMPTY If queue is currently empty */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
933 /* NU_TIMEOUT If timeout on service expires*/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
934 /* NU_QUEUE_DELETED If queue was deleted during */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
935 /* suspension */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
936 /* NU_QUEUE_RESET If queue was reset during */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
937 /* suspension */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
938 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
939 /* HISTORY */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
940 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
941 /* DATE REMARKS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
942 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
943 /* 03-01-1993 Created initial version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
944 /* 04-19-1993 Verified version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
945 /* 11-01-1993 Corrected a problem resuming a */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
946 /* task suspended on a full queue */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
947 /* that only has a capacity of a */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
948 /* single message, resulting in */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
949 /* version 1.0b */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
950 /* 11-01-1993 Verified version 1.0b */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
951 /* 03-01-1994 Changed function interfaces to */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
952 /* match those in prototype, */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
953 /* added register options, changed */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
954 /* protection logic to reduce */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
955 /* overhead, optimized copy loop, */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
956 /* resulting in version 1.1 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
957 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
958 /* 03-18-1994 Verified version 1.1 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
959 /* 01-28-1998 Corrected SPR412. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
960 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
961 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
962 STATUS QUC_Receive_From_Queue(NU_QUEUE *queue_ptr, VOID *message,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
963 UNSIGNED size, UNSIGNED *actual_size, UNSIGNED suspend)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
964 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
965
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
966 R1 QU_QCB *queue; /* Queue control block ptr */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
967 QU_SUSPEND suspend_block; /* Allocate suspension block */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
968 QU_SUSPEND *suspend_ptr; /* Pointer to suspend block */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
969 R3 UNSIGNED_PTR source; /* Pointer to source */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
970 R4 UNSIGNED_PTR destination; /* Pointer to destination */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
971 TC_TCB *task; /* Task pointer */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
972 UNSIGNED copy_size; /* Number of words to copy */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
973 R2 INT i; /* Working counter */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
974 STATUS preempt; /* Preemption flag */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
975 STATUS status; /* Completion status */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
976 NU_SUPERV_USER_VARIABLES
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
977
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
978
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
979 /* Move input queue pointer into internal pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
980 queue = (QU_QCB *) queue_ptr;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
981
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
982 /* Switch to supervisor mode */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
983 NU_SUPERVISOR_MODE();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
984
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
985 #ifdef NU_ENABLE_STACK_CHECK
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
986
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
987 /* Call stack checking function to check for an overflow condition. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
988 TCT_Check_Stack();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
989
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
990 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
991
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
992 #ifdef NU_ENABLE_HISTORY
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
993
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
994 /* Make an entry that corresponds to this function in the system history
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
995 log. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
996 HIC_Make_History_Entry(NU_RECEIVE_FROM_QUEUE_ID, (UNSIGNED) queue,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
997 (UNSIGNED) message, (UNSIGNED) size);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
998
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
999 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1000
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1001 /* Initialize the status as successful. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1002 status = NU_SUCCESS;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1003
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1004 /* Protect against simultaneous access to the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1005 TCT_System_Protect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1006
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1007 /* Determine if an urgent message request is currently suspended. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1008 if (queue -> qu_urgent_list)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1009 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1010
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1011 /* If so, copy the message from the suspended request block and
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1012 resume the associated task. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1013
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1014 /* Decrement the number of tasks waiting on queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1015 queue -> qu_tasks_waiting--;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1016
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1017 /* Remove the first suspended block from the list. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1018 suspend_ptr = queue -> qu_urgent_list;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1019 CSC_Remove_From_List((CS_NODE **) &(queue -> qu_urgent_list),
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1020 &(suspend_ptr -> qu_suspend_link));
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1021
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1022 /* Setup the source and destination pointers. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1023 destination = (UNSIGNED_PTR) message;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1024 source = suspend_ptr -> qu_message_area;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1025
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1026 /* Initialize the return status. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1027 suspend_ptr -> qu_return_status = NU_SUCCESS;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1028
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1029 /* Loop to actually copy the message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1030 i = (INT) suspend_ptr -> qu_message_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1031 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1032 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1033 *(destination++) = *(source);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1034 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1035 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1036 source++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1037 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1038
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1039 /* Return the size of the message copied. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1040 *actual_size = suspend_ptr -> qu_message_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1041
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1042 /* Wakeup the waiting task and check for preemption. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1043 preempt =
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1044 TCC_Resume_Task((NU_TASK *) suspend_ptr -> qu_suspended_task,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1045 NU_QUEUE_SUSPEND);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1046
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1047 /* Determine if preemption needs to take place. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1048 if (preempt)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1049
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1050 /* Transfer control to the system if the resumed task function
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1051 detects a preemption condition. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1052 TCT_Control_To_System();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1053 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1054
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1055 /* Determine if there are messages in the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1056 else if (queue -> qu_messages)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1057 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1058
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1059 /* Copy message from queue into the caller's area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1060
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1061 /* Setup the source and destination pointers. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1062 source = queue -> qu_read;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1063 destination = (UNSIGNED_PTR) message;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1064
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1065 /* Process according to the type of message supported by the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1066 if (queue -> qu_fixed_size)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1067 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1068
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1069 /* Queue supports fixed-size messages. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1070
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1071 /* Copy the message from the queue area into the destination. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1072 i = (INT) size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1073 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1074 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1075 *(destination) = *(source++);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1076 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1077 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1078 destination++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1079 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1080 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1081 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1082 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1083
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1084 /* Queue supports variable-size messages. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1085
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1086 /* Variable length message size is actually in the queue area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1087 size = *(source++);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1088
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1089 /* Check for a wrap-around condition on the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1090 if (source >= queue -> qu_end)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1091
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1092 /* Wrap the read pointer back to the top of the queue
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1093 area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1094 source = queue -> qu_start;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1095
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1096 /* Increment the number of available words in the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1097 queue -> qu_available++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1098
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1099 /* Calculate the number of words remaining from the read pointer
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1100 to the bottom of the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1101 copy_size = queue -> qu_end - source;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1102
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1103 /* Determine if the message needs to be wrapped around the
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1104 edge of the queue area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1105 if (copy_size >= size)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1106 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1107
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1108 /* Copy the whole message at once. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1109 i = (INT) size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1110 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1111 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1112 *(destination) = *(source++);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1113 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1114 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1115 destination++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1116 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1117 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1118 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1119 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1120
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1121 /* Copy the first half of the message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1122 i = (INT) copy_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1123 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1124 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1125 *(destination++) = *(source);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1126 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1127 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1128 source++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1129 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1130
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1131 /* Copy the second half of the message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1132 source = queue -> qu_start;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1133 i = (INT) (size - copy_size);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1134 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1135 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1136 *(destination) = *(source++);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1137 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1138 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1139 destination++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1140 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1141 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1142 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1143
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1144 /* Check again for wrap-around condition on the read pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1145 if (source >= queue -> qu_end)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1146
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1147 /* Move the read pointer to the top of the queue area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1148 queue -> qu_read = queue -> qu_start;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1149 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1150
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1151 /* Move the read pointer to where the copy left off. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1152 queue -> qu_read = source;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1153
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1154 /* Increment the number of available words. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1155 queue -> qu_available = queue -> qu_available + size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1156
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1157 /* Decrement the number of messages in the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1158 queue -> qu_messages--;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1159
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1160 /* Return the number of words received. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1161 *actual_size = size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1162
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1163 #ifdef INCLUDE_PROVIEW
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1164 _RTProf_DumpQueue(RT_PROF_RECEIVE_FROM_QUEUE,queue,RT_PROF_OK);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1165 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1166
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1167 /* Determine if any tasks suspended on a full queue can be woken
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1168 up. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1169 if (queue -> qu_suspension_list)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1170 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1171
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1172 /* Overhead of each queue message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1173 if (!queue -> qu_fixed_size)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1174
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1175 i = 1;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1176 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1177
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1178 i = 0;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1179
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1180 /* Pickup the suspension list and examine suspension blocks
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1181 to see if the message could now fit in the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1182 suspend_ptr = queue -> qu_suspension_list;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1183 preempt = NU_FALSE;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1184 while ((suspend_ptr) &&
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1185 ((suspend_ptr -> qu_message_size + i) <= queue -> qu_available))
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1186 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1187
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1188 /* Place the suspended task's message into the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1189
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1190 /* Setup the source and destination pointers. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1191 source = suspend_ptr -> qu_message_area;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1192 destination = queue -> qu_write;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1193 size = suspend_ptr -> qu_message_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1194
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1195 /* Process according to the type of message supported. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1196 if (queue -> qu_fixed_size)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1197 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1198
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1199 /* Fixed-size messages are supported by this queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1200
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1201 /* Loop to copy the message into the queue area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1202 i = (INT) size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1203 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1204 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1205 *(destination++) = *(source);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1206 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1207 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1208 source++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1209 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1210 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1211 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1212 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1213
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1214 /* Variable-size messages are supported. Processing must
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1215 check for queue wrap-around conditions. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1216
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1217 /* Place message size in first location. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1218 *(destination++) = size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1219
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1220 /* Check for a wrap-around condition on the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1221 if (destination >= queue -> qu_end)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1222
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1223 /* Wrap the write pointer back to the top of the queue
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1224 area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1225 destination = queue -> qu_start;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1226
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1227 /* Decrement the number of words remaining by 1 for this
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1228 extra word of overhead. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1229 queue -> qu_available--;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1230
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1231 /* Calculate the number of words remaining from the write
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1232 pointer to the bottom of the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1233 copy_size = queue -> qu_end - destination;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1234
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1235 /* Determine if the message needs to be wrapped around the
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1236 edge of the queue area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1237 if (copy_size >= size)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1238 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1239
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1240 /* Copy the whole message at once. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1241 i = (INT) size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1242 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1243 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1244 *(destination++) = *(source);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1245 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1246 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1247 source++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1248 } while(1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1249 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1250 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1251 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1252
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1253 /* Copy the first half of the message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1254 i = (INT) copy_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1255 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1256 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1257 *(destination) = *(source++);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1258 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1259 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1260 destination++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1261 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1262
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1263 /* Copy the second half of the message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1264 destination = queue -> qu_start;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1265 i = (INT) (size - copy_size);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1266 do
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1267 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1268 *(destination++) = *(source);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1269 if ((--i) == 0)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1270 break;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1271 source++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1272 } while (1);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1273 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1274 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1275
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1276 /* Check again for wrap-around condition on the write
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1277 pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1278 if (destination >= queue -> qu_end)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1279
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1280 /* Move the write pointer to the top of the queue area. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1281 queue -> qu_write = queue -> qu_start;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1282 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1283
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1284 /* Simply copy the last position of the destination pointer
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1285 into the write pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1286 queue -> qu_write = destination;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1287
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1288 /* Decrement the number of available words. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1289 queue -> qu_available = queue -> qu_available - size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1290
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1291 /* Increment the number of messages in the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1292 queue -> qu_messages++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1293
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1294 /* Decrement the number of tasks waiting counter. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1295 queue -> qu_tasks_waiting--;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1296
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1297 /* Remove the first suspended block from the list. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1298 CSC_Remove_From_List((CS_NODE **)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1299 &(queue -> qu_suspension_list),
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1300 &(suspend_ptr -> qu_suspend_link));
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1301
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1302 /* Return a successful status. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1303 suspend_ptr -> qu_return_status = NU_SUCCESS;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1304
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1305 /* Resume the suspended task. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1306 preempt = preempt |
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1307 TCC_Resume_Task((NU_TASK *) suspend_ptr -> qu_suspended_task,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1308 NU_QUEUE_SUSPEND);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1309
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1310 /* Setup suspend pointer to the head of the list. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1311 suspend_ptr = queue -> qu_suspension_list;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1312
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1313 /* Overhead of each queue message. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1314 if (!queue -> qu_fixed_size)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1315
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1316 i = 1;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1317 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1318
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1319 i = 0;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1320 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1321
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1322 /* Determine if a preempt condition is present. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1323 if (preempt)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1324
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1325 /* Transfer control to the system if the resumed task function
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1326 detects a preemption condition. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1327 TCT_Control_To_System();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1328 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1329 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1330 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1331 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1332
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1333 /* Queue is empty. Determine if the task wants to suspend. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1334 if (suspend)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1335 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1336
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1337 /* Increment the number of tasks waiting on the queue counter. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1338 queue -> qu_tasks_waiting++;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1339
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1340 #ifdef INCLUDE_PROVIEW
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1341 _RTProf_DumpQueue(RT_PROF_RECEIVE_FROM_QUEUE,queue,RT_PROF_WAIT);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1342 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1343
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1344 /* Setup the suspend block and suspend the calling task. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1345 suspend_ptr = &suspend_block;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1346 suspend_ptr -> qu_queue = queue;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1347 suspend_ptr -> qu_suspend_link.cs_next = NU_NULL;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1348 suspend_ptr -> qu_suspend_link.cs_previous = NU_NULL;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1349 suspend_ptr -> qu_message_area = (UNSIGNED_PTR) message;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1350 suspend_ptr -> qu_message_size = size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1351 task = (TC_TCB *) TCT_Current_Thread();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1352 suspend_ptr -> qu_suspended_task = task;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1353
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1354 /* Determine if priority or FIFO suspension is associated with the
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1355 queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1356 if (queue -> qu_fifo_suspend)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1357 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1358
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1359 /* FIFO suspension is required. Link the suspend block into
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1360 the list of suspended tasks on this queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1361 CSC_Place_On_List((CS_NODE **) &(queue -> qu_suspension_list),
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1362 &(suspend_ptr -> qu_suspend_link));
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1363 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1364 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1365 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1366
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1367 /* Get the priority of the current thread so the suspend block
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1368 can be placed in the appropriate place. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1369 suspend_ptr -> qu_suspend_link.cs_priority =
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1370 TCC_Task_Priority(task);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1371
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1372 CSC_Priority_Place_On_List((CS_NODE **)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1373 &(queue -> qu_suspension_list),
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1374 &(suspend_ptr -> qu_suspend_link));
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1375 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1376
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1377 /* Finally, suspend the calling task. Note that the suspension call
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1378 automatically clears the protection on the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1379 TCC_Suspend_Task((NU_TASK *) task, NU_QUEUE_SUSPEND,
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1380 QUC_Cleanup, suspend_ptr, suspend);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1381
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1382 /* Pickup the status of the request. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1383 status = suspend_ptr -> qu_return_status;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1384 *actual_size = suspend_ptr -> qu_actual_size;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1385 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1386 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1387 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1388
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1389 /* Return a status of NU_QUEUE_EMPTY because there are no
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1390 messages in the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1391 status = NU_QUEUE_EMPTY;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1392
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1393 #ifdef INCLUDE_PROVIEW
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1394 _RTProf_DumpQueue(RT_PROF_RECEIVE_FROM_QUEUE,queue,RT_PROF_FAIL);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1395 #endif
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1396
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1397 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1398 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1399
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1400 /* Release protection against access to the queue. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1401 TCT_Unprotect();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1402
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1403 /* Return to user mode */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1404 NU_USER_MODE();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1405
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1406 /* Return the completion status. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1407 return(status);
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1408 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1409
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1410
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1411 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1412 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1413 /* FUNCTION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1414 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1415 /* QUC_Cleanup */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1416 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1417 /* DESCRIPTION */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1418 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1419 /* This function is responsible for removing a suspension block */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1420 /* from a queue. It is not called unless a timeout or a task */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1421 /* terminate is in progress. Note that protection is already in */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1422 /* effect - the same protection at suspension time. This routine */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1423 /* must be called from Supervisor mode in Supervisor/User mode */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1424 /* switching kernels. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1425 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1426 /* CALLED BY */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1427 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1428 /* TCC_Timeout Task timeout */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1429 /* TCC_Terminate Task terminate */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1430 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1431 /* CALLS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1432 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1433 /* CSC_Remove_From_List Remove suspend block from */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1434 /* the suspension list */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1435 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1436 /* INPUTS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1437 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1438 /* information Pointer to suspend block */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1439 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1440 /* OUTPUTS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1441 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1442 /* None */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1443 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1444 /* HISTORY */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1445 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1446 /* DATE REMARKS */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1447 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1448 /* 03-01-1993 Created initial version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1449 /* 04-19-1993 Verified version 1.0 */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1450 /* */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1451 /*************************************************************************/
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1452 VOID QUC_Cleanup(VOID *information)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1453 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1454
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1455 QU_SUSPEND *suspend_ptr; /* Suspension block pointer */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1456 NU_SUPERV_USER_VARIABLES
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1457
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1458 /* Switch to supervisor mode */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1459 NU_SUPERVISOR_MODE();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1460
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1461 /* Use the information pointer as a suspend pointer. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1462 suspend_ptr = (QU_SUSPEND *) information;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1463
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1464 /* By default, indicate that the service timed-out. It really does not
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1465 matter if this function is called from a terminate request since
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1466 the task does not resume. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1467 suspend_ptr -> qu_return_status = NU_TIMEOUT;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1468
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1469 /* Decrement the number of tasks waiting counter. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1470 (suspend_ptr -> qu_queue) -> qu_tasks_waiting--;
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1471
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1472 /* Unlink the suspend block from the suspension list. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1473 if ((suspend_ptr -> qu_queue) -> qu_urgent_list)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1474 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1475 /* Unlink the suspend block from the suspension list. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1476 CSC_Remove_From_List((CS_NODE **)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1477 &((suspend_ptr -> qu_queue) -> qu_urgent_list),
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1478 &(suspend_ptr -> qu_suspend_link));
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1479 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1480 else
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1481 {
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1482 /* Unlink the suspend block from the suspension list. */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1483 CSC_Remove_From_List((CS_NODE **)
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1484 &((suspend_ptr -> qu_queue) -> qu_suspension_list),
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1485 &(suspend_ptr -> qu_suspend_link));
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1486 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1487
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1488 /* Return to user mode */
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1489 NU_USER_MODE();
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1490 }
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1491
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1492
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1493
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1494
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1495
0f80e1e4dce4 src/nucleus: library C code import from FreeNucleus package
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1496