#pragma once #include #include "util/packet.h" #include "util/thread/thread.h" #include "loop.h" // Steps: // packet_get (block) \ Thread 2 // packet_submit (signal async) / // callback called \ Thread 1 // packet_return (unblock) / // -- Close -- // pool_disable() // join(thread1) && join(thread2) // pool_free() enum { NNWT_PACKET_POOL_KEEP = 0, NNWT_PACKET_POOL_RETURN }; struct nn_packet_pool { struct nn_event_loop *loop; u32 size; bool grow; bool flushing; bool disabled; struct nn_cond cond; struct nn_mutex mutex; array(struct nn_packet *) empty; array(struct nn_packet *) ready; array(struct nn_packet *) sending; ev_async signal; void (*callback)(void *, struct nn_packet *); void *userdata; }; void nn_packet_pool_init(struct nn_packet_pool *pool, u32 size, struct nn_event_loop *loop, void (*callback)(void *, struct nn_packet *), void *userdata); struct nn_packet *nn_packet_pool_get(struct nn_packet_pool *pool); void nn_packet_pool_submit(struct nn_packet_pool *pool, struct nn_packet *packet); void nn_packet_pool_flush(struct nn_packet_pool *pool); void nn_packet_pool_lock(struct nn_packet_pool *pool); void nn_packet_pool_return(struct nn_packet_pool *pool, struct nn_packet *packet); void nn_packet_pool_unlock(struct nn_packet_pool *pool); void nn_packet_pool_disable(struct nn_packet_pool *pool); void nn_packet_pool_enable(struct nn_packet_pool *pool); void nn_packet_pool_free(struct nn_packet_pool *pool);