#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/if.h>
+#include <unistd.h>
#endif
#ifdef __APPLE__
static uint64_t current_time(void) {
uint64_t now;
struct timeval tv;
+ static int seq = 0;
/* TODO is this BSD specific? */
gettimeofday(&tv, 0);
- now = (tv.tv_sec * 10000000ULL + tv.tv_usec * 10ULL) + GREGORIAN;
+ now = (tv.tv_sec * 10000000ULL + tv.tv_usec * 10ULL + seq++ % 10) + GREGORIAN;
return now;
}
node = node << 8; node += data[3];
node = node << 8; node += data[4];
node = node << 8; node += data[5];
+ close(s);
return node;
}
}
}
+ close(s);
}
#endif
}
static int read_state(struct pd_uuid_state *s) {
+ uint64_t node;
+
s->available = 0;
s->node = 0LL;
s->clock_sequence = 0;
s->timestamp = 0LL;
+ node = current_node(s);
+
+ if (!s->available || s->node != node) {
+ s->clock_sequence = random_clock_sequence(s);
+ }
+
return 0;
}
return i;
}
+int pd_uuid_init(struct pd_uuid_state *s, int flags) {
+ if (!s) return 0;
+
+ s->get_lock = obtain_global_lock;
+ s->release_lock = release_global_lock;
+ s->lock_data = 0;
+
+ if (flags & 0x1) {
+ s->read_state = 0;
+ s->save_state = 0;
+ s->node = current_node(s);
+ } else {
+ s->read_state = read_state;
+ s->save_state = 0;
+ }
+
+ s->random_bytes = get_bytes;
+ s->rng_state = 0;
+
+ s->available = 0;
+
+ return 1;
+}
+
int pd_uuid_init_state(struct pd_uuid_state *s) {
if (!s) return 0;
int pd_uuid_make_v1(struct pd_uuid_state *s, pd_uuid_t *uuid) {
struct pd_uuid_state ls;
uint64_t now;
- uint64_t node;
int err;
if (!s) {
}
now = current_time();
- node = current_node(s);
-
- if (!s->available || s->node != node) {
- s->clock_sequence = random_clock_sequence(s);
- }
- s->node = node;
if (s->available && s->timestamp > now) {
s->clock_sequence++;