std::size_t queue::set_consumer( queue::notify_type fn ) { Q_AUTO_UNIQUE_LOCK( pimpl_->mutex_, Q_HERE, "queue::set_consumer" ); std::size_t backlog = pimpl_->queue_.size( ); pimpl_->notify_ = fn; return backlog; }
queue_ptr set_default_queue( queue_ptr queue ) { queue_ptr old; { Q_AUTO_UNIQUE_LOCK( queue_mutex_, Q_HERE ); old = default_queue_; default_queue_ = queue; } return old; }
queue_ptr set_background_queue( queue_ptr queue ) { queue_ptr old; { Q_AUTO_UNIQUE_LOCK( queue_mutex_, Q_HERE ); old = background_queue_; background_queue_ = queue; } return old; }
task queue::pop( ) { Q_AUTO_UNIQUE_LOCK( pimpl_->mutex_, Q_HERE, "queue::pop" ); if ( pimpl_->queue_.empty( ) ) return task( ); task task = std::move( pimpl_->queue_.front( ) ); pimpl_->queue_.pop( ); return task; }
void promise_signal::done( ) noexcept // TODO: analyze noexcept here { { Q_AUTO_UNIQUE_LOCK( pimpl_->mutex_ ); pimpl_->done_ = true; } for ( auto item : pimpl_->items_ ) item.queue_->push( std::move( item.task_ ) ); pimpl_->items_.clear( ); }
void queue::push( task&& task ) { notify_type notifyer; { Q_AUTO_UNIQUE_LOCK( pimpl_->mutex_, Q_HERE, "queue::push" ); pimpl_->queue_.push( std::move( task ) ); notifyer = pimpl_->notify_; } if ( notifyer ) notifyer( ); }
void promise_signal::push( task&& task, const queue_ptr& queue ) { { Q_AUTO_UNIQUE_LOCK( pimpl_->mutex_ ); if ( !pimpl_->done_ ) { pimpl_->items_.push_back( { std::move( task ), queue } ); return; } } queue->push( std::move( task ) ); }
queue_ptr set_main_queue( queue_ptr queue ) { queue_ptr old; { Q_AUTO_UNIQUE_LOCK( queue_mutex_, Q_HERE ); old = main_queue_; main_queue_ = queue; } return old; /* TODO: why doesn't this work? return std::atomic_exchange( &main_queue_, queue ); */ }
task queue::pop( ) { Q_AUTO_UNIQUE_LOCK( pimpl_->mutex_, Q_HERE, "queue::pop" ); if ( pimpl_->queue_.empty( ) ) { /* TODO: , "queue::pop: Queue empty" */ Q_THROW( queue_exception( ) ); } task task = std::move( pimpl_->queue_.front( ) ); pimpl_->queue_.pop( ); return std::move( task ); }
void queue::set_consumer( queue::notify_type fn ) { Q_AUTO_UNIQUE_LOCK( pimpl_->mutex_, Q_HERE, "queue::set_consumer" ); pimpl_->notify_ = fn; }
queue_ptr default_queue( ) { Q_AUTO_UNIQUE_LOCK( queue_mutex_, Q_HERE ); return default_queue_; }
queue_ptr background_queue( ) { Q_AUTO_UNIQUE_LOCK( queue_mutex_, Q_HERE ); return background_queue_; }
queue_ptr main_queue( ) { Q_AUTO_UNIQUE_LOCK( queue_mutex_, Q_HERE ); return main_queue_; }