version 1.2, 2006/07/11 18:39:28
|
version 1.8, 2008/12/02 09:00:48
|
|
|
//%2006//////////////////////////////////////////////////////////////////////// |
//%LICENSE//////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development |
// Licensed to The Open Group (TOG) under one or more contributor license |
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. |
// agreements. Refer to the OpenPegasusNOTICE.txt file distributed with |
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.; |
// this work for additional information regarding copyright ownership. |
// IBM Corp.; EMC Corporation, The Open Group. |
// Each contributor licenses this file to you under the OpenPegasus Open |
// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; |
// Source License; you may not use this file except in compliance with the |
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. |
// License. |
// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
|
// EMC Corporation; VERITAS Software Corporation; The Open Group. |
|
// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
|
// EMC Corporation; Symantec Corporation; The Open Group. |
|
// | // |
// Permission is hereby granted, free of charge, to any person obtaining a copy |
// Permission is hereby granted, free of charge, to any person obtaining a |
// of this software and associated documentation files (the "Software"), to |
// copy of this software and associated documentation files (the "Software"), |
// deal in the Software without restriction, including without limitation the |
// to deal in the Software without restriction, including without limitation |
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
// the rights to use, copy, modify, merge, publish, distribute, sublicense, |
// sell copies of the Software, and to permit persons to whom the Software is |
// and/or sell copies of the Software, and to permit persons to whom the |
// furnished to do so, subject to the following conditions: |
// Software is furnished to do so, subject to the following conditions: |
// | // |
// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN |
// The above copyright notice and this permission notice shall be included |
// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED |
// in all copies or substantial portions of the Software. |
// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT |
|
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR |
|
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
|
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
// | // |
//============================================================================== |
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
|
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
|
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
|
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
// | // |
// Author: Mike Brasher (m.brasher@inovadevelopment.com) |
////////////////////////////////////////////////////////////////////////// |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
|
|
| |
/** no-op try_lock(). | /** no-op try_lock(). |
*/ | */ |
void try_lock() { } |
Boolean try_lock() { return true; } |
| |
/** no-op unlock(). | /** no-op unlock(). |
*/ | */ |
|
|
| |
void clear(); | void clear(); |
| |
size_t size() const { return _size; } |
Uint32 size() const { return _size; } |
| |
size_t empty() const { return _size == 0; } |
Boolean empty() const { return _size == 0; } |
| |
Linkable* front() { return _front; } | Linkable* front() { return _front; } |
| |
|
|
Magic<0x6456FD0A> _magic; | Magic<0x6456FD0A> _magic; |
Linkable* _front; | Linkable* _front; |
Linkable* _back; | Linkable* _back; |
size_t _size; |
Uint32 _size; |
void (*_destructor)(Linkable*); | void (*_destructor)(Linkable*); |
}; | }; |
| |
|
|
| |
- NullLock - no locking at all. | - NullLock - no locking at all. |
- Mutex - non-recursive mutex. | - Mutex - non-recursive mutex. |
- RecursiveMutex - recursive mutex. |
- Mutex - recursive mutex. |
| |
Now we consider an example. So you want to create a list of Person | Now we consider an example. So you want to create a list of Person |
elements. First you must derive from the Linkable class as shown below. | elements. First you must derive from the Linkable class as shown below. |
|
|
\code | \code |
List<Person, NullLink>; // Do no synchronization. | List<Person, NullLink>; // Do no synchronization. |
List<Person, Mutex>; // Use Mutex class to synchronize. | List<Person, Mutex>; // Use Mutex class to synchronize. |
List<Person, RecursiveMutex>; // Use RecursiveMutex class to synchronize. |
List<Person, Mutex>; // Use Mutex class to synchronize. |
\endcode | \endcode |
| |
Finally, use the list. The following example adds three Person objects | Finally, use the list. The following example adds three Person objects |
to the back of the list and removes one from the front. | to the back of the list and removes one from the front. |
| |
\code | \code |
typedef List<Person, RecursiveMutex> PersonList; |
typedef List<Person, Mutex> PersonList; |
PersonList list; | PersonList list; |
| |
list.insert_back(new Person("John")); | list.insert_back(new Person("John")); |
|
|
| |
/** Returns the number of elements in the list. | /** Returns the number of elements in the list. |
*/ | */ |
size_t size() const |
Uint32 size() const |
{ | { |
AutoLock al(*this); | AutoLock al(*this); |
return _rep.size(); | return _rep.size(); |
|
|
| |
/** Returns true if the list is empty (i.e., has zero elements). | /** Returns true if the list is empty (i.e., has zero elements). |
*/ | */ |
size_t is_empty() const |
Boolean is_empty() const |
{ | { |
AutoLock al(*this); | AutoLock al(*this); |
return _rep.empty(); | return _rep.empty(); |
|
|
*/ | */ |
void lock() { _lock.lock(); } | void lock() { _lock.lock(); } |
| |
/** Try to lock the list. |
/** Try to lock the list without blocking. |
|
@return A Boolean indicating whether the lock was acquired. |
*/ | */ |
void try_lock() { _lock.try_lock(); } |
Boolean try_lock() { return _lock.try_lock(); } |
| |
/** Unlock the list. | /** Unlock the list. |
*/ | */ |