#define TRUE 1
#define FALSE 0
-#define MAX_NODES 0xff
+#define MAX_NODES 0xf
#define MAX_SERIAL 10000
-#define MAKE_LONG(lo, hi) ((hi)<<16)+(lo)
+typedef unsigned long long pointer;
+typedef atomic_ullong pointer_t;
-typedef union pointer {
- struct {
- volatile unsigned short count;
- volatile unsigned short ptr;
- } sep;
- atomic_ulong con;
-} pointer_t;
+#define MAKE_POINTER(ptr, count) ((((pointer)count) << 32) | ptr)
+#define PTR_MASK 0xffffffffLL
+#define COUNT_MASK (0xffffffffLL << 32)
+
+static inline void set_count(pointer *p, unsigned int val) { *p = (*p & ~COUNT_MASK) | ((pointer)val << 32); }
+static inline void set_ptr(pointer *p, unsigned int val) { *p = (*p & ~PTR_MASK) | val; }
+static inline unsigned int get_count(pointer p) { return p & PTR_MASK; }
+static inline unsigned int get_ptr(pointer p) { return (p & COUNT_MASK) >> 32; }
typedef struct node {
- unsigned value;
+ unsigned int value;
pointer_t next;
- unsigned foo[30];
+ unsigned int foo[30];
} node_t;
typedef struct private {
- unsigned node;
- unsigned value;
- unsigned serial[MAX_SERIAL];
+ unsigned int node;
+ unsigned int value;
+ unsigned int serial[MAX_SERIAL];
} private_t;
typedef struct shared_mem {
pointer_t head;
- unsigned foo1[31];
+ unsigned int foo1[31];
pointer_t tail;
- unsigned foo2[31];
+ unsigned int foo2[31];
node_t nodes[MAX_NODES+1];
- unsigned serial;
+ unsigned int serial;
} shared_mem_t;
-void init_private();
+void init_private(int pid);
void init_memory();
void init_queue();
-unsigned dequeue();
+unsigned int dequeue();