.. _program_listing_file_semaphore.c: Program Listing for File semaphore.c ==================================== |exhale_lsh| :ref:`Return to documentation for file ` (``semaphore.c``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #include #include "netio/netio.h" static void check_and_trigger(struct netio_semaphore* sem) { if(sem->threshold > 0 && sem->current >= sem->threshold) { if(sem->cb) { sem->cb(sem->data); } sem->threshold = 0; // semaphores only fire once } } void netio_semaphore_init(struct netio_semaphore* sem, unsigned threshold) { memset(sem, 0, sizeof(*sem)); sem->threshold = threshold; sem->current = 0; } void netio_semaphore_increment(struct netio_semaphore* sem, unsigned n) { sem->current += n; check_and_trigger(sem); } void netio_semphore_set_threshold(struct netio_semaphore* sem, unsigned t) { sem->threshold = t; check_and_trigger(sem); }