Commit Graph

36 Commits

Author SHA1 Message Date
Julian Bouzas
24cfa053eb object-manager: release interest when destroying iterator 2020-05-19 10:18:51 -04:00
George Kiagiadakis
5eecc5b68a object-manager: remove deprecated API 2020-05-14 16:24:34 +03:00
George Kiagiadakis
1e4a79c80e registry: do not expose early removed globals to object managers 2020-05-14 10:27:03 +03:00
George Kiagiadakis
d89c4ecd94 object-manager: don't try to install if there is no core
This happens when the daemon fails to connect and the
not installed object managers try to get installed, but
the weak ref to the core is already gone
2020-05-13 19:52:25 +03:00
George Kiagiadakis
151480f3e4 object-manager: wait until globals appear before emitting "installed"
object managers that are registered a bit early (such as the one in
wireplumber-cli) have no use if they are declared as installed before
any globals appear. After the initial registry startup, there should
be at least 1 global, the core (id=0), so even if this client has
no access to any object, the object manager should be able to
finish its installation successfully
2020-05-13 19:29:08 +03:00
George Kiagiadakis
f6dacf7cf7 lib: remove WpFactory (no longer used) 2020-05-13 15:29:17 +03:00
Julian Bouzas
5ea7e6fc0b object-manager: emit the object-removed signal after the object is removed 2020-05-12 13:37:36 -04:00
George Kiagiadakis
ded2e34eb6 global: properly destroy impl proxies that were removed by the server
When a pw_global is removed on the server (by pw_registry_destroy() or other
means), it triggers the proxy removed & the registry global_remove callbacks,
but it does not necessarily destroy the pw_proxy.

For client proxies, we were previously destroying them by unrefing the WpProxy
in wp_global_rm_flags(), since the global was not "owned" by the WpProxy.

For impl proxies, we were not doing anything, as we expected that it would
only be removed from the registry if the local WpProxy was destroyed first.
This is not always the case, though, as the server or another client may
request to destroy this proxy with pw_registry_destroy()

Now we always destroy the pw_proxy as soon as it is removed from the registry,
no matter if it was a client or an impl proxy. If it was an impl proxy,
the WpProxy will continue to live and it's up to the code that created it
to handle the "pw-proxy-destroyed" signal and do something meaningful.
If it was a client proxy, the global will still unref the WpProxy right after
destroying the pw_proxy and there is no change in behavior.
2020-05-07 15:50:14 +03:00
George Kiagiadakis
bd0ede2c6a object-manager: add _is_installed() method to query installation status 2020-05-07 15:45:00 +03:00
George Kiagiadakis
735b44c238 object-manager/proxy: sprinkle some debug/trace statements 2020-05-03 19:44:42 +03:00
George Kiagiadakis
9e1b5de93f object-manager: port to WpObjectInterest and add more useful API based on it 2020-05-01 19:23:54 +03:00
George Kiagiadakis
9f1b46eed6 object-manager: implement the 'installed' signal and improve state management
The 'installed' signal can be used to know that there are no
known objects that are being prepared internally, so the object
manager is ready to use.

This also improves internal state management so that the 'objects-changed'
signal cannot be fired earlier than it should. Previously there
were corner cases with complex proxy features, as the object manager
relied on the fact that after a core 'sync' it is safe to assume
that all proxies are augmented... that's not always the case.
2020-04-24 20:36:53 +03:00
Julian Bouzas
135b1c2cbf object-manager: only get proxy properties when needed 2020-04-21 16:11:05 -04:00
George Kiagiadakis
1dccdcf415 object-manager: replace GPtrArray API with WpIterator
+ add the useful _find_proxy() method
2020-04-21 13:21:03 +03:00
George Kiagiadakis
9ca342f89f debug: update all library code to use the new debug system
+ enable the new log writer on the executables
+ enable structured logging in the tests
2020-04-14 18:31:17 +03:00
George Kiagiadakis
bb78b6bbc7 doc: remove references to WpImplEndpoint that is now private 2020-03-31 16:11:08 +03:00
George Kiagiadakis
c06317ac3b object-manager: add _get_n_objects() method 2020-03-31 16:11:08 +03:00
George Kiagiadakis
25d8e5e375 object-manager: look into the proxy object when checking constraints on a global
This allows having constraints on the pw properties and the GObject
properties of the proxy, instead of just on the global properties.

