tracing-cloudchamber 0.1.0

Extend tracing with an ffi via cxx to emit events and create spans in C++
Documentation

#include "lib.h"
#include "rust/cxx.h"
#include "tracing-cloudchamber/src/lib.rs.h"
#include <atomic>
#include <cassert>
#include <iomanip>
#include <iostream>

namespace cloudchamber {

Interest Callsite::register_site() const {
  uint8_t expected = callsite::UNREGISTERED;
  if (registration.compare_exchange_strong(expected, callsite::REGISTERING,
                                           std::memory_order_acq_rel,
                                           std::memory_order_acquire)) {
    registration.store(callsite::REGISTERED, std::memory_order_release);
  } else {
    auto val = registration.load(std::memory_order_acquire);
    if (val != callsite::REGISTERED) {
      assert(val == callsite::REGISTERING);
      return {::cloudchamber::detail::InterestKind::SOMERTIMES};
    }
  }
  switch (interest.load(std::memory_order_relaxed)) {
  case callsite::INTEREST_NEVER:
    return {::cloudchamber::detail::InterestKind::NEVER};
  case callsite::INTEREST_ALWAYS:
    return {::cloudchamber::detail::InterestKind::ALWAYS};
  default:
    return {::cloudchamber::detail::InterestKind::SOMERTIMES};
  }
}

void Callsite::store_interest(const cloudchamber::Interest &intrst) const {
  uint8_t val;
  switch (intrst.value) {
  case ::cloudchamber::detail::InterestKind::ALWAYS:
    val = cloudchamber::callsite::INTEREST_ALWAYS;
    break;
  case ::cloudchamber::detail::InterestKind::NEVER:
    val = cloudchamber::callsite::INTEREST_NEVER;
    break;
  case ::cloudchamber::detail::InterestKind::SOMERTIMES:
  default:
    val = cloudchamber::callsite::INTEREST_SOMETIMES;
  }
  std::cout << "storing interest " << val << std::endl;
  interest.store(val, std::memory_order_seq_cst);
}

rust::Box<RustMetadata> const &Callsite::get_meta() const {
  if (!rust_meta.has_value()) {
    rust_meta.emplace(::cloudchamber::new_rust_metadata(*meta));
  }
  return rust_meta.value();
}

bool Callsite::is_enabled() const {
  return default_enabled_for_meta(get_interest(), get_meta());
}

Interest Callsite::get_interest() const {
  switch (interest.load(std::memory_order_relaxed)) {
  case ::cloudchamber::callsite::INTEREST_NEVER:
    return {::cloudchamber::detail::InterestKind::NEVER};
  case ::cloudchamber::callsite::INTEREST_ALWAYS:
    return {::cloudchamber::detail::InterestKind::ALWAYS};
  default:
    return register_site();
  }
}
void Callsite::set_metadata_ptr(const ::cloudchamber::Metadata *ptr) const {
  meta = ptr;
}

std::uint8_t const &FieldValue::get_u8() const noexcept {
  return rcast<std::uint8_t>();
}
std::uint16_t const &FieldValue::get_u16() const noexcept {
  return rcast<std::uint16_t>();
}
std::uint32_t const &FieldValue::get_u32() const noexcept {
  return rcast<std::uint32_t>();
}
std::uint64_t const &FieldValue::get_u64() const noexcept {
  return rcast<std::uint64_t>();
}
std::int8_t const &FieldValue::get_i8() const noexcept {
  return rcast<std::int8_t>();
}
std::int16_t const &FieldValue::get_i16() const noexcept {
  return rcast<std::int16_t>();
}
std::int32_t const &FieldValue::get_i32() const noexcept {
  return rcast<std::int32_t>();
}
std::int64_t const &FieldValue::get_i64() const noexcept {
  return rcast<std::int64_t>();
}
float const &FieldValue::get_f32() const noexcept { return rcast<float>(); }
double const &FieldValue::get_f64() const noexcept { return rcast<double>(); }
bool const &FieldValue::get_bool() const noexcept { return rcast<bool>(); }
rust::String const &FieldValue::get_string() const noexcept {
  _string = ::rust::String::lossy(cast<std::string>());
  return _string;
}
rust::String const &FieldValue::get_str() const noexcept {
  _string = rust::String::lossy(cast<std::string_view>().data());
  return _string;
}

rust::Box<DisplayValue> const &FieldValue::get_debug() const {
  if (debug_formater != nullptr) {
    _display.emplace(::cloudchamber::string_to_display_value(debug_formater()));
    return _display.value();
  } else {
    throw std::runtime_error("No debug formatter stored for this type.");
  }
}

ScopeLambda::ScopeLambda(std::function<void()> f) : f(f) {}

void ScopeLambda::call() const { f(); }

namespace util {

template <> std::string toString(std::string const &s) {
  std::ostringstream out;
  out << std::quoted(s);
  return out.str();
}

template <> std::string toString(std::string_view const &s) {
  std::ostringstream out;
  out << std::quoted(s);
  return out.str();
}

std::string toString(const char *s) {
  std::ostringstream out;
  out << std::quoted(s);
  return out.str();
}

} // namespace util

} // namespace cloudchamber