5 void pmc_queueinit(struct pmc_queue *queue) {
6 queue->head=queue->tail=RUNMALLOC(sizeof(struct pmc_queue_segment));
7 queue->headindex=queue->tailindex=0;
10 void * pmc_dequeue(struct pmc_queue *queue) {
12 tmc_spin_mutex_lock(&queue->lock);
13 //do-while loop allows sharing cleanup code
15 //check for possible rollover
16 if (queue->tailindex==NUM_PMC_QUEUE_OBJECTS) {
17 if (queue->tail!=queue->head) {
18 struct pmc_queue_segment *oldtail=queue->tail;
19 queue->tail=oldtail->next;
24 //now try to decrement
25 if (queue->tailindex!=queue->headindex) {
26 value=queue->tail->objects[queue->tailindex];
30 tmc_spin_mutex_unlock(&queue->lock);
34 void pmc_enqueue(struct pmc_queue* queue, void *ptr) {
35 if (queue->headindex<NUM_PMC_QUEUE_OBJECTS) {
36 queue->head->objects[queue->headindex]=ptr;
37 //need fence to prevent reordering
42 struct pmc_queue_segment * seg=RUNMALLOC(sizeof(struct pmc_queue_segment));
44 //simplify everything by grabbing a lock on segment change
45 tmc_spin_mutex_lock(&queue->lock);
47 queue->head->next=seg;
49 tmc_spin_mutex_unlock(&queue->lock);
53 bool pmc_isEmpty(struct pmc_queue *queue) {
54 tmc_spin_mutex_lock(&queue->lock);
55 bool status=(queue->head==queue->tail)&&(queue->headindex==queue->tailindex);
56 tmc_spin_mutex_unlock(&queue->lock);