Scheduler: Fix build breakage from missing return
[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
13 /** 
14    @addtogroup CharmScheduler
15    @{
16  */
17
18
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22
23 #ifndef CINTBITS
24 #define CINTBITS ((unsigned int) (sizeof(int)*8))
25 #endif
26 #ifndef CLONGBITS
27 #define CLONGBITS ((unsigned int) (sizeof(CmiInt8)*8))
28 #endif
29
30 /** Stores a variable bit length priority */
31 typedef struct prio_struct
32 {
33   unsigned short bits;
34   unsigned short ints;
35   unsigned int data[1];
36 }
37 *prio;
38
39 /** A double ended queue of void* pointers stored in a circular buffer, with internal space for 4 entries */
40 typedef struct deq_struct
41 {
42   /* Note: if head==tail, circ is empty */
43   void **bgn; /**< Pointer to first slot in circular buffer */
44   void **end; /**< Pointer past last slot in circular buffer */
45   void **head; /**< Pointer to first used slot in circular buffer */
46   void **tail; /**< Pointer to next available slot in circular buffer */
47   void *space[4]; /**< Enough space for the first 4 entries */
48 }
49 *deq;
50
51 #ifndef FASTQ
52 /** An bucket in a priority queue which contains a deque(storing the void* pointers) and references to other buckets in the hash table. */
53 typedef struct prioqelt_struct
54 {
55   struct deq_struct data;
56   struct prioqelt_struct *ht_next; /**< Pointer to next bucket in hash table. */
57   struct prioqelt_struct **ht_handle; /**< Pointer to pointer that points to me (!) */
58   struct prio_struct pri;
59 }
60 *prioqelt;
61 #else
62 typedef struct prioqelt_struct
63 {
64   struct deq_struct data;
65   struct prioqelt_struct *ht_left; /**< Pointer to left bucket in hash table. */
66   struct prioqelt_struct *ht_right; /**< Pointer to right bucket in hash table. */
67   struct prioqelt_struct *ht_parent; /**< Pointer to the parent bucket in the hash table */
68   struct prioqelt_struct **ht_handle; /**< Pointer to pointer in the hashtable that points to me (!) */
69   struct prio_struct pri;
70   /*  int deleted; */
71 }
72 *prioqelt;
73 #endif
74 /*
75 #ifndef FASTQ
76 #define PRIOQ_TABSIZE 1017
77 #else */
78 #define PRIOQ_TABSIZE 1017
79 /*#endif */
80
81 /*#ifndef FASTQ*/
82 /** A priority queue, implemented as a heap of prioqelt_struct buckets (each bucket represents a single priority value and contains a deque of void* pointers) */
83 typedef struct prioq_struct
84 {
85   int heapsize; 
86   int heapnext;
87   prioqelt *heap; /**< An array of prioqelt's */
88   prioqelt *hashtab;
89   int hash_key_size;
90   int hash_entry_size;
91 }
92 *prioq;
93 /*#else
94 typedef struct prioq1_struct
95 {
96   int heapsize;
97   int heapnext;
98   prioqelt1 *heap;
99   prioqelt1 hashtab[PRIOQ_TABSIZE];
100 }
101 *prioq1;
102 #endif
103 */
104
105 /*#ifndef FASTQ*/
106 /** A set of 3 queues: a positive priority prioq_struct, a negative priority prioq_struct, and a zero priority deq_struct.
107     If the user modifies the queue, NULL entries may be present, and hence NULL values will be returned by CqsDequeue().
108 */
109 typedef struct Queue_struct
110 {
111   unsigned int length;
112   unsigned int maxlen;
113   struct deq_struct zeroprio; /**< A double ended queue for zero priority messages */
114   struct prioq_struct negprioq; /**< A priority queue for negative priority messages */
115   struct prioq_struct posprioq; /**< A priority queue for negative priority messages */
116 }
117 *Queue;
118 /*#else
119 typedef struct Queue1_struct
120 {
121   unsigned int length;
122   unsigned int maxlen;
123   struct deq_struct zeroprio;
124   struct prioq1_struct negprioq;
125   struct prioq1_struct posprioq;
126 }
127 *Queue;
128 #endif
129 */
130
131 Queue CqsCreate(void);
132 void CqsDelete(Queue);
133 void CqsEnqueue(Queue, void *msg);
134 void CqsEnqueueFifo(Queue, void *msg);
135 void CqsEnqueueLifo(Queue, void *msg);
136 void CqsEnqueueGeneral(Queue, void *msg,int strategy, 
137                int priobits, unsigned int *prioPtr);
138
139 void CqsEnumerateQueue(Queue q, void ***resp);
140 void CqsDequeue(Queue, void **msgPtr);
141
142 unsigned int CqsLength(Queue);
143 unsigned int CqsMaxLength(Queue);
144 int CqsEmpty(Queue);
145 int CqsPrioGT(prio, prio);
146 prio CqsGetPriority(Queue);
147
148 deq CqsPrioqGetDeq(prioq pq, unsigned int priobits, unsigned int *priodata);
149 void *CqsPrioqDequeue(prioq pq);
150 void CqsDeqEnqueueFifo(deq d, void *data);
151
152 void CqsIncreasePriorityForEntryMethod(Queue q, const int entrymethod);
153 void CqsRemoveSpecific(Queue, const void *msgPtr);
154
155
156 #ifdef __cplusplus
157 };
158 #endif
159
160 /** @} */
161
162 #endif