3 void pmc_init(struct pmc_queue *queue) {
4 queue->head=queue->tail=RUNMALLOC(struct pmc_queue_segment);
5 queue->headindex=queue->tailindex=0;
8 void * pmc_dequeue(struct pmc_queue *queue) {
10 tmc_spin_mutex_lock(&queue->lock);
11 //do-while loop allows sharing cleanup code
13 //check for possible rollover
14 if (queue->tailindex==NUM_PMC_QUEUE_OBJECTS) {
15 if (queue->tail!=queue->head) {
16 struct pmc_queue_segment *oldtail=queue->tail;
17 queue->tail=oldtail->next;
22 //now try to decrement
23 if (queue->tailindex!=queue->headindex) {
24 value=queue->tail[queue->tailindex];
28 tmc_spin_mutex_unlock(&queue->lock);
32 void pmc_enqueue(struct pmc_queue* queue, void *ptr) {
33 if (queue->headindex<NUM_PMC_QUEUE_OBJECTS) {
34 queue->head->objects[queue->headindex]=ptr;
35 //need fence to prevent reordering
40 struct pmc_queue_segment * seg=RUNMALLOC(struct pmc_queue_segment);
42 //simplify everything by grabbing a lock on segment change
43 tmc_spin_mutex_lock(&queue->lock);
45 queue->head->next=seg;
47 tmc_spin_mutex_unlock(&queue->lock);
51 bool pmc_isEmpty(struct pmc_queue *queue) {
52 tmc_spin_mutex_lock(&queue->lock);
53 bool status=(queue->head==queue->tail)&&(queue->headindex==queue->tailindex);
54 tmc_spin_mutex_unlock(&queue->lock);