#include "virhashcode.h"
#include "virrandom.h"
#include "virstring.h"
+#include "virobject.h"
#define VIR_FROM_THIS VIR_FROM_NONE
virHashKeyFree keyFree;
};
+struct _virHashAtomic {
+ virObjectLockable parent;
+ virHashTablePtr hash;
+};
+
+static virClassPtr virHashAtomicClass;
+static void virHashAtomicDispose(void *obj);
+
+static int virHashAtomicOnceInit(void)
+{
+ virHashAtomicClass = virClassNew(virClassForObjectLockable(),
+ "virHashAtomic",
+ sizeof(virHashAtomic),
+ virHashAtomicDispose);
+ if (!virHashAtomicClass)
+ return -1;
+ else
+ return 0;
+}
+VIR_ONCE_GLOBAL_INIT(virHashAtomic)
+
+
static uint32_t virHashStrCode(const void *name, uint32_t seed)
{
return virHashCodeGen(name, strlen(name), seed);
virHashStrFree);
}
+
+virHashAtomicPtr
+virHashAtomicNew(ssize_t size,
+ virHashDataFree dataFree)
+{
+ virHashAtomicPtr hash;
+
+ if (virHashAtomicInitialize() < 0)
+ return NULL;
+
+ if (!(hash = virObjectLockableNew(virHashAtomicClass)))
+ return NULL;
+
+ if (!(hash->hash = virHashCreate(size, dataFree))) {
+ virObjectUnref(hash);
+ return NULL;
+ }
+ return hash;
+}
+
+
+static void
+virHashAtomicDispose(void *obj)
+{
+ virHashAtomicPtr hash = obj;
+
+ virHashFree(hash->hash);
+}
+
+
/**
* virHashGrow:
* @table: the hash table
return virHashAddOrUpdateEntry(table, name, userdata, true);
}
+int
+virHashAtomicUpdate(virHashAtomicPtr table,
+ const void *name,
+ void *userdata)
+{
+ int ret;
+
+ virObjectLock(table);
+ ret = virHashAddOrUpdateEntry(table->hash, name, userdata, true);
+ virObjectUnlock(table);
+
+ return ret;
+}
+
+
/**
* virHashLookup:
* @table: the hash table
return data;
}
+void *
+virHashAtomicSteal(virHashAtomicPtr table,
+ const void *name)
+{
+ void *data;
+
+ virObjectLock(table);
+ data = virHashSteal(table->hash, name);
+ virObjectUnlock(table);
+
+ return data;
+}
+
/**
* virHashSize:
typedef struct _virHashTable virHashTable;
typedef virHashTable *virHashTablePtr;
+typedef struct _virHashAtomic virHashAtomic;
+typedef virHashAtomic *virHashAtomicPtr;
+
/*
* function types:
*/
*/
virHashTablePtr virHashCreate(ssize_t size,
virHashDataFree dataFree);
+virHashAtomicPtr virHashAtomicNew(ssize_t size,
+ virHashDataFree dataFree);
virHashTablePtr virHashCreateFull(ssize_t size,
virHashDataFree dataFree,
virHashKeyCode keyCode,
int virHashUpdateEntry(virHashTablePtr table,
const void *name,
void *userdata);
+int virHashAtomicUpdate(virHashAtomicPtr table,
+ const void *name,
+ void *userdata);
/*
* Remove an entry from the hash table.
* Retrieve & remove the userdata.
*/
void *virHashSteal(virHashTablePtr table, const void *name);
+void *virHashAtomicSteal(virHashAtomicPtr table,
+ const void *name);
/*
* Get the hash table's key/value pairs and have them optionally sorted.