This is only useful for constraints on impl proxies, since the globals
coming from the registry don't have a proxy object associated at the
time they are added in the object managers
2020-03-31 16:11:08 +03:00
George Kiagiadakis
1a45e6504f object-manager: fix crash when global is removed before it was added in the globals list 2020-03-31 16:11:08 +03:00
George Kiagiadakis
d4973363ac lib: add extensive API documentation 2020-02-19 10:43:07 +02:00
George Kiagiadakis
77bb816b52 registry: change _prepare_new_global() to return the global in a less awkward way
the global is stored internally and the returned ref is only useful
in the WpProxy code, not in the registry_global() event
2020-02-17 18:41:36 +02:00
George Kiagiadakis
c46a48d13f registry: hide again the WpCore struct, separate registry and core better 2020-02-17 18:31:03 +02:00
George Kiagiadakis
0b55729e06 registry: set a free func in the globals list
it doesn't matter, because we don't use it, but for the sake of readability
2020-02-17 16:43:47 +02:00
George Kiagiadakis
949100c9c0 object-manager: reorder code in object-manager.c 2020-02-14 17:19:41 +02:00
George Kiagiadakis
472d63e1b0 registry: fix internal documentation 2020-02-14 17:19:35 +02:00
George Kiagiadakis
51272907fe registry: expose tmp globals in the order they appeared on the pw registry
some code is expecting things to happen in that order...
2020-02-14 17:19:26 +02:00
George Kiagiadakis
813351bcdf registry: safely destroy proxy when its initial augment is still in progress
... in case the global is removed from the registry before
the initial augment completes
2020-02-14 17:19:15 +02:00
George Kiagiadakis
269b9e1998 registry: use a temporary globals list
When a new global is created, it is not certain
if the registry global event or the proxy bound event will
be fired first. In order to make sure we associate all
proxies to their WpGlobals correctly, we now wait a core sync
before exposing globals to the object managers, so that in case
the implementation proxy receives the bound event after the
registry creates the WpGlobal, we can make sure to use this
proxy instead of constructing a new one through the object managers
2020-02-14 17:18:58 +02:00
George Kiagiadakis
753e708544 object-manager: refactor to be able to track locally created proxies
There are 3 kinds of WpProxy objects:
 * the ones that are created as a result of binding a global
   from the registry
 * the ones that are created as a result of calling into a remote
   factory (wp_node_new_from_factory, etc...)
 * the ones that are a local implementation of an object
   (WpImplNode, etc...) and are exported

Previously the object manager was only able to track the first kind.
With these changes we can now also have globals associated with
WpProxies that were created earlier (and caused the creation of the global).
This saves some resources and reduces round-trips (in case client
code wants to change properties of an object that is locally
implemented, it shouldn't need to do a round-trip through the server)
2020-02-14 17:12:23 +02:00
George Kiagiadakis
a92e1a64ec global & object-manager: use GType instead of the pipewire type 2020-02-12 14:15:51 +02:00
George Kiagiadakis
d8ae151aba proxy: replace global-id with bound-id
+ use the pw_proxy API to find the bound id instead
of relying on WpGlobal

This has the advantage that it works also for exported
objects and for objects that have been created by calling
into a remote factory (such as the link-factory), so we can
now know the global id of all proxies, not only the ones
that have been created by the registry.
2020-02-10 18:58:41 +02:00
Julian Bouzas
a9ac1fdc06 update to the latest pipewire API 2020-01-13 15:07:08 -05:00
George Kiagiadakis
92107e8342 object-manager: keep a reference to self while doing a core sync
Otherwise, if the object manager is destroyed while a sync is in progress,
we get an invalid 'self' pointer on the callback later, which is being
called regardless

There is a bit more work that should be done in the core to avoid leaking
this ref in case pipewire disconnects before the sync is completed
2019-12-05 12:05:34 +02:00
Julian Bouzas
58f321f815 object-manager: sync object-changed with pipewire's core 2019-12-04 16:38:35 -05:00
Julian Bouzas
7f8fb72849 object-manager: sync on the core 2019-11-27 13:44:32 -05:00
George Kiagiadakis
73978f76aa object-manager: actually add the object-manager.* files in git 2019-11-13 16:07:36 +02:00