X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/c6d6f58c34e1b6a4c03d1e86d1abf48eeb6f5624..94b8e4f0425cebad0a186daf054168fa6910f9b8:/lincan/src/can_queue.c diff --git a/lincan/src/can_queue.c b/lincan/src/can_queue.c index 6ee0550..ef06005 100644 --- a/lincan/src/can_queue.c +++ b/lincan/src/can_queue.c @@ -326,7 +326,7 @@ int canque_test_outslot(struct canque_ends_t *qends, spin_lock_irqsave(&qends->ends_lock, flags); for(prio=CANQUEUE_PRIO_NR;--prio>=0;){ while(!list_empty(&qends->active[prio])){ - edge=list_entry(qends->active[prio].next,struct canque_edge_t,outpeers); + edge=list_entry(qends->active[prio].next,struct canque_edge_t,activepeers); if(!canque_fifo_test_fl(&edge->fifo,DEAD)) { canque_edge_incref(edge); spin_unlock_irqrestore(&qends->ends_lock, flags); @@ -339,8 +339,8 @@ int canque_test_outslot(struct canque_ends_t *qends, } spin_lock(&edge->fifo.fifo_lock); if(canque_fifo_test_and_set_fl(&edge->fifo,INACTIVE)) { - list_del(&edge->outpeers); - list_add(&edge->outpeers,&qends->idle); + list_del(&edge->activepeers); + list_add(&edge->activepeers,&qends->idle); } spin_unlock(&edge->fifo.fifo_lock); } @@ -378,11 +378,11 @@ int canque_free_outslot(struct canque_ends_t *qends, spin_lock(&qedge->fifo.fifo_lock); if(canque_fifo_test_fl(&qedge->fifo,EMPTY)){ canque_fifo_set_fl(&qedge->fifo,INACTIVE); - list_del(&qedge->outpeers); - list_add(&qedge->outpeers,&qends->idle); + list_del(&qedge->activepeers); + list_add(&qedge->activepeers,&qends->idle); } else{ - list_del(&qedge->outpeers); - list_add_tail(&qedge->outpeers,&qends->active[qedge->edge_prio]); + list_del(&qedge->activepeers); + list_add_tail(&qedge->activepeers,&qends->active[qedge->edge_prio]); } spin_unlock(&qedge->fifo.fifo_lock); } @@ -473,8 +473,8 @@ int canque_flush(struct canque_edge_t *qedge) spin_lock_irqsave(&qedge->outends->ends_lock, flags); spin_lock(&qedge->fifo.fifo_lock); if(canque_fifo_test_fl(&qedge->fifo,EMPTY)){ - list_del(&qedge->outpeers); - list_add(&qedge->outpeers,&qedge->outends->idle); + list_del(&qedge->activepeers); + list_add(&qedge->activepeers,&qedge->outends->idle); } spin_unlock(&qedge->fifo.fifo_lock); spin_unlock_irqrestore(&qedge->outends->ends_lock, flags); @@ -497,6 +497,7 @@ int canqueue_ends_init_gen(struct canque_ends_t *qends) } INIT_LIST_HEAD(&qends->idle); INIT_LIST_HEAD(&qends->inlist); + INIT_LIST_HEAD(&qends->outlist); spin_lock_init(&qends->ends_lock); return 0; } @@ -522,7 +523,8 @@ int canqueue_connect_edge(struct canque_edge_t *qedge, struct canque_ends_t *ine qedge->inends=inends; list_add(&qedge->inpeers,&inends->inlist); qedge->outends=outends; - list_add(&qedge->outpeers,&outends->idle); + list_add(&qedge->outpeers,&outends->outlist); + list_add(&qedge->activepeers,&outends->idle); spin_unlock(&qedge->fifo.fifo_lock); spin_unlock(&outends->ends_lock); spin_unlock_irqrestore(&inends->ends_lock, flags); @@ -553,6 +555,8 @@ int canqueue_disconnect_edge(struct canque_edge_t *qedge) spin_lock(&qedge->fifo.fifo_lock); if(atomic_read(&qedge->edge_used)==0) { if(qedge->outends){ + list_del(&qedge->activepeers); + mb(); /* memory barrier for list_empty use in canque_dead_func */ list_del(&qedge->outpeers); qedge->outends=NULL; } @@ -569,3 +573,32 @@ int canqueue_disconnect_edge(struct canque_edge_t *qedge) return ret; } + +/** + * canqueue_block_inlist - block slot allocation of all outgoing edges of specified ends + * @qends: pointer to ends structure + */ +void canqueue_block_inlist(struct canque_ends_t *qends) +{ + struct canque_edge_t *edge; + + canque_for_each_inedge(qends, edge) { + canque_fifo_set_fl(&edge->fifo,BLOCK); + } +} + + +/** + * canqueue_block_outlist - block slot allocation of all incoming edges of specified ends + * @qends: pointer to ends structure + */ +void canqueue_block_outlist(struct canque_ends_t *qends) +{ + struct canque_edge_t *edge; + + canque_for_each_outedge(qends, edge) { + canque_fifo_set_fl(&edge->fifo,BLOCK); + } +} + +