Line data Source code
1 : #include <string.h> 2 : #include "netio/netio.h" 3 : 4 : 5 : static void 6 73622781 : check_and_trigger(struct netio_semaphore* sem) 7 : { 8 73619030 : if(sem->threshold > 0 && sem->current >= sem->threshold) { 9 36809002 : if(sem->cb) { 10 36809002 : sem->cb(sem->data); 11 : } 12 36809002 : sem->threshold = 0; // semaphores only fire once 13 : } 14 : } 15 : 16 36809006 : void netio_semaphore_init(struct netio_semaphore* sem, unsigned threshold) 17 : { 18 36809006 : memset(sem, 0, sizeof(*sem)); 19 36809006 : sem->threshold = threshold; 20 36809006 : sem->current = 0; 21 36809006 : } 22 : 23 : 24 36813783 : void netio_semaphore_increment(struct netio_semaphore* sem, unsigned n) 25 : { 26 36813783 : sem->current += n; 27 36813783 : check_and_trigger(sem); 28 36813783 : } 29 : 30 : 31 36808998 : void netio_semphore_set_threshold(struct netio_semaphore* sem, unsigned t) 32 : { 33 36808998 : sem->threshold = t; 34 36808998 : check_and_trigger(sem); 35 36808998 : }