a bug fix for LFIFO long priority queue. For little endian machines such as intel...
[charm.git] / src / conv-core / queueing.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 #ifndef QUEUEING_H
9 #define QUEUEING_H
10 /*#define FASTQ*/
11
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15
16 #ifndef CINTBITS
17 #define CINTBITS ((unsigned int) (sizeof(int)*8))
18 #endif
19 #ifndef CLONGBITS
20 #define CLONGBITS ((unsigned int) (sizeof(CmiInt8)*8))
21 #endif
22 typedef struct prio_struct
23 {
24   unsigned short bits;
25   unsigned short ints;
26   unsigned int data[1];
27 }
28 *prio;
29
30 typedef struct deq_struct
31 {
32   /* Note: if head==tail, circ is empty */
33   void **bgn; /* Pointer to first slot in circular buffer */
34   void **end; /* Pointer past last slot in circular buffer */
35   void **head; /* Pointer to first used slot in circular buffer */
36   void **tail; /* Pointer to next available slot in circular buffer */
37   void *space[4]; /* Enough space for the first 4 entries */
38 }
39 *deq;
40
41 #ifndef FASTQ
42 typedef struct prioqelt_struct
43 {
44   struct deq_struct data;
45   struct prioqelt_struct *ht_next; /* Pointer to next bucket in hash table. */
46   struct prioqelt_struct **ht_handle; /* Pointer to pointer that points to me (!) */
47   struct prio_struct pri;
48 }
49 *prioqelt;
50 #else
51 typedef struct prioqelt_struct
52 {
53   struct deq_struct data;
54   struct prioqelt_struct *ht_left; /* Pointer to left bucket in hash table. */
55   struct prioqelt_struct *ht_right; /* Pointer to right bucket in hash table. */
56   struct prioqelt_struct *ht_parent; /* Pointer to the parent bucket in the hash table */
57   struct prioqelt_struct **ht_handle; /* Pointer to pointer in the hashtable that points to me (!) */
58   struct prio_struct pri;
59   /*  int deleted; */
60 }
61 *prioqelt;
62 #endif
63 /*
64 #ifndef FASTQ
65 #define PRIOQ_TABSIZE 1017
66 #else */
67 #define PRIOQ_TABSIZE 1017
68 /*#endif */
69
70 /*#ifndef FASTQ*/
71 typedef struct prioq_struct
72 {
73   int heapsize;
74   int heapnext;
75   prioqelt *heap;
76   prioqelt *hashtab;
77   int hash_key_size;
78   int hash_entry_size;
79 }
80 *prioq;
81 /*#else
82 typedef struct prioq1_struct
83 {
84   int heapsize;
85   int heapnext;
86   prioqelt1 *heap;
87   prioqelt1 hashtab[PRIOQ_TABSIZE];
88 }
89 *prioq1;
90 #endif
91 */
92
93 /*#ifndef FASTQ*/
94 typedef struct Queue_struct
95 {
96   unsigned int length;
97   unsigned int maxlen;
98   struct deq_struct zeroprio;
99   struct prioq_struct negprioq;
100   struct prioq_struct posprioq;
101 }
102 *Queue;
103 /*#else
104 typedef struct Queue1_struct
105 {
106   unsigned int length;
107   unsigned int maxlen;
108   struct deq_struct zeroprio;
109   struct prioq1_struct negprioq;
110   struct prioq1_struct posprioq;
111 }
112 *Queue;
113 #endif
114 */
115
116 Queue CqsCreate(void);
117 void CqsDelete(Queue);
118 void CqsEnqueue(Queue, void *msg);
119 void CqsEnqueueFifo(Queue, void *msg);
120 void CqsEnqueueLifo(Queue, void *msg);
121 void CqsEnqueueGeneral(Queue, void *msg,int strategy, 
122                int priobits, unsigned int *prioPtr);
123
124 void CqsEnumerateQueue(Queue q, void ***resp);
125 void CqsDequeue(Queue, void **msgPtr);
126
127 unsigned int CqsLength(Queue);
128 unsigned int CqsMaxLength(Queue);
129 int CqsEmpty(Queue);
130 int CqsPrioGT(prio, prio);
131 prio CqsGetPriority(Queue);
132
133 #ifdef __cplusplus
134 };
135 #endif
136
137 #endif