mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	Previously, a client disconnecting while a sample was playing could lead to issues. For example, if a client disconnected before the "ready" signal of the sample-play arrives, `operation_new_cb()` would be called and that would try to use the client's pw_manager, however, that has previously been destroyed in `client_disconnect()`. If the client disconnected after the "ready" signal but before the reply has been sent, then `sample_play_ready_reply()` would never be called since operations are completed via the client's pw_manager which would already be destroyed at that point. Fix this by installing a listener on the client, and properly cancelling the operation and making sure that the pending_sample is correctly destroyed.
		
			
				
	
	
		
			32 lines
		
	
	
	
		
			766 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
	
		
			766 B
		
	
	
	
		
			C
		
	
	
	
	
	
/* PipeWire */
 | 
						|
/* SPDX-FileCopyrightText: Copyright © 2020 Wim Taymans */
 | 
						|
/* SPDX-License-Identifier: MIT */
 | 
						|
 | 
						|
#ifndef PULSE_SERVER_PENDING_SAMPLE_H
 | 
						|
#define PULSE_SERVER_PENDING_SAMPLE_H
 | 
						|
 | 
						|
#include <stdint.h>
 | 
						|
 | 
						|
#include <spa/utils/list.h>
 | 
						|
#include <spa/utils/hook.h>
 | 
						|
 | 
						|
struct client;
 | 
						|
struct pw_properties;
 | 
						|
struct sample;
 | 
						|
struct sample_play;
 | 
						|
 | 
						|
struct pending_sample {
 | 
						|
	struct spa_list link;
 | 
						|
	struct client *client;
 | 
						|
	struct sample_play *play;
 | 
						|
	struct spa_hook listener;
 | 
						|
	struct spa_hook client_listener;
 | 
						|
	uint32_t tag;
 | 
						|
	unsigned replied:1;
 | 
						|
	unsigned done:1;
 | 
						|
};
 | 
						|
 | 
						|
int pending_sample_new(struct client *client, struct sample *sample, struct pw_properties *props, uint32_t tag);
 | 
						|
void pending_sample_free(struct pending_sample *ps);
 | 
						|
 | 
						|
#endif /* PULSE_SERVER_PENDING_SAMPLE_H */
 |