keith@nih-csl.UUCP (keith gorlen) (01/29/88)
Object-Oriented Program Support Class Library Corrections 28-Jan-88
Class SharedQueue:
If a SharedQueue is full the function SharedQueue::printOn() doesn't
print the objects in the queue. This bug occurs in all versions of
OOPS sent out before 28-Jan-88. Here is a corrected version of
SharedQueue::printOn():
void SharedQueue::printOn(ostream& strm)
{
strm << className() << "(\n";
strm << "valueAvailable " << valueAvailable;
strm << "spaceAvailable " << spaceAvailable;
strm << "queue:\n";
int i = readPosition;
for (int n = valueAvailable.value(); n>0; n--) {
queue[i++]->printOn(strm);
strm << "\n";
if (i == queue.capacity()) i = 0;
}
strm << ")\n";
}
Class Semaphore:
On 30-Dec-87 Semaphore::signal() was changed. A parameter "n" was
added to signal the next "n" waiting processes, but the change caused
a signal(1) to incorrectly increment "count" by 2 if "count" was 0.
This problem occurs in all versions of OOPS sent out between 30-Dec-87
and 28-Jan-88. Here is a corrected version of Semaphore::signal():
void Semaphore::signal(unsigned n)
{
if (n == 0) return;
AST_DISABLE;
register Process* next;
while (count<0 && n>0) {
next = (Process*)waitList.removeFirst();
if (next->state() != TERMINATED) {
next->resume();
n--;
}
count++;
}
count += n;
AST_ENABLE;
}
--
Keith Gorlen phone: (301) 496-5363
Building 12A, Room 2017 uucp: uunet!ncifcrf.gov!nih-csl!keith
National Institutes of Health Internet: keith%nih-csl@ncifcrf.gov
Bethesda, MD 20892