xref: /aosp_15_r20/external/bcc/examples/usdt_sample/usdt_sample_lib1/src/lib1.cpp (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1 #include "usdt_sample_lib1/lib1.h"
2 
3 // std
4 #include <atomic>
5 #include <chrono>
6 #include <iostream>
7 #include <thread>
8 
9 // usdt_sample_lib1
10 #include "folly/tracing/StaticTracepoint.h"
11 
12 // When using systemtap-sdt-devel, the following file should be included:
13 #include "lib1_sdt.h"
14 
OperationRequest(const std::string & input_)15 OperationRequest::OperationRequest(const std::string& input_)
16     : _input(input_)
17 {
18 }
19 
OperationResponse(const std::string & output_)20 OperationResponse::OperationResponse(const std::string& output_)
21     : _output(output_)
22 {
23 }
24 
OperationProvider(std::uint32_t minLatencyMs_,std::uint32_t maxLatencyMs_)25 OperationProvider::OperationProvider(std::uint32_t minLatencyMs_, std::uint32_t maxLatencyMs_)
26     : _gen(std::random_device()())
27     , _dis(minLatencyMs_, maxLatencyMs_)
28 {
29 }
30 
executeAsync(const OperationRequest & request)31 std::shared_future<OperationResponse> OperationProvider::executeAsync(const OperationRequest& request)
32 {
33     static std::atomic<std::uint64_t> operationIdCounter(0);
34     std::uint64_t operationId = operationIdCounter++;
35 
36     // We create two probes at the same location. One created using the FOLLY_SDT macro, one created using dtrace.
37     FOLLY_SDT(usdt_sample_lib1, operation_start, operationId, request.input().c_str());
38     if (USDT_SAMPLE_LIB1_SDT_OPERATION_START_SDT_ENABLED()) {
39         //std::cout << "operation_start probe enabled." << std::endl;
40         USDT_SAMPLE_LIB1_SDT_OPERATION_START_SDT(operationId, request.input().c_str());
41     }
42 
43     auto latencyMs = _dis(_gen);
44 
45     return std::async(std::launch::async, [latencyMs, operationId, request]() {
46         std::this_thread::sleep_for(std::chrono::milliseconds(latencyMs));
47 
48         auto output = std::string("resp_") + request.input();
49         OperationResponse response(output);
50 
51         // We create two probes at the same location. One created using the FOLLY_SDT macro, one created using dtrace.
52         FOLLY_SDT(usdt_sample_lib1, operation_end, operationId, response.output().c_str());
53         if (USDT_SAMPLE_LIB1_SDT_OPERATION_END_SDT_ENABLED()) {
54             //std::cout << "operation_end probe enabled." << std::endl;
55             USDT_SAMPLE_LIB1_SDT_OPERATION_END_SDT(operationId, response.output().c_str());
56         }
57 
58         return response;
59     });
60 }
61