wireplumber/lib/wp/object-interest.h
Julian Bouzas b80a0975c7 event-dispatcher: Register hooks for defined events in a hash table
Since all the current hooks are defined specifically for a particular event
type, we can register the hooks in a hash table using the event type as key
for faster event hook collection.

Also, hooks that are not specific to a particular event type, like constraints
such as 'event.type=*', will be registered in both the undefined hook list,
and also in all the hash table defined hook lists so they are always evaluated.

Even though 'wp_event_dispatcher_new_hooks_iterator()' can still be used, it is
now marked as deprecated because it is slower. The event hook collection uses
'wp_event_dispatcher_new_hooks_for_event_type_iterator()' now because it is
much faster.

Previously, the more hooks we were registering, the slower WirePlumber would
process events as all hooks needed to be evaluated for all events constantly.
This is not the case anymore with this patch. We can register thousands of
hooks, and if only 1 of those runs for a particular event, only 1 will be
evaluated instead of all of them.

See #824
2025-11-24 08:01:00 -05:00

141 lines
4.3 KiB
C

/* WirePlumber
*
* Copyright © 2020 Collabora Ltd.
* @author George Kiagiadakis <george.kiagiadakis@collabora.com>
*
* SPDX-License-Identifier: MIT
*/
#ifndef __WIREPLUMBER_OBJECT_INTEREST_H__
#define __WIREPLUMBER_OBJECT_INTEREST_H__
#include <glib-object.h>
#include "defs.h"
#include "properties.h"
G_BEGIN_DECLS
/*!
* \brief Constraint types for wp_object_interest_add_constraint()
* \ingroup wpobjectinterest
*/
typedef enum {
/*! invalid constraint type */
WP_CONSTRAINT_TYPE_NONE = 0,
/*! constraint applies to a PipeWire global property of the object
* (the ones returned by wp_global_proxy_get_global_properties()) */
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY,
/*! constraint applies to a PipeWire property of the object
* (the ones returned by wp_pipewire_object_get_properties()) */
WP_CONSTRAINT_TYPE_PW_PROPERTY,
/*! constraint applies to a GObject property of the object */
WP_CONSTRAINT_TYPE_G_PROPERTY,
} WpConstraintType;
/*!
* \brief Verbs to use with wp_object_interest_add_constraint()
* \ingroup wpobjectinterest
*/
typedef enum {
/*! the subject's value must equal the constraint's value */
WP_CONSTRAINT_VERB_EQUALS = '=',
/*! the subject's value must be different from the constraint's value */
WP_CONSTRAINT_VERB_NOT_EQUALS = '!',
/*! the subject's value must equal at least
* one of the values in the list given as the constraint's value */
WP_CONSTRAINT_VERB_IN_LIST = 'c',
/*! the subject's value must be a number in the range defined
* by the constraint's value */
WP_CONSTRAINT_VERB_IN_RANGE = '~',
/*! the subject's value must match the pattern specified in the
* constraint's value */
WP_CONSTRAINT_VERB_MATCHES = '#',
/*! the subject property must exist */
WP_CONSTRAINT_VERB_IS_PRESENT = '+',
/*! the subject property must not exist */
WP_CONSTRAINT_VERB_IS_ABSENT = '-',
} WpConstraintVerb;
/*!
* \brief Flags that indicate which constraints have been matched in
* wp_object_interest_matches_full()
* \ingroup wpobjectinterest
*/
typedef enum { /*< flags >*/
WP_INTEREST_MATCH_NONE = 0,
WP_INTEREST_MATCH_GTYPE = (1 << 0),
WP_INTEREST_MATCH_PW_GLOBAL_PROPERTIES = (1 << 1),
WP_INTEREST_MATCH_PW_PROPERTIES = (1 << 2),
WP_INTEREST_MATCH_G_PROPERTIES = (1 << 3),
/*!
* Special WpInterestMatch value that indicates that all constraints
* have been matched
*/
WP_INTEREST_MATCH_ALL =
(WP_INTEREST_MATCH_GTYPE |
WP_INTEREST_MATCH_PW_GLOBAL_PROPERTIES |
WP_INTEREST_MATCH_PW_PROPERTIES |
WP_INTEREST_MATCH_G_PROPERTIES),
} WpInterestMatch;
/*!
* \brief Flags to alter the behaviour of wp_object_interest_matches_full()
* \ingroup wpobjectinterest
*/
typedef enum { /*< flags >*/
WP_INTEREST_MATCH_FLAGS_NONE = 0,
/*! check all the constraints instead of returning after the first mismatch */
WP_INTEREST_MATCH_FLAGS_CHECK_ALL = (1 << 0),
} WpInterestMatchFlags;
/*!
* \brief The WpObjectInterest GType
* \ingroup wpobjectinterest
*/
#define WP_TYPE_OBJECT_INTEREST (wp_object_interest_get_type ())
WP_API
GType wp_object_interest_get_type (void) G_GNUC_CONST;
typedef struct _WpObjectInterest WpObjectInterest;
WP_API
WpObjectInterest * wp_object_interest_new (GType gtype, ...) G_GNUC_NULL_TERMINATED;
WP_API
WpObjectInterest * wp_object_interest_new_valist (GType gtype, va_list * args);
WP_API
WpObjectInterest * wp_object_interest_new_type (GType gtype);
WP_API
void wp_object_interest_add_constraint (WpObjectInterest * self,
WpConstraintType type, const gchar * subject,
WpConstraintVerb verb, GVariant * value);
WP_API
WpObjectInterest * wp_object_interest_ref (WpObjectInterest *self);
WP_API
void wp_object_interest_unref (WpObjectInterest * self);
WP_API
gboolean wp_object_interest_validate (WpObjectInterest * self, GError ** error);
WP_API
gboolean wp_object_interest_matches (WpObjectInterest * self, gpointer object);
WP_API
WpInterestMatch wp_object_interest_matches_full (WpObjectInterest * self,
WpInterestMatchFlags flags, GType object_type, gpointer object,
WpProperties * pw_props, WpProperties * pw_global_props);
WP_API
GPtrArray * wp_object_interest_find_defined_constraint_values (
WpObjectInterest * self, WpConstraintType type, const gchar * subject);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (WpObjectInterest, wp_object_interest_unref)
G_END_DECLS
#endif