summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
7347d85)
I want to allow threads creating their own asio queues asynchronously.
static uns asio_num_users;
static struct worker_pool asio_wpool;
static uns asio_num_users;
static struct worker_pool asio_wpool;
+static pthread_mutex_t asio_init_lock;
+
+static void CONSTRUCTOR
+asio_global_init(void)
+{
+ pthread_mutex_init(&asio_init_lock, NULL);
+}
+asio_init_unlocked(void)
{
if (asio_num_users++)
return;
{
if (asio_num_users++)
return;
+asio_cleanup_unlocked(void)
{
if (--asio_num_users)
return;
{
if (--asio_num_users)
return;
void
asio_init_queue(struct asio_queue *q)
{
void
asio_init_queue(struct asio_queue *q)
{
+ pthread_mutex_lock(&asio_init_lock);
+ asio_init_unlocked();
+ pthread_mutex_unlock(&asio_init_lock);
DBG("ASIO: New queue %p", q);
ASSERT(q->buffer_size);
q->allocated_requests = 0;
q->running_requests = 0;
q->running_writebacks = 0;
DBG("ASIO: New queue %p", q);
ASSERT(q->buffer_size);
q->allocated_requests = 0;
q->running_requests = 0;
q->running_writebacks = 0;
clist_init(&q->idle_list);
clist_init(&q->done_list);
work_queue_init(&asio_wpool, &q->queue);
clist_init(&q->idle_list);
clist_init(&q->done_list);
work_queue_init(&asio_wpool, &q->queue);
}
work_queue_cleanup(&q->queue);
}
work_queue_cleanup(&q->queue);
+
+ pthread_mutex_lock(&asio_init_lock);
+ asio_cleanup_unlocked();
+ pthread_mutex_unlock(&asio_init_lock);