You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.7 KiB
97 lines
3.7 KiB
#ifndef _THREAD_SAFE_HPP_
|
|
#define _THREAD_SAFE_HPP_
|
|
// Ruler
|
|
// 1 2 3 4 5 6 7 8
|
|
//345678901234567890123456789012345678901234567890123456789012345678901234567890
|
|
|
|
/********************************************************************/
|
|
/* */
|
|
/* The standard layout. */
|
|
/* */
|
|
/* The standard layout for 'hpp' files for this code is as */
|
|
/* follows: */
|
|
/* */
|
|
/* 1. Include files. */
|
|
/* 2. Constants exported from the class. */
|
|
/* 3. Data structures exported from the class. */
|
|
/* 4. Forward references to other data structures. */
|
|
/* 5. Class specifications (including inline functions). */
|
|
/* 6. Additional large inline functions. */
|
|
/* */
|
|
/* Any portion that is not required is simply omitted. */
|
|
/* */
|
|
/********************************************************************/
|
|
|
|
#include "Global.hpp"
|
|
|
|
#include "Assembly.hpp"
|
|
#include "Spinlock.hpp"
|
|
|
|
/********************************************************************/
|
|
/* */
|
|
/* Track the need for locks. */
|
|
/* */
|
|
/* Although it may seem simple to know whether to take a lock */
|
|
/* there are addition complications such as recursive cases. */
|
|
/* We have colected all the messy code into this class. */
|
|
/* */
|
|
/********************************************************************/
|
|
|
|
class THREAD_SAFE : public ASSEMBLY
|
|
{
|
|
//
|
|
// Private data.
|
|
//
|
|
// All the locking information is held here so as
|
|
// to simplify the code.
|
|
//
|
|
SBIT32 Claim;
|
|
SBIT32 Owner;
|
|
SBIT32 Recursive;
|
|
SPINLOCK Spinlock;
|
|
BOOLEAN ThreadSafe;
|
|
|
|
public:
|
|
//
|
|
// Public functions.
|
|
//
|
|
// The translation functionality supplied by this
|
|
// class is only applicable after an allocation
|
|
// has been made. Hence, all of the APIs supported
|
|
// relate to the need to translate an allocation
|
|
// address to the host page description.
|
|
//
|
|
THREAD_SAFE( BOOLEAN NewThreadSafe );
|
|
|
|
BOOLEAN ClaimGlobalLock( VOID );
|
|
|
|
VOID EngageGlobalLock( VOID );
|
|
|
|
BOOLEAN ReleaseGlobalLock( BOOLEAN Force = False );
|
|
|
|
~THREAD_SAFE( VOID );
|
|
|
|
//
|
|
// Public inline functions.
|
|
//
|
|
// Although this class is perhaps the most self
|
|
// contained. Nonetheless, there is still lots
|
|
// of situations when other classes need to
|
|
// interact and get information about the current
|
|
// situation.
|
|
//
|
|
INLINE BOOLEAN ClaimActiveLock( VOID )
|
|
{ return ((ThreadSafe) && (GetThreadId() != Owner)); }
|
|
|
|
private:
|
|
//
|
|
// Disabled operations.
|
|
//
|
|
// All copy constructors and class assignment
|
|
// operations are disabled.
|
|
//
|
|
THREAD_SAFE( CONST THREAD_SAFE & Copy );
|
|
|
|
VOID operator=( CONST THREAD_SAFE & Copy );
|
|
};
|
|
#endif
|