Ignore:
Timestamp:
Jun 9, 2001, 4:50:26 PM (24 years ago)
Author:
sandervl
Message:

reference count (window + class objects) rewrite

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/gen_object.cpp

    r5083 r5935  
    1 /* $Id: gen_object.cpp,v 1.7 2001-02-10 10:31:31 sandervl Exp $ */
     1/* $Id: gen_object.cpp,v 1.8 2001-06-09 14:50:17 sandervl Exp $ */
    22/*
    33 * Generic Object Class for OS/2
     
    1616#include <win32type.h>
    1717#include <gen_object.h>
    18 #include <vmutex.h>
    1918
    2019#define DBG_LOCALLOG    DBG_gen_object
    2120#include "dbglocal.h"
    2221
    23 VMutex genMutex[OBJTYPE_MAX];
    24 
    2522//******************************************************************************
    2623//******************************************************************************
    27 GenericObject::GenericObject(GenericObject **head, DWORD objType)
     24GenericObject::GenericObject(GenericObject **head, CRITICAL_SECTION *pLock)
    2825{
    29   this->objType = objType;
    30   this->head    = head;
    31   this->next    = NULL;
     26  this->pLock = pLock;
     27  this->head  = head;
     28  this->next  = NULL;
     29  refCount    = 1;
     30 
     31  fLinked     = FALSE;
     32  fDeletePending = FALSE;
    3233
    33   genMutex[objType].enter();
     34  link();
     35}
     36//******************************************************************************
     37//******************************************************************************
     38GenericObject::~GenericObject()
     39{
     40  unlink();
     41}
     42//******************************************************************************
     43//******************************************************************************
     44void GenericObject::link()
     45{
     46  lock();
    3447  if(*head == NULL) {
    3548        *head = this;   
     
    4356        cur->next = this;
    4457  }
    45   genMutex[objType].leave();
     58  fLinked = TRUE;
     59  unlock();
    4660}
    4761//******************************************************************************
    4862//******************************************************************************
    49 GenericObject::~GenericObject()
     63void GenericObject::unlink()
    5064{
     65  if(!fLinked)   return;
     66
    5167  //remove from linked list
    52   genMutex[objType].enter();
     68  lock();
    5369  if(*head == this) {
    5470        *head = next;   
     
    6177                if(cur == NULL) {
    6278                        dprintf(("GenericObject dtor: cur == NULL!!"));
     79                        unlock();
    6380                        DebugInt3();
     81                        return;
    6482                }
    6583        }
    6684        cur->next = next;
    6785  }
    68   genMutex[objType].leave();
     86  unlock();
     87}
     88//******************************************************************************
     89//******************************************************************************
     90LONG GenericObject::release()
     91{
     92////  dprintf(("release -> refcount %x", refCount));
     93#ifdef DEBUG
     94  if(refCount-1 < 0) {
     95      DebugInt3();
     96  }
     97#endif
     98  if(InterlockedDecrement(&refCount) == 0 && fDeletePending) {
     99      delete this;
     100      return 0;
     101  }
     102  return refCount;
    69103}
    70104//******************************************************************************
     
    77111  while(cur) {
    78112        next = cur->next;
     113        if(cur->getRefCount() != 0) {
     114            dprintf(("Refcount %d for object %x", cur->getRefCount(), cur));
     115        }
    79116        delete cur;
    80117        cur = next;
     
    83120//******************************************************************************
    84121//******************************************************************************
    85 void GenericObject::enterMutex()
    86 {
    87   genMutex[objType].enter();
    88 }
    89 //******************************************************************************
    90 //******************************************************************************
    91 void GenericObject::leaveMutex()
    92 {
    93   genMutex[objType].leave();
    94 }
    95 //******************************************************************************
    96 //******************************************************************************
    97 void GenericObject::enterMutex(DWORD objType)
    98 {
    99   genMutex[objType].enter();
    100 }
    101 //******************************************************************************
    102 //******************************************************************************
    103 void GenericObject::leaveMutex(DWORD objType)
    104 {
    105   genMutex[objType].leave();
    106 }
    107 //******************************************************************************
    108 //******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.