libclues
Linux C++ Tracing Library
Loading...
Searching...
No Matches
thread.cxx
1// clues
2#include <clues/syscalls/thread.hxx>
3
4namespace clues {
5
7 /* drop all but the fixed initial two parameters */
8 m_pars.erase(m_pars.begin() + 2, m_pars.end());
9
10 /* args */
11 value.reset();
12 wake_count.reset();
13 fd_sig.reset();
14 timeout.reset();
15 futex2_addr.reset();
16 requeue_value.reset();
17 requeue_limit.reset();
18 wake_count2.reset();
19 wake_op.reset();
20 bitset.reset();
21
22 /* retvals */
23 num_woken_up.reset();
24 new_fd.reset();
25
26 // setup the default return value
27 result.emplace(item::SuccessResult{});
29}
30
32 using enum item::FutexOperation::Command;
33
34 auto setNewReturnItem = [this](auto &new_ret) {
35 result.reset();
36 setReturnItem(new_ret);
37 };
38
39 auto setWokenUpReturnValue = [this, setNewReturnItem]() {
40 num_woken_up.emplace(item::ReturnValue{"nwokenup", "number of waiters woken up"});
41 setNewReturnItem(*num_woken_up);
42 };
43
44 const auto command = operation.command();
45
46 switch (command) {
47 case WAIT: [[fallthrough]];
48 case WAIT_BITSET:
49 value.emplace(item::Uint32Value{"value"});
50 timeout.emplace(item::TimeSpecParameter{"timeout"});
51 if (command == WAIT) {
52 addParameters(*value, *timeout);
53 } else {
54 bitset.emplace(item::GenericPointerValue{"bitset"});
55 addParameters(*value, *timeout, item::unused, *bitset);
56 }
57 break;
58 case WAKE: [[fallthrough]];
59 case WAKE_BITSET:
60 wake_count.emplace(item::Uint32Value{"nwakeup", "number of waiters to wake up"});
61 if (command == WAKE) {
62 addParameters(*wake_count);
63 } else {
64 bitset.emplace(item::GenericPointerValue{"bitset"});
65 addParameters(*wake_count, item::unused, item::unused, *bitset);
66 }
67
68 setWokenUpReturnValue();
69 break;
70 case CREATE_FD:
71 /*
72 * this operation is not supported anymore, but we model it
73 * anyway
74 */
75 fd_sig.emplace(item::SignalNumber{});
77 addParameters(*fd_sig);
79 setNewReturnItem(*new_fd);
80 break;
81 case REQUEUE: [[fallthrough]];
82 case CMP_REQUEUE: [[fallthrough]];
83 case CMP_REQUEUE_PI:
84 wake_count.emplace(item::Uint32Value{"nwakeup", "number of waiters to wake up"});
85 requeue_limit.emplace(item::Uint32Value{"val2", "max number of waiters to requeue"});
86 futex2_addr.emplace(item::GenericPointerValue{"addr2", "requeue address"});
87 if (command == REQUEUE) {
88 addParameters(*wake_count, *requeue_limit, *futex2_addr);
89 } else {
90 requeue_value.emplace(item::Uint32Value{"val3", "comparison value"});
92 }
93
94 setWokenUpReturnValue();
95 break;
96 case WAKE_OP:
97 wake_count.emplace(item::Uint32Value{"nwakeup", "number of waiters to wake up at addr1"});
98 wake_count2.emplace(item::Uint32Value{"nwakeup2", "number of waiters to wake up at addr2"});
99 futex2_addr.emplace(item::GenericPointerValue{"addr2", "op-futex"});
101 addParameters(*wake_count, *wake_count2, *futex2_addr, *wake_op);
102
103 setWokenUpReturnValue();
104 break;
105 case LOCK_PI: [[fallthrough]];
106 case LOCK_PI2:
107 // absolute timeout measured against CLOCK_REALTIME (or
108 // MONOTONIC in case of LOCK_PI2, if the CLOCK_REALTIME flag
109 // is not passed in `operation`.
110 timeout.emplace(item::TimeSpecParameter{"timeout"});
111 addParameters(item::unused, *timeout);
112 break;
113 case TRYLOCK_PI: [[fallthrough]];
114 case UNLOCK_PI:
115 // none of the extra arguments are used in these cases
116 break;
117 case WAIT_REQUEUE_PI:
118 value.emplace(item::Uint32Value{"value"});
119 // absolute timeout
120 timeout.emplace(item::TimeSpecParameter{"timeout"});
121 futex2_addr.emplace(item::GenericPointerValue{"addr2", "requeue address"});
122 addParameters(*value, *timeout, *futex2_addr);
123 break;
124 default:
125 /* unknown operation? keep defaults. */
126 break;
127 }
128
129 return true;
130}
131
133 if (new_fd) {
134 // we don't even have a type for this, because this feature
135 // was dropped in kernel 2.6.26, so I guess it doesn't make
136 // sense to track anything here.
137 (void)proc;
138 }
139}
140
141} // end ns
void setReturnItem(SystemCallItem &ret)
Sets the return value system call item.
ParameterVector m_pars
The array of system call parameters, if any.
Base class for traced processes.
Definition Tracee.hxx:39
Base class for file descriptor system call items.
Definition fs.hxx:28
Composite bit values used in val3 for futex() operation FUTEX_WAKE_OP.
Definition futex.hxx:90
Base class for a system call return values.
Definition items.hxx:17
A signal number specification.
Definition signal.hxx:51
An always-success return value.
Definition error.hxx:15
The struct timespec used for various timing and timeout operations in system calls.
Definition time.hxx:17
@ RETVAL
A system call return value.
void updateFDTracking(const Tracee &proc) override
Update file descriptor tracking.
Definition thread.cxx:132
std::optional< item::Uint32Value > wake_count2
! "val2", number of waiters at futex2_addr to wakeup (WAKE_OP).
Definition thread.hxx:122
std::optional< item::Uint32Value > requeue_limit
! "val2", upper limit on waiters to be requeued to addr2 (REQUEUE, CMP_REQUEUE, CMP_REQUEUE_PI).
Definition thread.hxx:120
std::optional< item::FileDescriptor > new_fd
! new file descriptor (CREATE_FD).
Definition thread.hxx:133
std::optional< item::FutexWakeOperation > wake_op
! instructions for how to perform the wake operation (WAKE_OP).
Definition thread.hxx:124
std::optional< item::Uint32Value > requeue_value
! "val3" used for comparison in CMP_REQUEUE, CMP_REQUEUE_PI.
Definition thread.hxx:118
std::optional< item::GenericPointerValue > bitset
! bitset to restrict wait/wakeup (FUTEX_WAIT_BITSET, FUTEX_WAKE_BITSET).
Definition thread.hxx:126
std::optional< item::Uint32Value > wake_count
! number of waiters to wake up (WAKE, REQUEUE, CMP_REQUEUE, WAKE_OP, CMD_REQUEUE_PI).
Definition thread.hxx:110
std::optional< item::Uint32Value > value
! the value expected at futex_addr (WAIT, WAIT_REQUEUE_PI).
Definition thread.hxx:108
void prepareNewSystemCall() override
Perform any necessary actions before processing a new system call entry event.
Definition thread.cxx:6
std::optional< item::TimeSpecParameter > timeout
! optional relative timeout (WAIT) or absolute timeout (WAIT_BITSET, LOCK_PI, LOCK_PI2).
Definition thread.hxx:114
std::optional< item::SuccessResult > result
! success status (all remaining operations).
Definition thread.hxx:135
std::optional< item::SignalNumber > fd_sig
! signal used for asynchronous notifications (CREATE_FD).
Definition thread.hxx:112
std::optional< item::GenericPointerValue > futex2_addr
! "uaddr2" requeue address (REQUEUE, CMP_REQUEUE, CMP_REQUEUE_PI, WAIT_REQUEUE_PI) or additional fute...
Definition thread.hxx:116
bool check2ndPass(const Tracee &) override
Check whether a second pass needs to be made processing parameters.
Definition thread.cxx:31
std::optional< item::ReturnValue > num_woken_up
! number of waiters woken up (WAKE, WAKE_OP).
Definition thread.hxx:131