| 241 | } |
| 242 | |
| 243 | std::shared_ptr<Span> Span::CreateBthreadSpan(const std::string& full_method_name, |
| 244 | int64_t base_real_us) { |
| 245 | std::shared_ptr<Span> parent = Span::tls_parent(); |
| 246 | Span* span_raw = butil::get_object<Span>(Forbidden()); |
| 247 | if (__builtin_expect(span_raw == NULL, 0)) { |
| 248 | return nullptr; |
| 249 | } |
| 250 | std::shared_ptr<Span> span(span_raw, SpanDeleter()); |
| 251 | span->_log_id = 0; |
| 252 | span->_base_cid = INVALID_BTHREAD_ID; |
| 253 | span->_ending_tid = INVALID_BTHREAD; // Bthread Span uses ending_tid |
| 254 | span->_type = SPAN_TYPE_BTHREAD; |
| 255 | span->_async = false; |
| 256 | span->_protocol = PROTOCOL_UNKNOWN; |
| 257 | span->_error_code = 0; |
| 258 | span->_request_size = 0; |
| 259 | span->_response_size = 0; |
| 260 | span->_base_real_us = base_real_us; |
| 261 | span->_received_real_us = 0; |
| 262 | span->_start_parse_real_us = 0; |
| 263 | span->_start_callback_real_us = 0; |
| 264 | span->_start_send_real_us = 0; |
| 265 | span->_sent_real_us = 0; |
| 266 | span->_full_method_name = full_method_name; |
| 267 | span->_info.clear(); |
| 268 | |
| 269 | if (parent) { |
| 270 | span->_trace_id = parent->trace_id(); |
| 271 | span->_parent_span_id = parent->span_id(); |
| 272 | span->_local_parent = parent; |
| 273 | { |
| 274 | BAIDU_SCOPED_LOCK(parent->_client_list_spinlock); |
| 275 | parent->_client_list.push_back(span); |
| 276 | } |
| 277 | } else { |
| 278 | span->_trace_id = GenerateTraceId(); |
| 279 | span->_parent_span_id = 0; |
| 280 | } |
| 281 | |
| 282 | span->_span_id = GenerateSpanId(); |
| 283 | return span; |
| 284 | } |
| 285 | |
| 286 | inline const std::string& unknown_span_name() { |
| 287 | // thread-safe in gcc. |
nothing calls this directly
no test coverage detected