virobject.h 3.6 KB
Newer Older
1 2 3
/*
 * virobject.h: libvirt reference counted object
 *
E
Eric Blake 已提交
4
 * Copyright (C) 2012-2014 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library.  If not, see
18 19 20 21
 * <http://www.gnu.org/licenses/>.
 *
 */

22
#pragma once
23

24 25
#include "internal.h"
#include "virthread.h"
26

27 28
#include <glib-object.h>

29 30 31 32 33 34
typedef struct _virClass virClass;
typedef virClass *virClassPtr;

typedef struct _virObject virObject;
typedef virObject *virObjectPtr;

35 36 37
typedef struct _virObjectLockable virObjectLockable;
typedef virObjectLockable *virObjectLockablePtr;

38 39 40
typedef struct _virObjectRWLockable virObjectRWLockable;
typedef virObjectRWLockable *virObjectRWLockablePtr;

41 42
typedef void (*virObjectDisposeCallback)(void *obj);

43 44 45 46 47
#define VIR_TYPE_OBJECT vir_object_get_type()
G_DECLARE_DERIVABLE_TYPE(virObject, vir_object, VIR, OBJECT, GObject);

struct _virObjectClass {
    GObjectClass parent;
48 49
};

50 51 52 53 54
struct _virObjectLockable {
    virObject parent;
    virMutex lock;
};

55 56 57 58
struct _virObjectRWLockable {
    virObject parent;
    virRWLock lock;
};
59

60
virClassPtr virClassForObject(void);
61
virClassPtr virClassForObjectLockable(void);
62
virClassPtr virClassForObjectRWLockable(void);
63

64 65 66
#ifndef VIR_PARENT_REQUIRED
# define VIR_PARENT_REQUIRED ATTRIBUTE_NONNULL(1)
#endif
67

E
Eric Blake 已提交
68 69 70 71 72
/* Assign the class description nameClass to represent struct @name
 * (which must have an object-based 'parent' member at offset 0), and
 * with parent class @prnt. nameDispose must exist as either a
 * function or as a macro defined to NULL.
 */
73
#define VIR_CLASS_NEW(name, prnt) \
74 75 76 77
    (G_STATIC_ASSERT_EXPR(offsetof(name, parent) == 0), \
     (name##Class = virClassNew(prnt, #name, sizeof(name),\
                                sizeof(((name *)NULL)->parent), \
                                name##Dispose)))
78

79 80 81 82
virClassPtr
virClassNew(virClassPtr parent,
            const char *name,
            size_t objectSize,
83
            size_t parentSize,
84
            virObjectDisposeCallback dispose)
85
    VIR_PARENT_REQUIRED ATTRIBUTE_NONNULL(2);
86

87 88
const char *
virClassName(virClassPtr klass)
89 90
    ATTRIBUTE_NONNULL(1);

91 92 93
bool
virClassIsDerivedFrom(virClassPtr klass,
                      virClassPtr parent)
94 95
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

96 97
void *
virObjectNew(virClassPtr klass)
98 99
    ATTRIBUTE_NONNULL(1);

100
void
101 102 103 104 105 106 107 108
virObjectUnref(void *obj);

void *
virObjectRef(void *obj);

bool
virObjectIsClass(void *obj,
                 virClassPtr klass)
109 110
    ATTRIBUTE_NONNULL(2);

111 112 113 114
void
virObjectFreeCallback(void *opaque);

void
115
virObjectFreeHashData(void *opaque);
116

117 118
void *
virObjectLockableNew(virClassPtr klass)
119 120
    ATTRIBUTE_NONNULL(1);

121 122 123 124
void *
virObjectRWLockableNew(virClassPtr klass)
    ATTRIBUTE_NONNULL(1);

125 126
void
virObjectLock(void *lockableobj)
127
    ATTRIBUTE_NONNULL(1);
128

129
void
130
virObjectRWLockRead(void *lockableobj)
131 132
    ATTRIBUTE_NONNULL(1);

133 134 135 136
void
virObjectRWLockWrite(void *lockableobj)
    ATTRIBUTE_NONNULL(1);

137 138
void
virObjectUnlock(void *lockableobj)
139 140
    ATTRIBUTE_NONNULL(1);

141 142 143 144
void
virObjectRWUnlock(void *lockableobj)
    ATTRIBUTE_NONNULL(1);

145 146 147 148 149 150
void
virObjectListFree(void *list);

void
virObjectListFreeCount(void *list,
                       size_t count);