FreeCalypso > hg > fc-tourmaline
comparison src/nucleus/smce.c @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Fri, 16 Oct 2020 06:23:26 +0000 | 
| parents | |
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| -1:000000000000 | 0:4e78acac3d88 | 
|---|---|
| 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 /* smce.c Nucleus PLUS 1.14 */ | |
| 17 /* */ | |
| 18 /* COMPONENT */ | |
| 19 /* */ | |
| 20 /* SM - Semaphore Management */ | |
| 21 /* */ | |
| 22 /* DESCRIPTION */ | |
| 23 /* */ | |
| 24 /* This file contains the error checking routines for the core */ | |
| 25 /* functions of the Semaphore component. This permits easy removal */ | |
| 26 /* of error checking logic when it is not needed. */ | |
| 27 /* */ | |
| 28 /* DATA STRUCTURES */ | |
| 29 /* */ | |
| 30 /* None */ | |
| 31 /* */ | |
| 32 /* FUNCTIONS */ | |
| 33 /* */ | |
| 34 /* SMCE_Create_Semaphore Create a semaphore */ | |
| 35 /* SMCE_Delete_Semaphore Delete a semaphore */ | |
| 36 /* SMCE_Obtain_Semaphore Obtain an instance of a */ | |
| 37 /* semaphore */ | |
| 38 /* SMCE_Release_Semaphore Release an instance of a */ | |
| 39 /* semaphore */ | |
| 40 /* */ | |
| 41 /* DEPENDENCIES */ | |
| 42 /* */ | |
| 43 /* cs_extr.h Common Service functions */ | |
| 44 /* tc_extr.h Thread Control functions */ | |
| 45 /* sm_extr.h Semaphore functions */ | |
| 46 /* */ | |
| 47 /* HISTORY */ | |
| 48 /* */ | |
| 49 /* DATE REMARKS */ | |
| 50 /* */ | |
| 51 /* 03-01-1993 Created initial version 1.0 */ | |
| 52 /* 04-19-1993 Verified version 1.0 */ | |
| 53 /* 05-15-1993 Corrected comment problem in */ | |
| 54 /* the header, making the new */ | |
| 55 /* version 1.0a */ | |
| 56 /* 05-15-1993 Verified version 1.0a */ | |
| 57 /* 03-01-1994 Split original error checking */ | |
| 58 /* file and changed function */ | |
| 59 /* interfaces, resulting in */ | |
| 60 /* version 1.1 */ | |
| 61 /* */ | |
| 62 /* 03-18-1994 Verified version 1.1 */ | |
| 63 /* 04-17-1996 updated to version 1.2 */ | |
| 64 /* 03-24-1998 Released version 1.3. */ | |
| 65 /* 04-17-2002 Released version 1.13m */ | |
| 66 /* 11-07-2002 Released version 1.14 */ | |
| 67 /*************************************************************************/ | |
| 68 #define NU_SOURCE_FILE | |
| 69 | |
| 70 | |
| 71 #include "cs_extr.h" /* Common service functions */ | |
| 72 #include "tc_extr.h" /* Thread control functions */ | |
| 73 #include "sm_extr.h" /* Semaphore functions */ | |
| 74 | |
| 75 | |
| 76 | |
| 77 /*************************************************************************/ | |
| 78 /* */ | |
| 79 /* FUNCTION */ | |
| 80 /* */ | |
| 81 /* SMCE_Create_Semaphore */ | |
| 82 /* */ | |
| 83 /* DESCRIPTION */ | |
| 84 /* */ | |
| 85 /* This function performs error checking on the parameters supplied */ | |
| 86 /* to the create semaphore function. */ | |
| 87 /* */ | |
| 88 /* CALLED BY */ | |
| 89 /* */ | |
| 90 /* Application */ | |
| 91 /* */ | |
| 92 /* CALLS */ | |
| 93 /* */ | |
| 94 /* SMC_Create_Semaphore Actual semaphore create func.*/ | |
| 95 /* */ | |
| 96 /* INPUTS */ | |
| 97 /* */ | |
| 98 /* semaphore_ptr Semaphore control block ptr */ | |
| 99 /* name Semaphore name */ | |
| 100 /* initial_count Initial semaphore instance */ | |
| 101 /* count */ | |
| 102 /* suspend_type Suspension type */ | |
| 103 /* */ | |
| 104 /* OUTPUTS */ | |
| 105 /* */ | |
| 106 /* NU_INVALID_SEMAPHORE Semaphore control block ptr */ | |
| 107 /* is NULL */ | |
| 108 /* NU_INVALID_SUSPEND Semaphore suspension is */ | |
| 109 /* invalid */ | |
| 110 /* */ | |
| 111 /* HISTORY */ | |
| 112 /* */ | |
| 113 /* DATE REMARKS */ | |
| 114 /* */ | |
| 115 /* 03-01-1993 Created initial version 1.0 */ | |
| 116 /* 04-19-1993 Verified version 1.0 */ | |
| 117 /* 03-01-1994 Modified function interface, */ | |
| 118 /* resulting in version 1.1 */ | |
| 119 /* */ | |
| 120 /* 03-18-1994 Verified version 1.1 */ | |
| 121 /* */ | |
| 122 /*************************************************************************/ | |
| 123 STATUS SMCE_Create_Semaphore(NU_SEMAPHORE *semaphore_ptr, CHAR *name, | |
| 124 UNSIGNED initial_count, OPTION suspend_type) | |
| 125 { | |
| 126 | |
| 127 SM_SCB *semaphore; /* Semaphore control blk ptr */ | |
| 128 STATUS status; /* Completion status */ | |
| 129 | |
| 130 | |
| 131 /* Move input semaphore pointer into internal pointer. */ | |
| 132 semaphore = (SM_SCB *) semaphore_ptr; | |
| 133 | |
| 134 /* Check for a NULL semaphore pointer or an already created semaphore. */ | |
| 135 if ((semaphore == NU_NULL) || (semaphore -> sm_id == SM_SEMAPHORE_ID)) | |
| 136 | |
| 137 /* Invalid semaphore control block pointer. */ | |
| 138 status = NU_INVALID_SEMAPHORE; | |
| 139 | |
| 140 else if ((suspend_type != NU_FIFO) && (suspend_type != NU_PRIORITY)) | |
| 141 | |
| 142 /* Invalid suspension type. */ | |
| 143 status = NU_INVALID_SUSPEND; | |
| 144 | |
| 145 else | |
| 146 | |
| 147 /* Call the actual service to create the semaphore. */ | |
| 148 status = SMC_Create_Semaphore(semaphore_ptr, name, initial_count, | |
| 149 suspend_type); | |
| 150 | |
| 151 /* Return completion status. */ | |
| 152 return(status); | |
| 153 } | |
| 154 | |
| 155 | |
| 156 /*************************************************************************/ | |
| 157 /* */ | |
| 158 /* FUNCTION */ | |
| 159 /* */ | |
| 160 /* SMCE_Delete_Semaphore */ | |
| 161 /* */ | |
| 162 /* DESCRIPTION */ | |
| 163 /* */ | |
| 164 /* This function performs error checking on the parameters supplied */ | |
| 165 /* to the delete semaphore function. */ | |
| 166 /* */ | |
| 167 /* CALLED BY */ | |
| 168 /* */ | |
| 169 /* Application */ | |
| 170 /* */ | |
| 171 /* CALLS */ | |
| 172 /* */ | |
| 173 /* SMC_Delete_Semaphore Actual delete semaphore func.*/ | |
| 174 /* */ | |
| 175 /* INPUTS */ | |
| 176 /* */ | |
| 177 /* semaphore_ptr Semaphore control block ptr */ | |
| 178 /* */ | |
| 179 /* OUTPUTS */ | |
| 180 /* */ | |
| 181 /* NU_INVALID_SEMAPHORE Invalid semaphore pointer */ | |
| 182 /* */ | |
| 183 /* HISTORY */ | |
| 184 /* */ | |
| 185 /* DATE REMARKS */ | |
| 186 /* */ | |
| 187 /* 03-01-1993 Created initial version 1.0 */ | |
| 188 /* 04-19-1993 Verified version 1.0 */ | |
| 189 /* 03-01-1994 Modified function interface, */ | |
| 190 /* resulting in version 1.1 */ | |
| 191 /* */ | |
| 192 /* 03-18-1994 Verified version 1.1 */ | |
| 193 /* */ | |
| 194 /*************************************************************************/ | |
| 195 STATUS SMCE_Delete_Semaphore(NU_SEMAPHORE *semaphore_ptr) | |
| 196 { | |
| 197 | |
| 198 SM_SCB *semaphore; /* Semaphore control blk ptr */ | |
| 199 STATUS status; /* Completion status */ | |
| 200 | |
| 201 | |
| 202 /* Move input semaphore pointer into internal pointer. */ | |
| 203 semaphore = (SM_SCB *) semaphore_ptr; | |
| 204 | |
| 205 /* Determine if the semaphore pointer is valid. */ | |
| 206 if ((semaphore) && (semaphore -> sm_id == SM_SEMAPHORE_ID)) | |
| 207 | |
| 208 /* Semaphore pointer is valid, call function to delete it. */ | |
| 209 status = SMC_Delete_Semaphore(semaphore_ptr); | |
| 210 | |
| 211 else | |
| 212 | |
| 213 /* Semaphore pointer is invalid, indicate in completion status. */ | |
| 214 status = NU_INVALID_SEMAPHORE; | |
| 215 | |
| 216 /* Return completion status. */ | |
| 217 return(status); | |
| 218 } | |
| 219 | |
| 220 | |
| 221 /*************************************************************************/ | |
| 222 /* */ | |
| 223 /* FUNCTION */ | |
| 224 /* */ | |
| 225 /* SMCE_Obtain_Semaphore */ | |
| 226 /* */ | |
| 227 /* DESCRIPTION */ | |
| 228 /* */ | |
| 229 /* This function performs error checking on the parameters supplied */ | |
| 230 /* to the obtain semaphore function. */ | |
| 231 /* */ | |
| 232 /* CALLED BY */ | |
| 233 /* */ | |
| 234 /* Application */ | |
| 235 /* */ | |
| 236 /* CALLS */ | |
| 237 /* */ | |
| 238 /* SMC_Obtain_Semaphore Actual function to obtain an */ | |
| 239 /* instance of the semaphore */ | |
| 240 /* TCCE_Suspend_Error Check for illegal suspend */ | |
| 241 /* */ | |
| 242 /* INPUTS */ | |
| 243 /* */ | |
| 244 /* semaphore_ptr Semaphore control block ptr */ | |
| 245 /* suspend Suspension option if full */ | |
| 246 /* */ | |
| 247 /* OUTPUTS */ | |
| 248 /* */ | |
| 249 /* NU_INVALID_SEMAPHORE Invalid semaphore pointer */ | |
| 250 /* NU_INVALID_SUSPEND Suspension from non-task */ | |
| 251 /* */ | |
| 252 /* HISTORY */ | |
| 253 /* */ | |
| 254 /* DATE REMARKS */ | |
| 255 /* */ | |
| 256 /* 03-01-1993 Created initial version 1.0 */ | |
| 257 /* 04-19-1993 Verified version 1.0 */ | |
| 258 /* 03-01-1994 Modified function interface, */ | |
| 259 /* resulting in version 1.1 */ | |
| 260 /* */ | |
| 261 /* 03-18-1994 Verified version 1.1 */ | |
| 262 /* */ | |
| 263 /*************************************************************************/ | |
| 264 STATUS SMCE_Obtain_Semaphore(NU_SEMAPHORE *semaphore_ptr, UNSIGNED suspend) | |
| 265 { | |
| 266 | |
| 267 SM_SCB *semaphore; /* Semaphore control blk ptr */ | |
| 268 STATUS status; /* Completion status */ | |
| 269 | |
| 270 | |
| 271 /* Move input semaphore pointer into internal pointer. */ | |
| 272 semaphore = (SM_SCB *) semaphore_ptr; | |
| 273 | |
| 274 /* Determine if semaphore pointer is invalid. */ | |
| 275 if (semaphore == NU_NULL) | |
| 276 | |
| 277 /* Semaphore pointer is invalid, indicate in completion status. */ | |
| 278 status = NU_INVALID_SEMAPHORE; | |
| 279 | |
| 280 else if (semaphore -> sm_id != SM_SEMAPHORE_ID) | |
| 281 | |
| 282 /* Semaphore pointer is invalid, indicate in completion status. */ | |
| 283 status = NU_INVALID_SEMAPHORE; | |
| 284 | |
| 285 else if ((suspend) && (TCCE_Suspend_Error())) | |
| 286 | |
| 287 /* Suspension from an non-task thread. */ | |
| 288 status = NU_INVALID_SUSPEND; | |
| 289 | |
| 290 else | |
| 291 { | |
| 292 | |
| 293 /* Parameters are valid, call actual function. */ | |
| 294 status = SMC_Obtain_Semaphore(semaphore_ptr, suspend); | |
| 295 } | |
| 296 | |
| 297 /* Return the completion status. */ | |
| 298 return(status); | |
| 299 } | |
| 300 | |
| 301 | |
| 302 /*************************************************************************/ | |
| 303 /* */ | |
| 304 /* FUNCTION */ | |
| 305 /* */ | |
| 306 /* SMCE_Release_Semaphore */ | |
| 307 /* */ | |
| 308 /* DESCRIPTION */ | |
| 309 /* */ | |
| 310 /* This function performs error checking on the parameters supplied */ | |
| 311 /* to the release semaphore function. */ | |
| 312 /* */ | |
| 313 /* CALLED BY */ | |
| 314 /* */ | |
| 315 /* Application */ | |
| 316 /* */ | |
| 317 /* CALLS */ | |
| 318 /* */ | |
| 319 /* SMC_Release_Semaphore Actual release semaphore fct.*/ | |
| 320 /* */ | |
| 321 /* INPUTS */ | |
| 322 /* */ | |
| 323 /* semaphore_ptr Semaphore control block ptr */ | |
| 324 /* */ | |
| 325 /* OUTPUTS */ | |
| 326 /* */ | |
| 327 /* NU_INVALID_SEMAPHORE Invalid semaphore pointer */ | |
| 328 /* */ | |
| 329 /* HISTORY */ | |
| 330 /* */ | |
| 331 /* DATE REMARKS */ | |
| 332 /* */ | |
| 333 /* 03-01-1993 Created initial version 1.0 */ | |
| 334 /* 04-19-1993 Verified version 1.0 */ | |
| 335 /* 03-01-1994 Modified function interface, */ | |
| 336 /* resulting in version 1.1 */ | |
| 337 /* */ | |
| 338 /* 03-18-1994 Verified version 1.1 */ | |
| 339 /* */ | |
| 340 /*************************************************************************/ | |
| 341 STATUS SMCE_Release_Semaphore(NU_SEMAPHORE *semaphore_ptr) | |
| 342 { | |
| 343 | |
| 344 SM_SCB *semaphore; /* Semaphore control blk ptr */ | |
| 345 STATUS status; /* Completion status */ | |
| 346 | |
| 347 | |
| 348 /* Move input semaphore pointer into internal pointer. */ | |
| 349 semaphore = (SM_SCB *) semaphore_ptr; | |
| 350 | |
| 351 /* Determine if semaphore pointer is invalid. */ | |
| 352 if (semaphore == NU_NULL) | |
| 353 | |
| 354 /* Semaphore pointer is invalid, indicate in completion status. */ | |
| 355 status = NU_INVALID_SEMAPHORE; | |
| 356 | |
| 357 else if (semaphore -> sm_id != SM_SEMAPHORE_ID) | |
| 358 | |
| 359 /* Semaphore pointer is invalid, indicate in completion status. */ | |
| 360 status = NU_INVALID_SEMAPHORE; | |
| 361 | |
| 362 else | |
| 363 { | |
| 364 | |
| 365 /* Parameters are valid, call actual function. */ | |
| 366 status = SMC_Release_Semaphore(semaphore_ptr); | |
| 367 } | |
| 368 | |
| 369 /* Return the completion status. */ | |
| 370 return(status); | |
| 371 } | |
| 372 | |
| 373 | |
| 374 | |
| 375 | |
| 376 | |
| 377 | 
