TypeLib containment refcounting

Kelly Leahy kellyleahy at swbell.net
Tue Jun 17 10:22:13 CDT 2003


Mike...

First of all, sorry but I don't have a linux box right now (bad HDD) so this
is the best I can do.

My code below will cause an AddRef only on the first ITypeInfo pointer
created (for each ITypeInfo), and a release on the last ITypeInfo pointer
released.  For each typeinfo struct in the typelib, you will get one
reference if a client has any references to that object.  As soon as all
client references to ITypeInfo's supported by the typeinfo in the library
are released, the refcount of the library will go to zero.  Of course, you
should not addref the library (directly) in GetTypeInfoOfGuid or any other
place that doesn't return a ITypeLib pointer.

Here's some source (with changes inline) from the typelib.c in 5/8/2003
source on source.winehq.com

3795 /* ITypeInfo::AddRef
3796  */
3797 static ULONG WINAPI ITypeInfo_fnAddRef( ITypeInfo2 *iface)
3798 {
3799     ICOM_THIS( ITypeInfoImpl, iface);
3800

here, I'd recommend inserting:
  if(This->ref == 0) ITypeLib2_AddRef((ITypeLib2 *)This->pTypeLib);

3801     ++(This->ref);
3802
3803     TRACE("(%p)->ref is %u\n",This, This->ref);
3804     return This->ref;
3805 }
3806
3807 /* ITypeInfo::Release
3808  */
3809 static ULONG WINAPI ITypeInfo_fnRelease( ITypeInfo2 *iface)
3810 {
3811     ICOM_THIS( ITypeInfoImpl, iface);
3812
3813     --(This->ref);

and here, I'd recommend inserting
  if(This->ref == 0) ITypeLib2_Release((ITypeLib2 *)This->pTypeLib);

3814
3815     TRACE("(%p)->(%u)\n",This, This->ref);
3816
3817     if (!This->ref)
3818     {
3819       FIXME("destroy child objects\n");
3820
3821       TRACE("destroying ITypeInfo(%p)\n",This);
3822       if (This->Name)
3823       {
3824           SysFreeString(This->Name);
3825           This->Name = 0;
3826       }
3827
3828       if (This->DocString)
3829       {
3830           SysFreeString(This->DocString);
3831           This->DocString = 0;
3832       }
3833
3834       if (This->next)
3835       {
3836         ITypeInfo_Release((ITypeInfo*)This->next);
3837       }
3838
3839       HeapFree(GetProcessHeap(),0,This);
3840       return 0;
3841     }
3842     return This->ref;
3843 }




More information about the wine-devel mailing list