103 lines
3.2 KiB
C
103 lines
3.2 KiB
C
#ifndef SENTRY_SCOPE_H_INCLUDED
|
|
#define SENTRY_SCOPE_H_INCLUDED
|
|
|
|
#include "sentry_boot.h"
|
|
|
|
#include "sentry_session.h"
|
|
#include "sentry_value.h"
|
|
|
|
/**
|
|
* This represents the current scope.
|
|
*/
|
|
typedef struct sentry_scope_s {
|
|
char *transaction;
|
|
sentry_value_t fingerprint;
|
|
sentry_value_t user;
|
|
sentry_value_t tags;
|
|
sentry_value_t extra;
|
|
sentry_value_t contexts;
|
|
sentry_value_t breadcrumbs;
|
|
sentry_level_t level;
|
|
sentry_value_t client_sdk;
|
|
|
|
// The span attached to this scope, if any.
|
|
//
|
|
// Conceptually, every transaction is a span, so it should be possible to
|
|
// attach spans or transactions to a scope. But sentry_span_t and
|
|
// sentry_transaction_t are unrelated types in the native SDK, so we need
|
|
// two distinct pointers. At most one of them should ever be non-null.
|
|
// Whenever possible, `transaction` should pull its value from the
|
|
// `name` property nested in transaction_object or span.
|
|
sentry_transaction_t *transaction_object;
|
|
sentry_span_t *span;
|
|
} sentry_scope_t;
|
|
|
|
/**
|
|
* When applying a scope to an event object, this specifies all the additional
|
|
* data that should be added to the event.
|
|
*/
|
|
typedef enum {
|
|
SENTRY_SCOPE_NONE = 0x0,
|
|
// Add all the breadcrumbs from the scope to the event.
|
|
SENTRY_SCOPE_BREADCRUMBS = 0x1,
|
|
// Add the module list to the event.
|
|
SENTRY_SCOPE_MODULES = 0x2,
|
|
// Symbolize all the stacktraces on-device which are found in the event.
|
|
SENTRY_SCOPE_STACKTRACES = 0x4,
|
|
// All of the above.
|
|
SENTRY_SCOPE_ALL = ~0,
|
|
} sentry_scope_mode_t;
|
|
|
|
/**
|
|
* This will acquire a lock on the global scope.
|
|
*/
|
|
sentry_scope_t *sentry__scope_lock(void);
|
|
|
|
/**
|
|
* Release the lock on the global scope.
|
|
*/
|
|
void sentry__scope_unlock(void);
|
|
|
|
/**
|
|
* This will free all the data attached to the global scope
|
|
*/
|
|
void sentry__scope_cleanup(void);
|
|
|
|
/**
|
|
* This will notify any backend of scope changes.
|
|
* This function must be called while holding the scope lock, and it will be
|
|
* unlocked internally.
|
|
*/
|
|
void sentry__scope_flush_unlock();
|
|
|
|
/**
|
|
* This will merge the requested data which is in the given `scope` to the given
|
|
* `event`.
|
|
* See `sentry_scope_mode_t` for the different types of data that can be
|
|
* attached.
|
|
*/
|
|
void sentry__scope_apply_to_event(const sentry_scope_t *scope,
|
|
const sentry_options_t *options, sentry_value_t event,
|
|
sentry_scope_mode_t mode);
|
|
|
|
/**
|
|
* These are convenience macros to automatically lock/unlock a scope inside a
|
|
* code block.
|
|
*/
|
|
#define SENTRY_WITH_SCOPE(Scope) \
|
|
for (const sentry_scope_t *Scope = sentry__scope_lock(); Scope; \
|
|
sentry__scope_unlock(), Scope = NULL)
|
|
#define SENTRY_WITH_SCOPE_MUT(Scope) \
|
|
for (sentry_scope_t *Scope = sentry__scope_lock(); Scope; \
|
|
sentry__scope_flush_unlock(), Scope = NULL)
|
|
#define SENTRY_WITH_SCOPE_MUT_NO_FLUSH(Scope) \
|
|
for (sentry_scope_t *Scope = sentry__scope_lock(); Scope; \
|
|
sentry__scope_unlock(), Scope = NULL)
|
|
|
|
#endif
|
|
|
|
// this is only used in unit tests
|
|
#ifdef SENTRY_UNITTEST
|
|
sentry_value_t sentry__scope_get_span_or_transaction();
|
|
#endif
|