Skip to content
Snippets Groups Projects
Commit 419ba97d authored by Nick Mathewson's avatar Nick Mathewson :family:
Browse files

Allow struct_magic to be disabled.

When a subsystem is disabled, there will be no corresponding object
allocated, and no magic numbers on it.
parent 9082a6db
No related branches found
No related tags found
No related merge requests found
......@@ -131,6 +131,9 @@ typedef struct struct_member_t {
*
* These 'magic numbers' are 32-bit values used to tag objects to make sure
* that they have the correct type.
*
* If all fields in this structure are zero or 0, the magic-number check is
* not performed.
*/
typedef struct struct_magic_decl_t {
/** The name of the structure */
......
......@@ -29,14 +29,29 @@
#include <stddef.h>
/**
* Return true iff all fields on <b>decl</b> are NULL or 0, indicating that
* there is no object or no magic number to check.
**/
static inline bool
magic_is_null(const struct_magic_decl_t *decl)
{
return decl->typename == NULL &&
decl->magic_offset == 0 &&
decl->magic_val == 0;
}
/**
* Set the 'magic number' on <b>object</b> to correspond to decl.
**/
void
struct_set_magic(void *object, const struct_magic_decl_t *decl)
{
tor_assert(object);
tor_assert(decl);
if (magic_is_null(decl))
return;
tor_assert(object);
uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset);
*ptr = decl->magic_val;
}
......@@ -47,8 +62,11 @@ struct_set_magic(void *object, const struct_magic_decl_t *decl)
void
struct_check_magic(const void *object, const struct_magic_decl_t *decl)
{
tor_assert(object);
tor_assert(decl);
if (magic_is_null(decl))
return;
tor_assert(object);
const uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset);
tor_assertf(*ptr == decl->magic_val,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment