1d4eaacd6SMilek7 /**
2d4eaacd6SMilek7  * \file wasmtime/profiling.h
3d4eaacd6SMilek7  *
4d4eaacd6SMilek7  * \brief API for Wasmtime guest profiler
5d4eaacd6SMilek7  */
6d4eaacd6SMilek7 
7d4eaacd6SMilek7 #ifndef WASMTIME_PROFILING_H
8d4eaacd6SMilek7 #define WASMTIME_PROFILING_H
9d4eaacd6SMilek7 
10d4eaacd6SMilek7 #include <wasm.h>
11566669eeSAlex Crichton #include <wasmtime/conf.h>
12d4eaacd6SMilek7 #include <wasmtime/error.h>
13313f23d8SAlex Crichton #include <wasmtime/module.h>
14313f23d8SAlex Crichton #include <wasmtime/store.h>
15d4eaacd6SMilek7 
16566669eeSAlex Crichton #ifdef WASMTIME_FEATURE_PROFILING
17566669eeSAlex Crichton 
18d4eaacd6SMilek7 #ifdef __cplusplus
19d4eaacd6SMilek7 extern "C" {
20d4eaacd6SMilek7 #endif
21d4eaacd6SMilek7 
22d4eaacd6SMilek7 /**
23d4eaacd6SMilek7  * \brief Collects basic profiling data for a single WebAssembly guest.
24d4eaacd6SMilek7  *
25d4eaacd6SMilek7  * To use this, you’ll need to arrange to call #wasmtime_guestprofiler_sample at
26d4eaacd6SMilek7  * regular intervals while the guest is on the stack. The most straightforward
27d4eaacd6SMilek7  * way to do that is to call it from a callback registered with
28d4eaacd6SMilek7  * #wasmtime_store_epoch_deadline_callback.
29d4eaacd6SMilek7  *
30d4eaacd6SMilek7  * For more information see the Rust documentation at:
31d4eaacd6SMilek7  * https://docs.wasmtime.dev/api/wasmtime/struct.GuestProfiler.html
32d4eaacd6SMilek7  */
33d4eaacd6SMilek7 typedef struct wasmtime_guestprofiler wasmtime_guestprofiler_t;
34d4eaacd6SMilek7 
35d4eaacd6SMilek7 /**
36d4eaacd6SMilek7  * \brief Deletes profiler without finishing it.
37d4eaacd6SMilek7  *
38d4eaacd6SMilek7  * \param guestprofiler profiler that is being deleted
39d4eaacd6SMilek7  */
40d4eaacd6SMilek7 WASM_API_EXTERN void wasmtime_guestprofiler_delete(
41d4eaacd6SMilek7     /* own */ wasmtime_guestprofiler_t *guestprofiler);
42d4eaacd6SMilek7 
43d4eaacd6SMilek7 /**
44d4eaacd6SMilek7  * \typedef wasmtime_guestprofiler_modules_t
45d4eaacd6SMilek7  * \brief Alias to #wasmtime_guestprofiler_modules
46d4eaacd6SMilek7  *
47d4eaacd6SMilek7  * \struct #wasmtime_guestprofiler_modules
48d4eaacd6SMilek7  * \brief Tuple of name and module for passing into #wasmtime_guestprofiler_new.
49d4eaacd6SMilek7  */
50d4eaacd6SMilek7 typedef struct wasmtime_guestprofiler_modules {
51d4eaacd6SMilek7   const wasm_name_t *name; //!< Name recorded in the profile.
52d4eaacd6SMilek7   const wasmtime_module_t
53d4eaacd6SMilek7       *mod; //!< Module that is being allowed to appear in captured stack trace.
54d4eaacd6SMilek7 } wasmtime_guestprofiler_modules_t;
55d4eaacd6SMilek7 
56d4eaacd6SMilek7 /**
57d4eaacd6SMilek7  * \brief Begin profiling a new guest.
58d4eaacd6SMilek7  *
59*99ecf728SChris Fallin  * \param engine         engine in which to perform the profiling
60d4eaacd6SMilek7  * \param module_name    name recorded in the profile
61d4eaacd6SMilek7  * \param interval_nanos intended sampling interval in nanoseconds recorded in
62d4eaacd6SMilek7  *                       the profile
63d4eaacd6SMilek7  * \param modules        modules and associated names that will appear in
64d4eaacd6SMilek7  *                       captured stack traces, pointer to the first element
65d4eaacd6SMilek7  * \param modules_len    count of elements in `modules`
66d4eaacd6SMilek7  *
67d4eaacd6SMilek7  * \return Created profiler that is owned by the caller.
68d4eaacd6SMilek7  *
69d4eaacd6SMilek7  * This function does not take ownership of the arguments.
70d4eaacd6SMilek7  *
71d4eaacd6SMilek7  * For more information see the Rust documentation at:
72d4eaacd6SMilek7  * https://docs.wasmtime.dev/api/wasmtime/struct.GuestProfiler.html#method.new
73d4eaacd6SMilek7  */
74d4eaacd6SMilek7 WASM_API_EXTERN /* own */ wasmtime_guestprofiler_t *wasmtime_guestprofiler_new(
75*99ecf728SChris Fallin     const wasm_engine_t *engine, const wasm_name_t *module_name,
76*99ecf728SChris Fallin     uint64_t interval_nanos, const wasmtime_guestprofiler_modules_t *modules,
77*99ecf728SChris Fallin     size_t modules_len);
78d4eaacd6SMilek7 
79d4eaacd6SMilek7 /**
80d4eaacd6SMilek7  * \brief Add a sample to the profile.
81d4eaacd6SMilek7  *
82d4eaacd6SMilek7  * \param guestprofiler the profiler the sample is being added to
83d4eaacd6SMilek7  * \param store         store that is being used to collect the backtraces
847d0bdcceSMilek7  * \param delta_nanos   CPU time in nanoseconds that was used by this guest
857d0bdcceSMilek7  *                      since the previous sample
86d4eaacd6SMilek7  *
877d0bdcceSMilek7  * Zero can be passed as `delta_nanos` if recording CPU usage information
887d0bdcceSMilek7  * is not needed.
89d4eaacd6SMilek7  * This function does not take ownership of the arguments.
90d4eaacd6SMilek7  *
91d4eaacd6SMilek7  * For more information see the Rust documentation at:
92d4eaacd6SMilek7  * https://docs.wasmtime.dev/api/wasmtime/struct.GuestProfiler.html#method.sample
93d4eaacd6SMilek7  */
94d4eaacd6SMilek7 WASM_API_EXTERN void
95d4eaacd6SMilek7 wasmtime_guestprofiler_sample(wasmtime_guestprofiler_t *guestprofiler,
967d0bdcceSMilek7                               const wasmtime_store_t *store,
977d0bdcceSMilek7                               uint64_t delta_nanos);
98d4eaacd6SMilek7 
99d4eaacd6SMilek7 /**
100d4eaacd6SMilek7  * \brief Writes out the captured profile.
101d4eaacd6SMilek7  *
102d4eaacd6SMilek7  * \param guestprofiler the profiler which is being finished and deleted
103d4eaacd6SMilek7  * \param out           pointer to where #wasm_byte_vec_t containing generated
104d4eaacd6SMilek7  *                      file will be written
105d4eaacd6SMilek7  *
106d4eaacd6SMilek7  * \return Returns #wasmtime_error_t owned by the caller in case of error,
107d4eaacd6SMilek7  * `NULL` otherwise.
108d4eaacd6SMilek7  *
109d4eaacd6SMilek7  * This function takes ownership of `guestprofiler`, even when error is
110d4eaacd6SMilek7  * returned.
111d4eaacd6SMilek7  * Only when returning without error `out` is filled with #wasm_byte_vec_t owned
112d4eaacd6SMilek7  * by the caller.
113d4eaacd6SMilek7  *
114d4eaacd6SMilek7  * For more information see the Rust documentation at:
115d4eaacd6SMilek7  * https://docs.wasmtime.dev/api/wasmtime/struct.GuestProfiler.html#method.finish
116d4eaacd6SMilek7  */
117d4eaacd6SMilek7 WASM_API_EXTERN /* own */ wasmtime_error_t *
118d4eaacd6SMilek7 wasmtime_guestprofiler_finish(/* own */ wasmtime_guestprofiler_t *guestprofiler,
119d4eaacd6SMilek7                               /* own */ wasm_byte_vec_t *out);
120d4eaacd6SMilek7 
121d4eaacd6SMilek7 #ifdef __cplusplus
122d4eaacd6SMilek7 } // extern "C"
123d4eaacd6SMilek7 #endif
124d4eaacd6SMilek7 
125566669eeSAlex Crichton #endif // WASMTIME_FEATURE_PROFILING
126566669eeSAlex Crichton 
127d4eaacd6SMilek7 #endif // WASMTIME_PROFILING_H
128