mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-28 06:13:31 +01:00
Allow struct_magic to be disabled.
When a subsystem is disabled, there will be no corresponding object allocated, and no magic numbers on it.
This commit is contained in:
parent
9082a6db3f
commit
419ba97df5
@ -131,6 +131,9 @@ typedef struct struct_member_t {
|
|||||||
*
|
*
|
||||||
* These 'magic numbers' are 32-bit values used to tag objects to make sure
|
* These 'magic numbers' are 32-bit values used to tag objects to make sure
|
||||||
* that they have the correct type.
|
* 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 {
|
typedef struct struct_magic_decl_t {
|
||||||
/** The name of the structure */
|
/** The name of the structure */
|
||||||
|
@ -29,14 +29,29 @@
|
|||||||
|
|
||||||
#include <stddef.h>
|
#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.
|
* Set the 'magic number' on <b>object</b> to correspond to decl.
|
||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
struct_set_magic(void *object, const struct_magic_decl_t *decl)
|
struct_set_magic(void *object, const struct_magic_decl_t *decl)
|
||||||
{
|
{
|
||||||
tor_assert(object);
|
|
||||||
tor_assert(decl);
|
tor_assert(decl);
|
||||||
|
if (magic_is_null(decl))
|
||||||
|
return;
|
||||||
|
|
||||||
|
tor_assert(object);
|
||||||
uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset);
|
uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset);
|
||||||
*ptr = decl->magic_val;
|
*ptr = decl->magic_val;
|
||||||
}
|
}
|
||||||
@ -47,8 +62,11 @@ struct_set_magic(void *object, const struct_magic_decl_t *decl)
|
|||||||
void
|
void
|
||||||
struct_check_magic(const void *object, const struct_magic_decl_t *decl)
|
struct_check_magic(const void *object, const struct_magic_decl_t *decl)
|
||||||
{
|
{
|
||||||
tor_assert(object);
|
|
||||||
tor_assert(decl);
|
tor_assert(decl);
|
||||||
|
if (magic_is_null(decl))
|
||||||
|
return;
|
||||||
|
|
||||||
|
tor_assert(object);
|
||||||
|
|
||||||
const uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset);
|
const uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset);
|
||||||
tor_assertf(*ptr == decl->magic_val,
|
tor_assertf(*ptr == decl->magic_val,
|
||||||
|
Loading…
Reference in New Issue
Block a user