ftp.nice.ch/pub/next/developer/resources/libraries/libobjects.0.1.0.s.tar.gz#/libobjects-0.1.0/RetainingNotifier.m

This is RetainingNotifier.m in view mode; [Download] [Up]

/* Implementation of reference-counted invalidation notifer object
   Copyright (C) 1993,1994 Free Software Foundation, Inc.
   
   Written by:  R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
   Date: July 1994
   
   This file is part of the GNU Objective C Class Library.

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.
   
   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.
   
   You should have received a copy of the GNU Library General Public
   License along with this library; if not, write to the Free
   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */ 

/* Reference Counted object with invalidation notification 
   This object is just temporary.  Eventually, we should separate 
   reference counting functionality from notification functionality */

#include <objects/RetainingNotifier.h>
#include <objects/InvalidationListening.h>
#include <assert.h>

/* Use this for now, but GNU should switch to a GC pool
   and separate notification. */

/* I really need to check the use of locks here */

@implementation RetainingNotifier

+ initialize
{
  /* What goes here? */
  return self;
}

- init
{
  retain_count = 0;
  isValid = YES;
  refGate = [[Lock alloc] init];
  notificationList = [[List alloc] init];
  return self;
}

- (void) dealloc
{
  [refGate free];
  [notificationList free];
  [super free];
  return;
}

- (oneway void) release
{
  [refGate lock];
  if (retain_count--)
    {
      [refGate unlock];
      return;
    }
  [refGate unlock];
  [self dealloc];
  return;
}

- (id) retain
{
  [refGate lock];
  retain_count++;
  [refGate unlock];
  return self;
}

- free
{
  [self release];
  return nil;
}

- (unsigned) retainCount
{
  return retain_count;
}

- registerForInvalidationNotification:  (id <InvalidationListening>)anObject
{
  assert(refGate);
  [refGate lock];
  [notificationList addObjectIfAbsent: anObject];
  [refGate unlock];
  return self;
}
  
- unregisterForInvalidationNotification: (id <InvalidationListening>)anObject
{
  assert(refGate);
  [refGate lock];
  [notificationList removeObject: anObject];
  [refGate unlock];
  return self;
}

- (BOOL) isValid
{
  return isValid;
}

/* change name to -postInvalidation */
- invalidate
{
  if (isValid == NO)
    return nil;
  [refGate lock];
  isValid = NO;
  [notificationList makeObjectsPerform:@selector(senderIsInvalid:) with:self];
  [refGate unlock];
  return self;
}


- copy
{
  RetainingNotifier *newCopy = nil;

  if (isValid)
    {
      [refGate lock];
      newCopy = [[[self class] alloc] init];
      [newCopy->notificationList appendList:notificationList];
      newCopy->retain_count = retain_count;
      [refGate unlock];
    }
  return newCopy;
}

@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.