mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	module-pulse-tunnel: don't unload module from pulse thread
We are not allowed to call pipewire methods from any other thread than the main thread so use invoke to schedule a module unload from the pulseaudio thread. Fixes some infinite loops when the work-queue list gets corrupted.
This commit is contained in:
		
							parent
							
								
									a0457a3bdf
								
							
						
					
					
						commit
						f6e25c239f
					
				
					 1 changed files with 18 additions and 2 deletions
				
			
		| 
						 | 
					@ -135,6 +135,7 @@ static const struct spa_dict_item module_props[] = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct impl {
 | 
					struct impl {
 | 
				
			||||||
	struct pw_context *context;
 | 
						struct pw_context *context;
 | 
				
			||||||
 | 
						struct pw_loop *main_loop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MODE_SINK	0
 | 
					#define MODE_SINK	0
 | 
				
			||||||
#define MODE_SOURCE	1
 | 
					#define MODE_SOURCE	1
 | 
				
			||||||
| 
						 | 
					@ -415,6 +416,20 @@ static int create_stream(struct impl *impl)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					do_schedule_destroy(struct spa_loop *loop,
 | 
				
			||||||
 | 
						bool async, uint32_t seq, const void *data, size_t size, void *user_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct impl *impl = user_data;
 | 
				
			||||||
 | 
						pw_impl_module_schedule_destroy(impl->module);
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void module_schedule_destroy(struct impl *impl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						pw_loop_invoke(impl->main_loop, do_schedule_destroy, 1, NULL, 0, false, impl);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void context_state_cb(pa_context *c, void *userdata)
 | 
					static void context_state_cb(pa_context *c, void *userdata)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl *impl = userdata;
 | 
						struct impl *impl = userdata;
 | 
				
			||||||
| 
						 | 
					@ -436,7 +451,7 @@ static void context_state_cb(pa_context *c, void *userdata)
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (do_destroy)
 | 
						if (do_destroy)
 | 
				
			||||||
		pw_impl_module_schedule_destroy(impl->module);
 | 
							module_schedule_destroy(impl);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void stream_state_cb(pa_stream *s, void * userdata)
 | 
					static void stream_state_cb(pa_stream *s, void * userdata)
 | 
				
			||||||
| 
						 | 
					@ -458,7 +473,7 @@ static void stream_state_cb(pa_stream *s, void * userdata)
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (do_destroy)
 | 
						if (do_destroy)
 | 
				
			||||||
		pw_impl_module_schedule_destroy(impl->module);
 | 
							module_schedule_destroy(impl);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void stream_read_request_cb(pa_stream *s, size_t length, void *userdata)
 | 
					static void stream_read_request_cb(pa_stream *s, size_t length, void *userdata)
 | 
				
			||||||
| 
						 | 
					@ -958,6 +973,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	impl->module = module;
 | 
						impl->module = module;
 | 
				
			||||||
	impl->context = context;
 | 
						impl->context = context;
 | 
				
			||||||
 | 
						impl->main_loop = pw_context_get_main_loop(context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_ringbuffer_init(&impl->ring);
 | 
						spa_ringbuffer_init(&impl->ring);
 | 
				
			||||||
	impl->buffer = calloc(1, RINGBUFFER_SIZE);
 | 
						impl->buffer = calloc(1, RINGBUFFER_SIZE);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue