| 450 | } |
| 451 | |
| 452 | int TaskControl::_add_group(TaskGroup* g, bthread_tag_t tag) { |
| 453 | if (__builtin_expect(NULL == g, 0)) { |
| 454 | return -1; |
| 455 | } |
| 456 | std::unique_lock<butil::Mutex> mu(_modify_group_mutex); |
| 457 | if (_stop) { |
| 458 | return -1; |
| 459 | } |
| 460 | g->set_tag(tag); |
| 461 | g->set_pl(&_tagged_pl[tag][butil::fmix64(pthread_numeric_id()) % _pl_num_of_each_tag]); |
| 462 | size_t ngroup = _tagged_ngroup[tag].load(butil::memory_order_relaxed); |
| 463 | if (ngroup < (size_t)BTHREAD_MAX_CONCURRENCY) { |
| 464 | _tagged_groups[tag][ngroup] = g; |
| 465 | _tagged_ngroup[tag].store(ngroup + 1, butil::memory_order_release); |
| 466 | } |
| 467 | mu.unlock(); |
| 468 | // See the comments in _destroy_group |
| 469 | // TODO: Not needed anymore since non-worker pthread cannot have TaskGroup |
| 470 | // signal_task(65536, tag); |
| 471 | return 0; |
| 472 | } |
| 473 | |
| 474 | void TaskControl::delete_task_group(void* arg) { |
| 475 | delete(TaskGroup*)arg; |