The Pedigree Project 0.1
trace-context.h
1/* Copyright (c) 2026, Pedigree Developers. */
2#ifndef PEDIGREE_POSIX_TRACE_CONTEXT_H
3#define PEDIGREE_POSIX_TRACE_CONTEXT_H
4
5#include "pedigree/kernel/process/Mutex.h"
6#include "pedigree/kernel/process/Process.h"
7
8#include "trace-state.h"
9
10class EXPORTED_PUBLIC PreparedTraceTask {
11 public:
12 PreparedTraceTask() = default;
13 ~PreparedTraceTask() = default;
14
15 private:
16 friend class PosixTraceContext;
17 PreparedTraceTask(const PreparedTraceTask&) = delete;
18 PreparedTraceTask& operator=(const PreparedTraceTask&) = delete;
19 TraceTaskRef m_Token;
20 PreparedTraceTask* m_Next = nullptr;
21};
22
23// Declare inside the existing Process::ThreadCreationScope lifetime.
24class EXPORTED_PUBLIC TraceCloneAdmission {
25 public:
26 TraceCloneAdmission() = default;
28
29 private:
30 friend class PosixTraceContext;
32 TraceCloneAdmission& operator=(const TraceCloneAdmission&) = delete;
33 PosixTraceContext* m_Context = nullptr;
34};
35
36// Caller defers events through enrollment and core frame-flag publication.
37class EXPORTED_PUBLIC TraceEnrollmentAdmission {
38 public:
39 TraceEnrollmentAdmission() = default;
41 const TraceTaskRef& tracer() const {
42 return m_Tracer;
43 }
44 const TraceTaskRef& tracee() const {
45 return m_Tracee;
46 }
47
48 private:
49 friend class PosixTraceContext;
51 TraceEnrollmentAdmission& operator=(const TraceEnrollmentAdmission&) = delete;
52 PosixTraceContext* m_Context = nullptr;
53 TraceTaskRef m_Tracer, m_Tracee;
54};
55
56class EXPORTED_PUBLIC PosixTraceContext {
57 public:
58 PosixTraceContext() = default;
60 bool valid() const;
61 void attach(Process&);
62 TraceStatus prepareTask(UniquePointer<PreparedTraceTask>&);
63 TraceStatus publishTask(UniquePointer<PreparedTraceTask>&, Thread&);
64 bool taskToken(const Thread&, TraceTaskRef&) const;
65 void setCreator(const TraceTaskRef&);
66 TraceTaskRef creator() const;
67 void promoteExec(const Thread&);
68 void retireTask(const Thread&);
69 void close();
70
71 TraceStatus reserveThreadCreation(TraceCloneAdmission&);
72 TraceStatus reserveEnrollment(Thread&, TraceEnrollmentAdmission&);
73 TraceStatus commitEnrollment(TraceEnrollmentAdmission&, const TraceRelationRef&);
74 TraceStatus registerTracee(const TraceTaskRef& tracer, const TraceRelationRef&);
75 void unregisterTracee(const PosixTraceRelation*);
76 void clearIncoming(const PosixTraceRelation*);
77 // Output must be empty and declared outside any parent child-state guard.
78 // Only a short spin guard is taken; release the reference after that guard.
79 bool acquireIncoming(TraceRelationRef& empty) const;
80 bool selectStop(size_t parentPid, bool stopped, bool continued, bool consume, PosixWait::Report&);
81
82 private:
83 friend class TraceCloneAdmission;
84 friend class TraceEnrollmentAdmission;
85 PosixTraceContext(const PosixTraceContext&) = delete;
86 PosixTraceContext& operator=(const PosixTraceContext&) = delete;
88 TraceRelationRef relation;
89 OwnedRelation* next = nullptr;
90 };
91 TraceTaskRef tokenUnlocked(size_t localId) const;
92 bool ownsTokenUnlocked(const TraceTaskRef&) const;
93 void finishThreadCreation();
94 void cancelEnrollment();
95 bool hasIncoming() const;
96 mutable Mutex m_AdmissionLock;
97 mutable Spinlock m_RelationLock;
98 bool m_Attached = false, m_Closed = false;
99 size_t m_ProcessId = 0, m_ThreadCreations = 0;
100 bool m_EnrollmentPending = false;
101 PreparedTraceTask* m_Tasks = nullptr;
102 OwnedRelation* m_Outgoing = nullptr;
103 TraceTaskRef m_Creator;
104 TraceRelationRef m_Incoming;
105};
106
107// No lock from either context/token may be held by callers. Output starts empty.
108EXPORTED_PUBLIC TraceStatus posix_trace_acquire_task(const TraceTaskRef&, Process::ThreadLease&);
109#endif
Definition Mutex.h:56