home *** CD-ROM | disk | FTP | other *** search
- /*
- File: IdleList.cpp
-
- Contains: IdleList and IdleListIterator classes.
-
- Owned by: Richard Rodseth
-
- Copyright: © 1993 - 1995 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <7> 5/26/95 RR #1251403: Multithreading naming support
- <6> 5/25/95 jpa List.h --> LinkList.h [1253324]
- <5> 4/4/95 RR #1220104 Use if IsEqual , # 1228161
- RegisterIdle updates frequency if called
- twice
- <4> 1/31/95 RR # 1206909 Rewrote AddIdle/RemoveIdle to
- allow unregister while idling, and
- immediate unregister/reregister
- <3> 9/30/94 RR #1167950 Allow unregistering while idling.
- Unregistering simply flags items, and
- RemoveUnregisteredIdlers removes them
- <2> 9/20/94 RR #1154046 Moved ref counting from Dispatcher
- into IdleList methods so that an
- unregistered part is not released.
- <1> 5/13/94 RR first checked in
- <4> 2/7/94 NP Tiger Team doings.
- <3> 12/20/93 RR interface takes part/frame pairs rather
- than frames
- <2> 12/3/93 TÇ Stop including ODError.h, it is included
- as ErrorDef.h inside Except.h
- <1> 11/16/93 RR first checked in
-
- To Do:
- In Progress:
- */
-
- #ifndef _IDLELIST_
- #include "IdleList.h"
- #endif
-
- #ifndef _LINKLIST_
- #include <LinkList.h>
- #endif
-
- #ifndef _FRAME_
- #include "Frame.xh"
- #endif
-
- #ifndef _PART_
- #include "Part.xh"
- #endif
-
- #ifndef _EXCEPT_
- #include "Except.h"
- #endif
-
- #pragma segment IdleList
-
- inline long Max(long a, long b)
- {
- return a > b ? a : b;
- }
-
- //======================================================================================
- // Class IdleInfo
- //======================================================================================
-
- IdleInfo::IdleInfo(ODPart* part, ODFrame* frame, ODIdleFrequency frequency)
- {
- fPart = part;
- fFrame = frame;
- fIdleFrequency = frequency;
- fLastIdle = 0;
- fRemove = kODFalse;
- }
-
- IdleInfo::~IdleInfo()
- {
- }
-
- ODBoolean IdleInfo::NeedsIdle(ODTicks ticks)
- {
- return ( !fRemove && ((ticks - fLastIdle) >= fIdleFrequency));
- }
-
- ODTicks IdleInfo::NextIdle(ODTicks ticks)
- {
- if (fLastIdle == 0)
- return 0;
- else
- return Max(fLastIdle + fIdleFrequency - ticks, 0);
- }
-
-
- //======================================================================================
- // Class IdleList
- //======================================================================================
-
- IdleList::IdleList()
- {
- }
-
- IdleList::~IdleList()
- {
- fImplementation.DeleteAllLinks();
- }
-
- //-------------------------------------------------------------------------------------
- // IdleList::AddIdle
- //
- // Description
- //-------------------------------------------------------------------------------------
-
- void IdleList::AddIdle(Environment* ev, ODPart* part, ODFrame* frame, ODIdleFrequency frequency)
- {
- LinkedListIterator iter(&fImplementation);
- ODBoolean found = kODFalse;
-
- for (IdleInfo* link = (IdleInfo*) iter.First();iter.IsNotComplete(); link = (IdleInfo*) iter.Next())
- {
- // Skip links that are flagged for removal, because their references have been
- // Released, and there may not have been time to clear the flagged links,
- // eg. during Revert
-
- found = !link->ShouldRemove()
- && ODObjectsAreEqual(ev, link->GetFrame(), frame)
- && ODObjectsAreEqual(ev, link->GetPart(), part);
- if (found)
- {
- // If it's already there, update the frequency in case it's different
- link->SetIdleFrequency(frequency);
- link->SetLastIdle(0);
-
- // Redundant
- // If it's already there, make sure it isn't flagged for removal
- /*if (link->ShouldRemove())
- {
- link->SetShouldRemove(kODFalse);
- part->Acquire(ev);
- if (frame)
- frame->Acquire(ev);
- }
- */
- break;
- }
- }
- if (!found)
- {
- IdleInfo* link = new IdleInfo(part, frame, frequency);
- if (link)
- {
- fImplementation.AddLast(link);
- part->Acquire(ev);
- if (frame)
- frame->Acquire(ev);
- }
- else
- THROW(kODErrOutOfMemory);
- }
- }
-
- //-------------------------------------------------------------------------------------
- // IdleList::RemoveIdle
- //
- // Description
- //-------------------------------------------------------------------------------------
-
- void IdleList::RemoveIdle(Environment* ev, ODPart* part, ODFrame* frame)
- {
- // To allow removal while idling, we just flag
- // "removed" items here.
- // They are cleared by RemoveUnregisteredIdlers
-
- LinkedListIterator iter(&fImplementation);
- ODBoolean found = kODFalse;
-
- for (IdleInfo* link = (IdleInfo*) iter.First();iter.IsNotComplete(); link = (IdleInfo*) iter.Next())
- {
- // Skip links that are flagged for removal, because their references have been
- // Released, and there may not have been time to clear the flagged links,
- // eg. during Revert
- found = !link->ShouldRemove()
- && ODObjectsAreEqual(ev, link->GetFrame(), frame)
- && ODObjectsAreEqual(ev, link->GetPart(), part);
- if (found)
- {
- //if (link->ShouldRemove() == kODFalse)
- //{
- link->SetShouldRemove(kODTrue);
- part->Release(ev);
- if (frame)
- frame->Release(ev);
- //}
- break;
- }
- }
- }
-
- //-------------------------------------------------------------------------------------
- // IdleList::RemoveUnregisteredIdlers
- //
- // Description
- //-------------------------------------------------------------------------------------
-
- void IdleList::RemoveUnregisteredIdlers(Environment* ev)
- {
- LinkedListIterator iter(&fImplementation);
-
- for (IdleInfo* link = (IdleInfo*) iter.First();iter.IsNotComplete(); link = (IdleInfo*) iter.Next())
- {
- if (link->ShouldRemove())
- {
- iter.RemoveCurrent();
- delete link;
- }
- }
- }
-
- //-------------------------------------------------------------------------------------
- // IdleList::SetIdleFrequency
- //
- // Description
- //-------------------------------------------------------------------------------------
-
- void IdleList::SetIdleFrequency(Environment* ev, ODPart* part, ODFrame* frame, ODIdleFrequency frequency)
- {
- LinkedListIterator iter(&fImplementation);
- ODBoolean found = kODFalse;
-
- for (IdleInfo* link = (IdleInfo*) iter.First();iter.IsNotComplete(); link = (IdleInfo*) iter.Next())
- {
- // Skip links that are flagged for removal, because their references have been
- // Released, and there may not have been time to clear the flagged links,
- // eg. during Revert
- found = !link->ShouldRemove()
- && ODObjectsAreEqual(ev, link->GetFrame(), frame)
- && ODObjectsAreEqual(ev, link->GetPart(), part);
- if (found)
- {
- link->SetIdleFrequency(frequency);
- link->SetLastIdle(0);
- break;
- }
- }
- }
-
-
- //=====================================================================================
- // IdleListIterator Methods
- //=====================================================================================
-
- //-------------------------------------------------------------------------------------
- // IdleListIterator::IdleListIterator
- //
- // Description
- //-------------------------------------------------------------------------------------
-
- IdleListIterator::IdleListIterator(IdleList* idleList)
- : fIterator(&(idleList->fImplementation))
- {
- }
-
- //-------------------------------------------------------------------------------------
- // IdleListIterator::~IdleListIterator
- //
- // Description
- //-------------------------------------------------------------------------------------
-
- IdleListIterator::~IdleListIterator()
- {
- }
-
- //-------------------------------------------------------------------------------------
- // IdleListIterator::First
- //
- // Description
- //-------------------------------------------------------------------------------------
-
- IdleInfo* IdleListIterator::First()
- {
- return (IdleInfo*) fIterator.First();
- }
-
- //-------------------------------------------------------------------------------------
- // IdleListIterator::Next
- //
- // Description
- //-------------------------------------------------------------------------------------
-
- IdleInfo* IdleListIterator::Next()
- {
- return (IdleInfo*) fIterator.Next();
- }
-
- //-------------------------------------------------------------------------------------
- // IdleListIterator::IsNotComplete
- //
- // Description
- //-------------------------------------------------------------------------------------
-
- ODBoolean IdleListIterator::IsNotComplete()
- {
- return fIterator.IsNotComplete();
- }
-
-