Mercurial > ecos
comparison packages/kernel/current/src/sync/mutex.cxx @ 208:e0c0827131d1 ecos
Merge from eCos master repository on 2002-05-20-20:11:54-BST
| author | jlarmour |
|---|---|
| date | Mon, 20 May 2002 22:19:26 +0000 |
| parents | f62680ef1804 |
| children | d2c90368aeef |
comparison
equal
deleted
inserted
replaced
| 207:74c807ddde34 | 208:e0c0827131d1 |
|---|---|
| 3 // sync/mutex.cxx | 3 // sync/mutex.cxx |
| 4 // | 4 // |
| 5 // Mutex and condition variable implementation | 5 // Mutex and condition variable implementation |
| 6 // | 6 // |
| 7 //========================================================================== | 7 //========================================================================== |
| 8 //####COPYRIGHTBEGIN#### | 8 //####ECOSGPLCOPYRIGHTBEGIN#### |
| 9 // | 9 // ------------------------------------------- |
| 10 // ------------------------------------------- | 10 // This file is part of eCos, the Embedded Configurable Operating System. |
| 11 // The contents of this file are subject to the Red Hat eCos Public License | 11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
| 12 // Version 1.1 (the "License"); you may not use this file except in | 12 // |
| 13 // compliance with the License. You may obtain a copy of the License at | 13 // eCos is free software; you can redistribute it and/or modify it under |
| 14 // http://www.redhat.com/ | 14 // the terms of the GNU General Public License as published by the Free |
| 15 // | 15 // Software Foundation; either version 2 or (at your option) any later version. |
| 16 // Software distributed under the License is distributed on an "AS IS" | 16 // |
| 17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the | 17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
| 18 // License for the specific language governing rights and limitations under | 18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 19 // the License. | 19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 20 // | 20 // for more details. |
| 21 // The Original Code is eCos - Embedded Configurable Operating System, | 21 // |
| 22 // released September 30, 1998. | 22 // You should have received a copy of the GNU General Public License along |
| 23 // | 23 // with eCos; if not, write to the Free Software Foundation, Inc., |
| 24 // The Initial Developer of the Original Code is Red Hat. | 24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
| 25 // Portions created by Red Hat are | 25 // |
| 26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. | 26 // As a special exception, if other files instantiate templates or use macros |
| 27 // All Rights Reserved. | 27 // or inline functions from this file, or you compile this file and link it |
| 28 // ------------------------------------------- | 28 // with other works to produce a work based on this file, this file does not |
| 29 // | 29 // by itself cause the resulting work to be covered by the GNU General Public |
| 30 //####COPYRIGHTEND#### | 30 // License. However the source code for this file must still be made available |
| 31 // in accordance with section (3) of the GNU General Public License. | |
| 32 // | |
| 33 // This exception does not invalidate any other reasons why a work based on | |
| 34 // this file might be covered by the GNU General Public License. | |
| 35 // | |
| 36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. | |
| 37 // at http://sources.redhat.com/ecos/ecos-license | |
| 38 // ------------------------------------------- | |
| 39 //####ECOSGPLCOPYRIGHTEND#### | |
| 31 //========================================================================== | 40 //========================================================================== |
| 32 //#####DESCRIPTIONBEGIN#### | 41 //#####DESCRIPTIONBEGIN#### |
| 33 // | 42 // |
| 34 // Author(s): nickg | 43 // Author(s): nickg |
| 35 // Contributors: nickg, jlarmour | 44 // Contributors: nickg, jlarmour |
| 63 | 72 |
| 64 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DYNAMIC | 73 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DYNAMIC |
| 65 | 74 |
| 66 #define IF_PROTOCOL_INHERIT if( protocol == INHERIT ) | 75 #define IF_PROTOCOL_INHERIT if( protocol == INHERIT ) |
| 67 #define IF_PROTOCOL_CEILING if( protocol == CEILING ) | 76 #define IF_PROTOCOL_CEILING if( protocol == CEILING ) |
| 77 #define IF_PROTOCOL_ACTIVE if( protocol != NONE ) | |
| 68 | 78 |
| 69 #else | 79 #else |
| 70 | 80 |
| 71 #define IF_PROTOCOL_INHERIT | 81 #define IF_PROTOCOL_INHERIT |
| 72 #define IF_PROTOCOL_CEILING | 82 #define IF_PROTOCOL_CEILING |
| 83 #define IF_PROTOCOL_ACTIVE | |
| 73 | 84 |
| 74 #endif | 85 #endif |
| 75 | 86 |
| 76 // ------------------------------------------------------------------------- | 87 // ------------------------------------------------------------------------- |
| 77 // Constructor | 88 // Constructor |
| 219 // thread grabbing the mutex between the wakeup in unlock() and | 230 // thread grabbing the mutex between the wakeup in unlock() and |
| 220 // this thread actually starting. | 231 // this thread actually starting. |
| 221 | 232 |
| 222 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL | 233 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL |
| 223 | 234 |
| 224 self->count_mutex(); | 235 IF_PROTOCOL_ACTIVE |
| 236 self->count_mutex(); | |
| 225 | 237 |
| 226 #endif | 238 #endif |
| 227 | 239 |
| 228 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING | 240 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING |
| 229 | 241 |
| 282 } | 294 } |
| 283 else | 295 else |
| 284 { | 296 { |
| 285 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL | 297 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL |
| 286 | 298 |
| 287 self->uncount_mutex(); | 299 IF_PROTOCOL_ACTIVE |
| 300 self->uncount_mutex(); | |
| 288 | 301 |
| 289 #endif | 302 #endif |
| 290 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT | 303 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT |
| 291 | 304 |
| 292 IF_PROTOCOL_INHERIT | 305 IF_PROTOCOL_INHERIT |
| 335 locked = true; | 348 locked = true; |
| 336 owner = self; | 349 owner = self; |
| 337 | 350 |
| 338 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL | 351 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL |
| 339 | 352 |
| 340 self->count_mutex(); | 353 IF_PROTOCOL_ACTIVE |
| 354 self->count_mutex(); | |
| 341 | 355 |
| 342 #endif | 356 #endif |
| 343 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING | 357 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING |
| 344 | 358 |
| 345 IF_PROTOCOL_CEILING | 359 IF_PROTOCOL_CEILING |
| 403 | 417 |
| 404 } | 418 } |
| 405 | 419 |
| 406 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL | 420 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL |
| 407 | 421 |
| 408 owner->uncount_mutex(); | 422 IF_PROTOCOL_ACTIVE |
| 423 owner->uncount_mutex(); | |
| 409 | 424 |
| 410 #endif | 425 #endif |
| 411 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT | 426 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT |
| 412 | 427 |
| 413 IF_PROTOCOL_INHERIT | 428 IF_PROTOCOL_INHERIT |
