/////////////////////////////////////////////////////////////////////// // create a new thread and schedule it if the initial state is equal to // pending thread_id_type create_thread(thread_init_data& data, thread_state_enum initial_state, bool run_now, std::size_t num_thread, error_code& ec) { if (run_now) { mutex_type::scoped_lock lk(mtx_); HPX_STD_UNIQUE_PTR<threads::thread_data> thrd ( new (memory_pool_) threads::thread_data( data, memory_pool_, initial_state)); // add a new entry in the map for this thread thread_id_type id = thrd->get_thread_id(); std::pair<thread_map_type::iterator, bool> p = thread_map_.insert(id, thrd.get()); if (HPX_UNLIKELY(!p.second)) { HPX_THROWS_IF(ec, hpx::out_of_memory, "threadmanager::register_thread", "Couldn't add new thread to the map of threads"); return invalid_thread_id; } // push the new thread in the pending queue thread if (initial_state == pending) schedule_thread(thrd.get(), num_thread); // this thread has to be in the map now BOOST_ASSERT(thread_map_.find(id) != thread_map_.end()); BOOST_ASSERT(thrd->is_created_from(&memory_pool_)); do_some_work(); // try to execute the new work item thrd.release(); // release ownership to the map if (&ec != &throws) ec = make_success_code(); // return the thread_id of the newly created thread return id; } // do not execute the work, but register a task description for // later thread creation #if HPX_THREAD_MAINTAIN_QUEUE_WAITTIME new_tasks_.enqueue(new task_description( boost::move(data), initial_state, util::high_resolution_clock::now() )); #else new_tasks_.enqueue(new task_description( boost::move(data), initial_state)); #endif ++new_tasks_count_; if (&ec != &throws) ec = make_success_code(); return invalid_thread_id; // thread has not been created yet }
void signal(ValueType const& val, boost::uint64_t count) { // {{{ // push back the new value onto the queue HPX_STD_UNIQUE_PTR<queue_value_entry> node (new queue_value_entry(val, count)); mutex_type::scoped_lock l(mtx_); value_queue_.push_back(*node); node.release(); resume(l); } // }}}