| 707 | } |
| 708 | |
| 709 | int bthread_id_error2_verbose(bthread_id_t id, int error_code, |
| 710 | const std::string& error_text, |
| 711 | const char *location) { |
| 712 | bthread::Id* const meta = address_resource(bthread::get_slot(id)); |
| 713 | if (!meta) { |
| 714 | return EINVAL; |
| 715 | } |
| 716 | const uint32_t id_ver = bthread::get_version(id); |
| 717 | uint32_t* butex = meta->butex; |
| 718 | meta->mutex.lock(); |
| 719 | if (!meta->has_version(id_ver)) { |
| 720 | meta->mutex.unlock(); |
| 721 | return EINVAL; |
| 722 | } |
| 723 | if (*butex == meta->first_ver) { |
| 724 | *butex = meta->locked_ver; |
| 725 | meta->lock_location = location; |
| 726 | meta->mutex.unlock(); |
| 727 | if (meta->on_error) { |
| 728 | return meta->on_error(id, meta->data, error_code); |
| 729 | } else { |
| 730 | return meta->on_error2(id, meta->data, error_code, error_text); |
| 731 | } |
| 732 | } else { |
| 733 | bthread::PendingError e; |
| 734 | e.id = id; |
| 735 | e.error_code = error_code; |
| 736 | e.error_text = error_text; |
| 737 | e.location = location; |
| 738 | meta->pending_q.push(e); |
| 739 | meta->mutex.unlock(); |
| 740 | return 0; |
| 741 | } |
| 742 | } |
| 743 | |
| 744 | int bthread_id_list_reset2(bthread_id_list_t* list, |
| 745 | int error_code, |
no test coverage detected