Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #include "ink_config.h"
00025 #include "ink_memory.h"
00026 
00027 #include <stdio.h>
00028 #include <stdlib.h>
00029 #include <assert.h>
00030 #include <limits.h>
00031 
00032 #include "ink_llqueue.h"
00033 #include "errno.h"
00034 
00035 #define RECORD_CHUNK 1024
00036 
00037 
00038 
00039 #ifdef NOT_USED_HERE
00040 static LLQrec *
00041 newrec(LLQ * Q)
00042 {
00043   LLQrec * new_val;
00044   int i;
00045 
00046   if (Q->free != NULL) {
00047     new_val = Q->free;
00048     Q->free = Q->free->next;
00049     return new_val;
00050   }
00051 
00052   Q->free = (LLQrec *)ats_malloc(RECORD_CHUNK * sizeof(LLQrec));
00053   for (i = 0; i < RECORD_CHUNK; i++)
00054     Q->free[i].next = &Q->free[i + 1];
00055 
00056   Q->free[RECORD_CHUNK - 1].next = NULL;
00057 
00058 
00059   new_val = Q->free;
00060   Q->free = Q->free->next;
00061 
00062   return new_val;
00063 }
00064 
00065 
00066 static void
00067 freerec(LLQ * Q, LLQrec * rec)
00068 {
00069   rec->next = Q->free;
00070   Q->free = rec;
00071 }
00072 #endif
00073 
00074 LLQ *
00075 create_queue()
00076 {
00077   LLQ * new_val = (LLQ *)ats_malloc(sizeof(LLQ));
00078 
00079   ink_sem_init(&(new_val->sema), 0);
00080   ink_mutex_init(&(new_val->mux), "LLQ::create_queue");
00081 
00082   new_val->head = new_val->tail = new_val->free = NULL;
00083   new_val->len = new_val->highwater = 0;
00084 
00085   return new_val;
00086 }
00087 
00088 
00089 void
00090 delete_queue(LLQ * Q)
00091 {
00092   
00093   
00094   
00095   
00096   ink_sem_destroy(&(Q->sema));
00097   ink_mutex_destroy(&(Q->mux));
00098   ats_free(Q);
00099   return;
00100 }
00101 
00102 int
00103 enqueue(LLQ * Q, void *data)
00104 {
00105   LLQrec * new_val;
00106 
00107   ink_mutex_acquire(&(Q->mux));
00108   new_val = (LLQrec *)ats_malloc(sizeof(LLQrec));
00109   new_val->data = data;
00110   new_val->next = NULL;
00111 
00112   if (Q->tail)
00113     Q->tail->next = new_val;
00114   Q->tail = new_val;
00115 
00116   if (Q->head == NULL)
00117     Q->head = Q->tail;
00118 
00119   Q->len++;
00120   if (Q->len > Q->highwater)
00121     Q->highwater = Q->len;
00122   ink_mutex_release(&(Q->mux));
00123   ink_sem_post(&(Q->sema));
00124   return 1;
00125 }
00126 
00127 uint64_t
00128 queue_len(LLQ * Q)
00129 {
00130   uint64_t len;
00131 
00132   
00133   
00134   len = Q->len;
00135   
00136   return len;
00137 }
00138 
00139 uint64_t
00140 queue_highwater(LLQ * Q)
00141 {
00142   uint64_t highwater;
00143 
00144   
00145   
00146   highwater = Q->highwater;
00147   
00148   return highwater;
00149 }
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 int
00173 queue_is_empty(LLQ * Q)
00174 {
00175   uint64_t len;
00176 
00177   len = queue_len(Q);
00178 
00179   if (len)
00180     return 0;
00181   else
00182     return 1;
00183 }
00184 
00185 void *
00186 dequeue(LLQ * Q)
00187 {
00188   LLQrec * rec;
00189   void *d;
00190   ink_sem_wait(&(Q->sema));
00191   ink_mutex_acquire(&(Q->mux));
00192 
00193 
00194   if (Q->head == NULL) {
00195 
00196     ink_mutex_release(&(Q->mux));
00197 
00198     return NULL;
00199   }
00200 
00201   rec = Q->head;
00202 
00203   Q->head = Q->head->next;
00204   if (Q->head == NULL)
00205     Q->tail = NULL;
00206 
00207   d = rec->data;
00208 
00209   ats_free(rec);
00210 
00211   Q->len--;
00212   ink_mutex_release(&(Q->mux));
00213 
00214   return d;
00215 }
00216 
00217 
00218 
00219 #ifdef LLQUEUE_MAIN
00220 
00221 void *
00222 testfun(void *unused)
00223 {
00224   int num;
00225   LLQ *Q;
00226 
00227   Q = create_queue();
00228   assert(Q);
00229 
00230   do {
00231     scanf("%d", &num);
00232     if (num == 0) {
00233       printf("DEQUEUE: %d\n", (int) dequeue(Q));
00234     } else if (num == -1) {
00235       printf("queue_is_empty: %d\n", queue_is_empty(Q));
00236     } else {
00237       printf("enqueue: %d\n", num);
00238       enqueue(Q, (void *) num);
00239     }
00240   } while (num >= -1);
00241 
00242   return NULL;
00243 }
00244 
00245 
00246 
00247 
00248 void
00249 main()
00250 {
00251   assert(thr_create(NULL, 0, testfun, (void *) NULL, THR_NEW_LWP, NULL) == 0);
00252   while (1) {
00253     ;
00254   }
00255 }
00256 
00257 #endif