diff --git a/projects/rocprofiler-systems/.github/workflows/cpack.yml b/projects/rocprofiler-systems/.github/workflows/cpack.yml index 042824a9eb..1dcd1681f0 100644 --- a/projects/rocprofiler-systems/.github/workflows/cpack.yml +++ b/projects/rocprofiler-systems/.github/workflows/cpack.yml @@ -35,7 +35,7 @@ jobs: generate_release_notes: True release-docs: - if: github.repository == 'AMDResearch/omnitrace' && startsWith(github.ref, 'refs/tags/') + if: github.repository == 'AMDResearch/omnitrace' && (startsWith(github.ref, 'refs/tags/') || contains(github.ref, 'releases/')) runs-on: ubuntu-20.04 permissions: contents: write @@ -43,25 +43,33 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - with: - ref: gh-pages + - name: Update Source + run: | + git config --global user.name 'Jonathan R. Madsen' + git config --global user.email 'jrmadsen@users.noreply.github.com' + git config --global pull.rebase true + git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} + git fetch origin + git checkout gh-pages + git pull origin main - name: Install Conda uses: s-weigand/setup-conda@v1 - name: Update Docs working-directory: source/docs run: | conda env create -n omnitrace-docs -f environment.yml + source activate conda activate omnitrace-docs - git config --global user.name 'Jonathan R. Madsen' - git config --global user.email 'jrmadsen@users.noreply.github.com' - git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} - git pull --rebase=true origin ${{ github.ref }} ./update-docs.sh - git add ../../docs + - name: Push changes + if: github.repository == 'AMDResearch/omnitrace' && startsWith(github.ref, 'refs/tags/') + run: | + git add docs git commit -m "Update HTML (automated)" git push -f - ubuntu: + installers: + if: github.repository == 'AMDResearch/omnitrace' runs-on: ubuntu-20.04 strategy: fail-fast: false diff --git a/projects/rocprofiler-systems/source/docs/conf.py b/projects/rocprofiler-systems/source/docs/conf.py index 4301e28391..7187cfaaaa 100644 --- a/projects/rocprofiler-systems/source/docs/conf.py +++ b/projects/rocprofiler-systems/source/docs/conf.py @@ -131,10 +131,12 @@ breathe_projects = {"omnitrace": "_doxygen/xml"} breathe_default_project = "omnitrace" breathe_default_members = ("members",) breathe_projects_source = { - "auto": ( - os.path.join(project_root, "source"), + "omnitrace": ( + os.path.join(project_root, "source", "lib", "omnitrace-user"), [ - "lib/omnitrace-user/omnitrace/user.h", + "omnitrace/types.h", + "omnitrace/categories.h", + "omnitrace/user.h", ], ) } diff --git a/projects/rocprofiler-systems/source/docs/omnitrace.dox.in b/projects/rocprofiler-systems/source/docs/omnitrace.dox.in index 463aa0cc96..646f6ee71a 100644 --- a/projects/rocprofiler-systems/source/docs/omnitrace.dox.in +++ b/projects/rocprofiler-systems/source/docs/omnitrace.dox.in @@ -40,6 +40,8 @@ EXTENSION_MAPPING = hpp=C++ \ cpp=C++ \ hh=C++ \ cc=C++ \ + h=C \ + c=C \ py=Python MARKDOWN_SUPPORT = YES TOC_INCLUDE_HEADINGS = 2 @@ -105,14 +107,16 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = YES -WARN_AS_ERROR = NO +WARN_AS_ERROR = YES WARN_FORMAT = "---> WARNING! $file:$line: $text" WARN_LOGFILE = doc/warnings.log #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- INPUT = @SOURCE_DIR@/README.md \ - @SOURCE_DIR@/source/lib/omnitrace-user + @SOURCE_DIR@/source/lib/omnitrace-user/omnitrace/types.h \ + @SOURCE_DIR@/source/lib/omnitrace-user/omnitrace/categories.h \ + @SOURCE_DIR@/source/lib/omnitrace-user/omnitrace/user.h INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.h \ *.hh \ @@ -212,7 +216,7 @@ QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = QHG_LOCATION = GENERATE_ECLIPSEHELP = NO -ECLIPSE_DOC_ID = org.doxygen.timemory +ECLIPSE_DOC_ID = org.doxygen.omnitrace DISABLE_INDEX = NO GENERATE_TREEVIEW = YES ENUM_VALUES_PER_LINE = 1 @@ -306,9 +310,8 @@ ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES -INCLUDE_PATH = @SOURCE_DIR@/source/timemory +INCLUDE_PATH = @SOURCE_DIR@/source/lib/omnitrace-user INCLUDE_FILE_PATTERNS = *.h \ - *.hh \ *.hpp PREDEFINED = OMNITRACE_PUBLIC_API= \ OMNITRACE_HIDDEN_API= \ @@ -316,6 +319,8 @@ PREDEFINED = OMNITRACE_PUBLIC_API= \ "OMNITRACE_VISIBILITY(...)=" \ "__attribute__(x)=" \ "__declspec(x)=" \ + "size_t=unsigned long" \ + "uintptr_t=unsigned long" \ DOXYGEN_SHOULD_SKIP_THIS EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = NO diff --git a/projects/rocprofiler-systems/source/docs/update-docs.sh b/projects/rocprofiler-systems/source/docs/update-docs.sh index 6b90e082e6..a45e0da1c5 100755 --- a/projects/rocprofiler-systems/source/docs/update-docs.sh +++ b/projects/rocprofiler-systems/source/docs/update-docs.sh @@ -19,9 +19,10 @@ cmake -DSOURCE_DIR=${SOURCE_DIR} -P ${WORK_DIR}/generate-doxyfile.cmake message "Generating doxygen xml files" doxygen omnitrace.dox +doxygen omnitrace.dox message "Building html documentation" -make html +make html SPHINXOPTS="-W --keep-going -n" if [ -d ${SOURCE_DIR}/docs ]; then message "Removing stale documentation in ${SOURCE_DIR}/docs/" diff --git a/projects/rocprofiler-systems/source/docs/user_api.md b/projects/rocprofiler-systems/source/docs/user_api.md index 2d452fa7b4..75d2113ada 100644 --- a/projects/rocprofiler-systems/source/docs/user_api.md +++ b/projects/rocprofiler-systems/source/docs/user_api.md @@ -1,6 +1,8 @@ # User API ```eval_rst +.. doxygenfile:: omnitrace/types.h +.. doxygenfile:: omnitrace/categories.h .. doxygenfile:: omnitrace/user.h ``` @@ -14,12 +16,16 @@ recorded, regardless of whether whether `omnitrace_user_start_*` or `omnitrace_u ### User API Implementation ```cpp +#include +#include #include #include #include +#include #include #include +#include #include #include #include @@ -37,19 +43,16 @@ custom_push_region(const char* name); namespace { -int (*omnitrace_push_region_f)(const char*) = nullptr; -} +omnitrace_user_callbacks_t custom_callbacks = OMNITRACE_USER_CALLBACKS_INIT; +omnitrace_user_callbacks_t original_callbacks = OMNITRACE_USER_CALLBACKS_INIT; +} // namespace int main(int argc, char** argv) { - // get the internal callback to start a user-defined region - omnitrace_user_get_callbacks(OMNITRACE_USER_REGION, (void**) &omnitrace_push_region_f, - nullptr); - // assign the custom callback to start a user-defined region - if(omnitrace_push_region_f) - omnitrace_user_configure(OMNITRACE_USER_REGION, (void*) &custom_push_region, - nullptr); + custom_callbacks.push_region = &custom_push_region; + omnitrace_user_configure(OMNITRACE_USER_UNION_CONFIG, custom_callbacks, + &original_callbacks); omnitrace_user_push_region(argv[0]); omnitrace_user_push_region("initialization"); @@ -71,9 +74,7 @@ main(int argc, char** argv) omnitrace_user_stop_thread_trace(); for(size_t i = 0; i < nthread; ++i) { - size_t _nitr = ((i % 2) == 1) ? (nitr - (0.1 * nitr)) : (nitr + (0.1 * nitr)); - long _nfib = ((i % 2) == 1) ? (nfib - (0.1 * nfib)) : (nfib + (0.1 * nfib)); - threads.emplace_back(&run, _nitr, _nfib); + threads.emplace_back(&run, nitr, nfib); } // re-enable instrumentation omnitrace_user_start_thread_trace(); @@ -117,8 +118,28 @@ run(size_t nitr, long n) int custom_push_region(const char* name) { + if(!original_callbacks.push_region || !original_callbacks.push_annotated_region) + return OMNITRACE_USER_ERROR_NO_BINDING; + printf("Pushing custom region :: %s\n", name); - return (*omnitrace_push_region_f)(name); + + if(original_callbacks.push_annotated_region) + { + int32_t _err = errno; + char* _msg = nullptr; + char _buff[1024]; + if(_err != 0) _msg = strerror_r(_err, _buff, sizeof(_buff)); + + omnitrace_annotation_t _annotations[] = { + { "errno", OMNITRACE_INT32, &_err }, { "strerror", OMNITRACE_STRING, _msg } + }; + + errno = 0; // reset errno + return (*original_callbacks.push_annotated_region)( + name, _annotations, sizeof(_annotations) / sizeof(omnitrace_annotation_t)); + } + + return (*original_callbacks.push_region)(name); } ``` diff --git a/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/categories.h b/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/categories.h index d71a2b96da..3ba3be597b 100644 --- a/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/categories.h +++ b/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/categories.h @@ -87,10 +87,11 @@ extern "C" // be the last enumerated id } omnitrace_category_t; - /// @typedef omnitrace_annotation_type_t + /// @enum OMNITRACE_ANNOTATION_TYPE /// @brief Identifier for the data type of the annotation. /// if the data type is not a pointer, pass the address of /// data. + /// @typedef OMNITRACE_ANNOTATION_TYPE omnitrace_annotation_type_t typedef enum OMNITRACE_ANNOTATION_TYPE { // Do not use first enum value @@ -134,15 +135,13 @@ extern "C" OMNITRACE_VALUE_LAST } omnitrace_annotation_type_t; - /// @typedef omnitrace_annotation + /// @struct omnitrace_annotation /// @brief A struct containing annotation data to be included in the perfetto trace. /// /// @code{.cpp} /// #include /// #include /// - /// #include - /// /// double /// compute_residual(size_t n, double* data); /// @@ -173,12 +172,15 @@ extern "C" /// return residual; /// } /// @endcode - /// + /// @typedef omnitrace_annotation omnitrace_annotation_t typedef struct omnitrace_annotation { + /// label for annotation const char* name; - uintptr_t type; - void* value; + /// omnitrace_annotation_type_t + uintptr_t type; + /// data to annotate + void* value; } omnitrace_annotation_t; #if defined(__cplusplus) diff --git a/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/types.h b/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/types.h index ba9f5506d6..8b026e7015 100644 --- a/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/types.h +++ b/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/types.h @@ -37,45 +37,10 @@ extern "C" typedef int (*omnitrace_annotated_region_func_t)(const char*, omnitrace_annotation*, size_t); - /// @typedef omnitrace_user_callbacks_t + /// @struct omnitrace_user_callbacks /// @brief Struct containing the callbacks for the user API - /// @code{.cpp} /// - /// #include - /// #include - /// - /// omnitrace_user_callbacks_t custom_callbacks = OMNITRACE_USER_CALLBACKS_INIT; - /// omnitrace_user_callbacks_t original_callbacks = OMNITRACE_USER_CALLBACKS_INIT; - /// - /// // in our custom push region, we are going to redirect the unannotated user push - /// // region to annotate the trace entries with the global errno and if errno is - /// // non-zero, store the message - /// int - /// custom_push_region(const char* name) - /// { - /// if(!original_callbacks.push_annotated_region) - /// return OMNITRACE_USER_ERROR_NO_BINDING; - /// - /// int32_t _err = errno; - /// const char* _msg = nullptr; - /// char _buff[1024]; - /// if(_err != 0) _msg = strerror_r(_err, _buff, sizeof(_buff)); - /// - /// omnitrace_annotation_t _annotates[] = { { "errno", OMNITRACE_INT32, &_err }, - /// { "msg", OMNITRACE_STRING, _msg } }; - /// return (*original_callbacks.push_annotated_region)(name, &_annotations, 2); - /// } - /// - /// int - /// main(int argc, char** argv) - /// { - /// custom_callbacks.push_region = &custom_push_region; - /// omnitrace_user_configure(OMNITRACE_USER_UNION_CONFIG, custom_callbacks, - /// &original_callbacks); - /// // ... - /// } - /// - /// @endcode + /// @typedef omnitrace_user_callbacks omnitrace_user_callbacks_t typedef struct omnitrace_user_callbacks { omnitrace_trace_func_t start_trace; @@ -86,11 +51,28 @@ extern "C" omnitrace_region_func_t pop_region; omnitrace_annotated_region_func_t push_annotated_region; omnitrace_annotated_region_func_t pop_annotated_region; + + /// @var start_trace + /// @brief callback for enabling tracing globally + /// @var stop_trace + /// @brief callback for disabling tracing globally + /// @var start_thread_trace + /// @brief callback for enabling tracing on current thread + /// @var stop_thread_trace + /// @brief callback for disabling tracing on current thread + /// @var push_region + /// @brief callback for starting a trace region + /// @var pop_region + /// @brief callback for ending a trace region + /// @var push_annotated_region + /// @brief callback for starting a trace region + annotations + /// @var pop_annotated_region + /// @brief callback for ending a trace region + annotations } omnitrace_user_callbacks_t; - /// @typedef omnitrace_user_configure_mode_t + /// @enum OMNITRACE_USER_CONFIGURE_MODE /// @brief Identifier for errors - /// + /// @typedef OMNITRACE_USER_CONFIGURE_MODE omnitrace_user_configure_mode_t typedef enum OMNITRACE_USER_CONFIGURE_MODE { // clang-format off @@ -101,8 +83,9 @@ extern "C" // clang-format on } omnitrace_user_configure_mode_t; - /// @typedef omnitrace_user_error_t + /// @enum OMNITRACE_USER_ERROR /// @brief Identifier for errors + /// @typedef OMNITRACE_USER_ERROR omnitrace_user_error_t /// typedef enum OMNITRACE_USER_ERROR { diff --git a/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/user.h b/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/user.h index 385df0612a..2b6db9bdac 100644 --- a/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/user.h +++ b/projects/rocprofiler-systems/source/lib/omnitrace-user/omnitrace/user.h @@ -42,36 +42,36 @@ extern "C" #endif /// @fn int omnitrace_user_start_trace(void) - /// @return @ref OMNITRACE_USER_ERROR value + /// @return omnitrace_user_error_t value /// @brief Enable tracing on this thread and all subsequently created threads extern int omnitrace_user_start_trace(void) OMNITRACE_PUBLIC_API; /// @fn int omnitrace_user_stop_trace(void) - /// @return @ref OMNITRACE_USER_ERROR value + /// @return omnitrace_user_error_t value /// @brief Disable tracing on this thread and all subsequently created threads extern int omnitrace_user_stop_trace(void) OMNITRACE_PUBLIC_API; /// @fn int omnitrace_user_start_thread_trace(void) - /// @return @ref OMNITRACE_USER_ERROR value + /// @return omnitrace_user_error_t value /// @brief Enable tracing on this specific thread. Does not apply to subsequently /// created threads extern int omnitrace_user_start_thread_trace(void) OMNITRACE_PUBLIC_API; /// @fn int omnitrace_user_stop_thread_trace(void) - /// @return @ref OMNITRACE_USER_ERROR value + /// @return omnitrace_user_error_t value /// @brief Disable tracing on this specific thread. Does not apply to subsequently /// created threads extern int omnitrace_user_stop_thread_trace(void) OMNITRACE_PUBLIC_API; /// @fn int omnitrace_user_push_region(const char* id) /// @param id The string identifier for the region - /// @return @ref OMNITRACE_USER_ERROR value + /// @return omnitrace_user_error_t value /// @brief Start a user defined region. extern int omnitrace_user_push_region(const char*) OMNITRACE_PUBLIC_API; /// @fn int omnitrace_user_pop_region(const char* id) /// @param id The string identifier for the region - /// @return @ref OMNITRACE_USER_ERROR value + /// @return omnitrace_user_error_t value /// @brief End a user defined region. In general, user regions should be popped in /// the inverse order that they were pushed, i.e. first-in, last-out (FILO). The /// timemory backend was designed to accommodate asynchronous tasking, where FILO may @@ -80,13 +80,15 @@ extern "C" /// results in timemory vs. perfetto. extern int omnitrace_user_pop_region(const char*) OMNITRACE_PUBLIC_API; + /// @typedef omnitrace_annotation omnitrace_annotation_t + /// /// @fn int omnitrace_user_push_annotated_region(const char* id, /// omnitrace_annotation_t* annotations, /// size_t num_annotations) /// @param id The string identifier for the region - /// @param annotations Array of @ref omnitrace_annotation_t instances + /// @param annotations Array of @ref omnitrace_annotation instances /// @param num_annotations Number of annotations - /// @return @ref OMNITRACE_USER_ERROR value + /// @return omnitrace_user_error_t value /// @brief Start a user defined region and adds the annotations to the perfetto trace. extern int omnitrace_user_push_annotated_region(const char*, omnitrace_annotation_t*, size_t) OMNITRACE_PUBLIC_API; @@ -95,23 +97,23 @@ extern "C" /// omnitrace_annotation_t* annotations, /// size_t num_annotations) /// @param id The string identifier for the region - /// @param annotations Array of @ref omnitrace_annotation_t instances + /// @param annotations Array of @ref omnitrace_annotation instances /// @param num_annotations Number of annotations - /// @return @ref OMNITRACE_USER_ERROR value + /// @return omnitrace_user_error_t value /// @brief Stop a user defined region and adds the annotations to the perfetto trace. extern int omnitrace_user_pop_annotated_region(const char*, omnitrace_annotation_t*, size_t) OMNITRACE_PUBLIC_API; - /// @fn int omnitrace_user_configure(omnitrace_user_configure_mode_t cfg, - /// omnitrace_user_callbacks_t new_callbacks, - /// omnitrace_user_callbacks_t* old_callbacks) - /// @param[in] config Specifies how the new callbacks are merged with the old + /// @fn int omnitrace_user_configure(omnitrace_user_configure_mode_t mode, + /// omnitrace_user_callbacks_t inp, + /// omnitrace_user_callbacks_t* out) + /// @param[in] mode Specifies how the new callbacks are merged with the old /// callbacks - /// @param[in] new_callbacks An @ref omnitrace_user_callbacks_t instance specifying + /// @param[in] inp An @ref omnitrace_user_callbacks instance specifying /// the callbacks which should be invoked by the user API. - /// @param[out] old_callbacks Pointer to @ref omnitrace_user_callbacks_t which, + /// @param[out] out Pointer to @ref omnitrace_user_callbacks which, /// when non-NULL, will be assigned the former callbacks. - /// @return @ref omnitrace_user_error_t value + /// @return omnitrace_user_error_t value /// @brief Configure the function pointers invoked by the omnitrace user API. /// The initial callbacks are set via the omnitrace-dl library when it is loaded but /// the user can user this feature to turn on/off the user API or customize how the @@ -120,8 +122,8 @@ extern "C" /// regions to the annotated user regions with annotations about some global state. /// Changing the callbacks is thread-safe but not thread-local. extern int omnitrace_user_configure( - omnitrace_user_configure_mode_t, omnitrace_user_callbacks_t new_callbacks, - omnitrace_user_callbacks_t* old_callbacks) OMNITRACE_PUBLIC_API; + omnitrace_user_configure_mode_t mode, omnitrace_user_callbacks_t inp, + omnitrace_user_callbacks_t* out) OMNITRACE_PUBLIC_API; /// @fn int omnitrace_user_get_callbacks(int category, void** begin_func, void** /// end_func) @@ -130,7 +132,7 @@ extern "C" /// the category, e.g. omnitrace_user_start_trace or omnitrace_user_push_region /// @param[out] end_func The pointer to the function which corresponds to "ending" the /// category, e.g. omnitrace_user_stop_trace or omnitrace_user_pop_region - /// @return @ref OMNITRACE_USER_ERROR value + /// @return omnitrace_user_error_t value /// @brief Get the current function pointers for a given category. The initial values /// are assigned by omnitrace-dl at start up. extern int omnitrace_user_get_callbacks(omnitrace_user_callbacks_t*) @@ -138,7 +140,7 @@ extern "C" /// @fn const char* omnitrace_user_error_string(int error_category) /// @param error_category OMNITRACE_USER_ERROR value - /// @return @ref OMNITRACE_USER_ERROR value + /// @return String descripting the error code /// @brief Return a descriptor for the provided error code extern const char* omnitrace_user_error_string(int) OMNITRACE_PUBLIC_API; diff --git a/projects/rocprofiler-systems/source/lib/omnitrace-user/user.cpp b/projects/rocprofiler-systems/source/lib/omnitrace-user/user.cpp index ea16eb73a5..0b55a530df 100644 --- a/projects/rocprofiler-systems/source/lib/omnitrace-user/user.cpp +++ b/projects/rocprofiler-systems/source/lib/omnitrace-user/user.cpp @@ -94,17 +94,17 @@ extern "C" _annotation_count); } - int omnitrace_user_configure(omnitrace_user_configure_mode_t _mode, - omnitrace_user_callbacks_t _inp, - omnitrace_user_callbacks_t* _out) + int omnitrace_user_configure(omnitrace_user_configure_mode_t mode, + omnitrace_user_callbacks_t inp, + omnitrace_user_callbacks_t* out) { auto _former = _callbacks; - switch(_mode) + switch(mode) { case OMNITRACE_USER_REPLACE_CONFIG: { - _callbacks = _inp; + _callbacks = inp; break; } case OMNITRACE_USER_UNION_CONFIG: @@ -115,14 +115,14 @@ extern "C" user_callbacks_t _v = _callbacks; - _update(_v.start_trace, _inp.start_trace); - _update(_v.stop_trace, _inp.stop_trace); - _update(_v.start_thread_trace, _inp.start_thread_trace); - _update(_v.stop_thread_trace, _inp.stop_thread_trace); - _update(_v.push_region, _inp.push_region); - _update(_v.pop_region, _inp.pop_region); - _update(_v.push_annotated_region, _inp.push_annotated_region); - _update(_v.pop_annotated_region, _inp.pop_annotated_region); + _update(_v.start_trace, inp.start_trace); + _update(_v.stop_trace, inp.stop_trace); + _update(_v.start_thread_trace, inp.start_thread_trace); + _update(_v.stop_thread_trace, inp.stop_thread_trace); + _update(_v.push_region, inp.push_region); + _update(_v.pop_region, inp.pop_region); + _update(_v.push_annotated_region, inp.push_annotated_region); + _update(_v.pop_annotated_region, inp.pop_annotated_region); _callbacks = _v; break; @@ -135,26 +135,26 @@ extern "C" user_callbacks_t _v = _callbacks; - _update(_v.start_trace, _inp.start_trace); - _update(_v.stop_trace, _inp.stop_trace); - _update(_v.start_thread_trace, _inp.start_thread_trace); - _update(_v.stop_thread_trace, _inp.stop_thread_trace); - _update(_v.push_region, _inp.push_region); - _update(_v.pop_region, _inp.pop_region); - _update(_v.push_annotated_region, _inp.push_annotated_region); - _update(_v.pop_annotated_region, _inp.pop_annotated_region); + _update(_v.start_trace, inp.start_trace); + _update(_v.stop_trace, inp.stop_trace); + _update(_v.start_thread_trace, inp.start_thread_trace); + _update(_v.stop_thread_trace, inp.stop_thread_trace); + _update(_v.push_region, inp.push_region); + _update(_v.pop_region, inp.pop_region); + _update(_v.push_annotated_region, inp.push_annotated_region); + _update(_v.pop_annotated_region, inp.pop_annotated_region); _callbacks = _v; break; } default: { - if(_out) *_out = _former; + if(out) *out = _former; return OMNITRACE_USER_ERROR_INVALID_CATEGORY; } } - if(_out) *_out = _former; + if(out) *out = _former; return OMNITRACE_USER_SUCCESS; }