FreeCalypso > hg > ffs-editor
comparison src/nucleus/sms.c @ 0:92470e5d0b9e
src: partial import from FC Selenite
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Fri, 15 May 2020 01:28:16 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:92470e5d0b9e |
|---|---|
| 1 /*************************************************************************/ | |
| 2 /* */ | |
| 3 /* Copyright Mentor Graphics Corporation 2002 */ | |
| 4 /* All Rights Reserved. */ | |
| 5 /* */ | |
| 6 /* THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS */ | |
| 7 /* THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS */ | |
| 8 /* SUBJECT TO LICENSE TERMS. */ | |
| 9 /* */ | |
| 10 /*************************************************************************/ | |
| 11 | |
| 12 /*************************************************************************/ | |
| 13 /* */ | |
| 14 /* FILE NAME VERSION */ | |
| 15 /* */ | |
| 16 /* sms.c Nucleus PLUS 1.14 */ | |
| 17 /* */ | |
| 18 /* COMPONENT */ | |
| 19 /* */ | |
| 20 /* SM - Semaphore Management */ | |
| 21 /* */ | |
| 22 /* DESCRIPTION */ | |
| 23 /* */ | |
| 24 /* This file contains the supplemental routines for the Semaphore */ | |
| 25 /* Management component. */ | |
| 26 /* */ | |
| 27 /* DATA STRUCTURES */ | |
| 28 /* */ | |
| 29 /* None */ | |
| 30 /* */ | |
| 31 /* FUNCTIONS */ | |
| 32 /* */ | |
| 33 /* SMS_Reset_Semaphore Reset semaphore */ | |
| 34 /* terminate condition */ | |
| 35 /* */ | |
| 36 /* DEPENDENCIES */ | |
| 37 /* */ | |
| 38 /* cs_extr.h Common Service functions */ | |
| 39 /* tc_extr.h Thread Control functions */ | |
| 40 /* sm_extr.h Semaphore functions */ | |
| 41 /* hi_extr.h History functions */ | |
| 42 /* */ | |
| 43 /* HISTORY */ | |
| 44 /* */ | |
| 45 /* DATE REMARKS */ | |
| 46 /* */ | |
| 47 /* 03-01-1994 Created initial version 1.1 from */ | |
| 48 /* routines originally in core */ | |
| 49 /* */ | |
| 50 /* 03-18-1994 Verified version 1.1 */ | |
| 51 /* 04-17-1996 updated to version 1.2 */ | |
| 52 /* 03-24-1998 Released version 1.3. */ | |
| 53 /* 03-26-1999 Released 1.11m (new release */ | |
| 54 /* numbering scheme) */ | |
| 55 /* 04-17-2002 Released version 1.13m */ | |
| 56 /* 11-07-2002 Released version 1.14 */ | |
| 57 /*************************************************************************/ | |
| 58 #define NU_SOURCE_FILE | |
| 59 | |
| 60 | |
| 61 #include "cs_extr.h" /* Common service functions */ | |
| 62 #include "tc_extr.h" /* Thread control functions */ | |
| 63 #include "sm_extr.h" /* Semaphore functions */ | |
| 64 #include "hi_extr.h" /* History functions */ | |
| 65 #include "profiler.h" /* ProView interface */ | |
| 66 | |
| 67 | |
| 68 | |
| 69 /*************************************************************************/ | |
| 70 /* */ | |
| 71 /* FUNCTION */ | |
| 72 /* */ | |
| 73 /* SMS_Reset_Semaphore */ | |
| 74 /* */ | |
| 75 /* DESCRIPTION */ | |
| 76 /* */ | |
| 77 /* This function resets a semaphore back to the initial state. All */ | |
| 78 /* tasks suspended on the semaphore are resumed with the reset */ | |
| 79 /* completion status. */ | |
| 80 /* */ | |
| 81 /* CALLED BY */ | |
| 82 /* */ | |
| 83 /* Application */ | |
| 84 /* SMSE_Reset_Semaphore Error checking shell */ | |
| 85 /* */ | |
| 86 /* CALLS */ | |
| 87 /* */ | |
| 88 /* [HIC_Make_History_Entry] Make entry in history log */ | |
| 89 /* TCC_Resume_Task Resume a suspended task */ | |
| 90 /* [TCT_Check_Stack] Stack checking function */ | |
| 91 /* TCT_Control_To_System Transfer control to system */ | |
| 92 /* TCT_System_Protect Protect semaphore */ | |
| 93 /* TCT_Unprotect Release protection */ | |
| 94 /* */ | |
| 95 /* INPUTS */ | |
| 96 /* */ | |
| 97 /* semaphore_ptr Semaphore control block ptr */ | |
| 98 /* initial_count Initial count to reset the */ | |
| 99 /* semaphore to */ | |
| 100 /* */ | |
| 101 /* OUTPUTS */ | |
| 102 /* */ | |
| 103 /* NU_SUCCESS */ | |
| 104 /* */ | |
| 105 /* HISTORY */ | |
| 106 /* */ | |
| 107 /* DATE REMARKS */ | |
| 108 /* */ | |
| 109 /* 03-01-1993 Created initial version 1.0 */ | |
| 110 /* 04-19-1993 Verified version 1.0 */ | |
| 111 /* 03-01-1994 Changed function interface to */ | |
| 112 /* match the prototype, added */ | |
| 113 /* register variable logic, */ | |
| 114 /* optimized protection logic, */ | |
| 115 /* resulting in version 1.1 */ | |
| 116 /* */ | |
| 117 /* 03-18-1994 Verified version 1.1 */ | |
| 118 /* */ | |
| 119 /*************************************************************************/ | |
| 120 STATUS SMS_Reset_Semaphore(NU_SEMAPHORE *semaphore_ptr, | |
| 121 UNSIGNED initial_count) | |
| 122 { | |
| 123 | |
| 124 R1 SM_SCB *semaphore; /* Semaphore control blk ptr */ | |
| 125 R2 SM_SUSPEND *suspend_ptr; /* Suspend block pointer */ | |
| 126 R3 SM_SUSPEND *next_ptr; /* Next suspend block pointer*/ | |
| 127 STATUS preempt; /* Status for resume call */ | |
| 128 NU_SUPERV_USER_VARIABLES | |
| 129 | |
| 130 /* Switch to supervisor mode */ | |
| 131 NU_SUPERVISOR_MODE(); | |
| 132 | |
| 133 /* Move input semaphore pointer into internal pointer. */ | |
| 134 semaphore = (SM_SCB *) semaphore_ptr; | |
| 135 | |
| 136 #ifdef NU_ENABLE_STACK_CHECK | |
| 137 | |
| 138 /* Call stack checking function to check for an overflow condition. */ | |
| 139 TCT_Check_Stack(); | |
| 140 | |
| 141 #endif | |
| 142 | |
| 143 #ifdef NU_ENABLE_HISTORY | |
| 144 | |
| 145 /* Make an entry that corresponds to this function in the system history | |
| 146 log. */ | |
| 147 HIC_Make_History_Entry(NU_RESET_SEMAPHORE_ID, (UNSIGNED) semaphore, | |
| 148 (UNSIGNED) initial_count, (UNSIGNED) 0); | |
| 149 | |
| 150 #endif | |
| 151 | |
| 152 /* Protect against access to the semaphore. */ | |
| 153 TCT_System_Protect(); | |
| 154 | |
| 155 /* Pickup the suspended task pointer list. */ | |
| 156 suspend_ptr = semaphore -> sm_suspension_list; | |
| 157 | |
| 158 /* Walk the chain task(s) currently suspended on the semaphore. */ | |
| 159 preempt = 0; | |
| 160 while (suspend_ptr) | |
| 161 { | |
| 162 | |
| 163 /* Resume the suspended task. Insure that the status returned is | |
| 164 NU_SEMAPHORE_RESET. */ | |
| 165 suspend_ptr -> sm_return_status = NU_SEMAPHORE_RESET; | |
| 166 | |
| 167 /* Point to the next suspend structure in the link. */ | |
| 168 next_ptr = (SM_SUSPEND *) (suspend_ptr -> sm_suspend_link.cs_next); | |
| 169 | |
| 170 /* Resume the specified task. */ | |
| 171 preempt = preempt | | |
| 172 TCC_Resume_Task((NU_TASK *) suspend_ptr -> sm_suspended_task, | |
| 173 NU_SEMAPHORE_SUSPEND); | |
| 174 | |
| 175 /* Determine if the next is the same as the current pointer. */ | |
| 176 if (next_ptr == semaphore -> sm_suspension_list) | |
| 177 | |
| 178 /* Clear the suspension pointer to signal the end of the list | |
| 179 traversal. */ | |
| 180 suspend_ptr = NU_NULL; | |
| 181 else | |
| 182 | |
| 183 /* Move the next pointer into the suspend block pointer. */ | |
| 184 suspend_ptr = next_ptr; | |
| 185 } | |
| 186 | |
| 187 /* Initialize the semaphore. */ | |
| 188 semaphore -> sm_semaphore_count = initial_count; | |
| 189 semaphore -> sm_tasks_waiting = 0; | |
| 190 semaphore -> sm_suspension_list = NU_NULL; | |
| 191 | |
| 192 #ifdef INCLUDE_PROVIEW | |
| 193 _RTProf_DumpSema(RT_PROF_RESET_SEMAPHORE,(SM_SCB *) semaphore, RT_PROF_OK); | |
| 194 #endif | |
| 195 | |
| 196 /* Determine if preemption needs to occur. */ | |
| 197 if (preempt) | |
| 198 | |
| 199 /* Transfer control to system to facilitate preemption. */ | |
| 200 TCT_Control_To_System(); | |
| 201 | |
| 202 /* Release protection against access to the semaphore. */ | |
| 203 TCT_Unprotect(); | |
| 204 | |
| 205 /* Return to user mode */ | |
| 206 NU_USER_MODE(); | |
| 207 | |
| 208 /* Return a successful completion. */ | |
| 209 return(NU_SUCCESS); | |
| 210 } | |
| 211 | |
| 212 | |
| 213 | |
| 214 |
