NS_LOG_RELEASE(this, mRefCnt, "CompositeDataSourceImpl");
CompositeDataSourceImpl::Release(){    // We need a special implementation of Release() because the    // composite datasource holds a reference to each datasource that    // it "composes", and each database that the composite datasource    // observes holds a reference _back_ to the composite datasource.    NS_PRECONDITION(PRInt32(mRefCnt) > 0, "duplicate release");    --mRefCnt;    // When the number of references == the number of datasources,    // then we know that all that remains are the circular    // references from those datasources back to us. Release them.    if (PRInt32(mRefCnt) == mDataSources.Count()) {        for (PRInt32 i = mDataSources.Count() - 1; i >= 0; --i) {            nsIRDFDataSource* ds = NS_STATIC_CAST(nsIRDFDataSource*, mDataSources[i]);            ds->RemoveObserver(this);            NS_RELEASE(ds);        }        return 0;    }    else if (mRefCnt == 0) {        delete this;        return 0;    }    else {        return mRefCnt;    }}