IID generator: init and atomic64 ops (#270)
Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
cbc6dc5aa0
commit
8ce389dd85
2 changed files with 7 additions and 32 deletions
|
@ -21,12 +21,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct ddsi_iid {
|
struct ddsi_iid {
|
||||||
#if DDSRT_ATOMIC64_SUPPORT
|
|
||||||
ddsrt_atomic_uint64_t counter;
|
ddsrt_atomic_uint64_t counter;
|
||||||
#else
|
|
||||||
ddsrt_mutex_t lock;
|
|
||||||
uint64_t counter;
|
|
||||||
#endif
|
|
||||||
uint32_t key[4];
|
uint32_t key[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include "dds/ddsrt/sync.h"
|
#include "dds/ddsrt/sync.h"
|
||||||
#include "dds/ddsi/ddsi_iid.h"
|
#include "dds/ddsi/ddsi_iid.h"
|
||||||
|
|
||||||
static struct ddsi_iid dds_iid;
|
static struct ddsi_iid ddsi_iid;
|
||||||
|
|
||||||
static void dds_tea_encrypt (uint32_t v[2], const uint32_t k[4])
|
static void dds_tea_encrypt (uint32_t v[2], const uint32_t k[4])
|
||||||
{
|
{
|
||||||
|
@ -48,16 +48,8 @@ uint64_t ddsi_iid_gen (void)
|
||||||
{
|
{
|
||||||
uint64_t iid;
|
uint64_t iid;
|
||||||
union { uint64_t u64; uint32_t u32[2]; } tmp;
|
union { uint64_t u64; uint32_t u32[2]; } tmp;
|
||||||
|
tmp.u64 = ddsrt_atomic_inc64_nv (&ddsi_iid.counter);
|
||||||
#if DDSRT_ATOMIC64_SUPPORT
|
dds_tea_encrypt (tmp.u32, ddsi_iid.key);
|
||||||
tmp.u64 = ddsrt_atomic_inc64_nv (&dds_iid.counter);
|
|
||||||
#else
|
|
||||||
ddsrt_mutex_lock (&dds_iid.lock);
|
|
||||||
tmp.u64 = ++dds_iid.counter;
|
|
||||||
ddsrt_mutex_unlock (&dds_iid.lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
dds_tea_encrypt (tmp.u32, dds_iid.key);
|
|
||||||
iid = tmp.u64;
|
iid = tmp.u64;
|
||||||
return iid;
|
return iid;
|
||||||
}
|
}
|
||||||
|
@ -65,26 +57,14 @@ uint64_t ddsi_iid_gen (void)
|
||||||
void ddsi_iid_init (void)
|
void ddsi_iid_init (void)
|
||||||
{
|
{
|
||||||
union { uint64_t u64; uint32_t u32[2]; } tmp;
|
union { uint64_t u64; uint32_t u32[2]; } tmp;
|
||||||
|
for (size_t i = 0; i < sizeof (ddsi_iid.key) / sizeof (ddsi_iid.key[0]); i++)
|
||||||
#if ! DDSRT_ATOMIC64_SUPPORT
|
ddsi_iid.key[i] = ddsrt_random ();
|
||||||
ddsrt_mutex_init (&dds_iid.lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (size_t i = 0; i < sizeof (dds_iid.key) / sizeof (dds_iid.key[0]); i++)
|
|
||||||
dds_iid.key[0] = ddsrt_random ();
|
|
||||||
|
|
||||||
tmp.u64 = 0;
|
tmp.u64 = 0;
|
||||||
dds_tea_decrypt (tmp.u32, dds_iid.key);
|
dds_tea_decrypt (tmp.u32, ddsi_iid.key);
|
||||||
#if DDSRT_ATOMIC64_SUPPORT
|
ddsrt_atomic_st64 (&ddsi_iid.counter, tmp.u64);
|
||||||
ddsrt_atomic_st64 (&dds_iid.counter, tmp.u64);
|
|
||||||
#else
|
|
||||||
dds_iid.counter = tmp.u64;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ddsi_iid_fini (void)
|
void ddsi_iid_fini (void)
|
||||||
{
|
{
|
||||||
#if ! DDSRT_ATOMIC64_SUPPORT
|
|
||||||
ddsrt_mutex_destroy (&dds_iid.lock);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue