• D
    Add a generic reference counted virObject type · 784a99f7
    Daniel P. Berrange 提交于
    This introduces a fairly basic reference counted virObject type
    and an associated virClass type, that use atomic operations for
    ref counting.
    
    In a global initializer (recommended to be invoked using the
    virOnceInit API), a virClass type must be allocated for each
    object type. This requires a class name, a "dispose" callback
    which will be invoked to free memory associated with the object's
    fields, and the size in bytes of the object struct.
    
    eg,
    
       virClassPtr  connclass = virClassNew("virConnect",
                                            sizeof(virConnect),
                                            virConnectDispose);
    
    The struct for the object, must include 'virObject' as its
    first member
    
    eg
    
      struct _virConnect {
        virObject object;
    
        virURIPtr uri;
      };
    
    The 'dispose' callback is only responsible for freeing
    fields in the object, not the object itself. eg a suitable
    impl for the above struct would be
    
      void virConnectDispose(void *obj) {
         virConnectPtr conn = obj;
         virURIFree(conn->uri);
      }
    
    There is no need to reset fields to 'NULL' or '0' in the
    dispose callback, since the entire object will be memset
    to 0, and the klass pointer & magic integer fields will
    be poisoned with 0xDEADBEEF before being free()d
    
    When creating an instance of an object, one needs simply
    pass the virClassPtr eg
    
       virConnectPtr conn = virObjectNew(connclass);
       if (!conn)
          return NULL;
       conn->uri = virURIParse("foo:///bar")
    
    Object references can be manipulated with
    
       virObjectRef(conn)
       virObjectUnref(conn)
    
    The latter returns a true value, if the object has been
    freed (ie its ref count hit zero)
    Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
    784a99f7
Makefile.am 55.5 KB