Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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( );
}
Пример #6
0
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( );
}
Пример #7
0
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 ) );
}
Пример #8
0
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 );
	*/
}
Пример #9
0
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 );
}
Пример #10
0
void queue::set_consumer( queue::notify_type fn )
{
	Q_AUTO_UNIQUE_LOCK( pimpl_->mutex_, Q_HERE, "queue::set_consumer" );

	pimpl_->notify_ = fn;
}
Пример #11
0
queue_ptr default_queue( )
{
	Q_AUTO_UNIQUE_LOCK( queue_mutex_, Q_HERE );
	return default_queue_;
}
Пример #12
0
queue_ptr background_queue( )
{
	Q_AUTO_UNIQUE_LOCK( queue_mutex_, Q_HERE );
	return background_queue_;
}
Пример #13
0
queue_ptr main_queue( )
{
	Q_AUTO_UNIQUE_LOCK( queue_mutex_, Q_HERE );
	return main_queue_;
}