| 648 | } |
| 649 | |
| 650 | void* bthread_getspecific(bthread_key_t key) { |
| 651 | bthread::KeyTable* kt = bthread::tls_bls.keytable; |
| 652 | if (kt) { |
| 653 | return kt->get_data(key); |
| 654 | } |
| 655 | bthread::TaskGroup* const g = bthread::BAIDU_GET_VOLATILE_THREAD_LOCAL(tls_task_group); |
| 656 | if (g) { |
| 657 | bthread::TaskMeta* const task = g->current_task(); |
| 658 | kt = bthread::borrow_keytable(task->attr.keytable_pool); |
| 659 | if (kt) { |
| 660 | g->current_task()->local_storage.keytable = kt; |
| 661 | bthread::tls_bls.keytable = kt; |
| 662 | return kt->get_data(key); |
| 663 | } |
| 664 | } |
| 665 | return NULL; |
| 666 | } |
| 667 | |
| 668 | void bthread_assign_data(void* data) { |
| 669 | bthread::tls_bls.assigned_data = data; |