mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	Return the closure from wl_connection_vmarshal()
And provide a function to write it to a connection.
This commit is contained in:
		
							parent
							
								
									50038e4757
								
							
						
					
					
						commit
						6bce89da78
					
				
					 4 changed files with 35 additions and 13 deletions
				
			
		
							
								
								
									
										16
									
								
								connection.c
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								connection.c
									
										
									
									
									
								
							| 
						 | 
					@ -52,6 +52,7 @@ struct wl_closure {
 | 
				
			||||||
	ffi_cif cif;
 | 
						ffi_cif cif;
 | 
				
			||||||
	void *args[20];
 | 
						void *args[20];
 | 
				
			||||||
	uint32_t buffer[64];
 | 
						uint32_t buffer[64];
 | 
				
			||||||
 | 
						uint32_t *start;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wl_connection {
 | 
					struct wl_connection {
 | 
				
			||||||
| 
						 | 
					@ -357,7 +358,7 @@ wl_message_size_extra(const struct wl_message *message)
 | 
				
			||||||
	return extra;
 | 
						return extra;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					struct wl_closure *
 | 
				
			||||||
wl_connection_vmarshal(struct wl_connection *connection,
 | 
					wl_connection_vmarshal(struct wl_connection *connection,
 | 
				
			||||||
		       struct wl_object *sender,
 | 
							       struct wl_object *sender,
 | 
				
			||||||
		       uint32_t opcode, va_list ap,
 | 
							       uint32_t opcode, va_list ap,
 | 
				
			||||||
| 
						 | 
					@ -466,7 +467,9 @@ wl_connection_vmarshal(struct wl_connection *connection,
 | 
				
			||||||
	size = (p - start) * sizeof *p;
 | 
						size = (p - start) * sizeof *p;
 | 
				
			||||||
	start[0] = sender->id;
 | 
						start[0] = sender->id;
 | 
				
			||||||
	start[1] = opcode | (size << 16);
 | 
						start[1] = opcode | (size << 16);
 | 
				
			||||||
	wl_connection_write(connection, start, size);
 | 
						closure->start = start;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return closure;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wl_closure *
 | 
					struct wl_closure *
 | 
				
			||||||
| 
						 | 
					@ -651,6 +654,15 @@ wl_closure_invoke(struct wl_closure *closure,
 | 
				
			||||||
	ffi_call(&closure->cif, func, &result, closure->args);
 | 
						ffi_call(&closure->cif, func, &result, closure->args);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					wl_closure_send(struct wl_closure *closure, struct wl_connection *connection)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint32_t size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						size = closure->start[1] >> 16;
 | 
				
			||||||
 | 
						wl_connection_write(connection, closure->start, size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
wl_closure_print(struct wl_closure *closure, struct wl_object *target)
 | 
					wl_closure_print(struct wl_closure *closure, struct wl_object *target)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,7 +44,8 @@ void wl_connection_consume(struct wl_connection *connection, size_t size);
 | 
				
			||||||
int wl_connection_data(struct wl_connection *connection, uint32_t mask);
 | 
					int wl_connection_data(struct wl_connection *connection, uint32_t mask);
 | 
				
			||||||
void wl_connection_write(struct wl_connection *connection, const void *data, size_t count);
 | 
					void wl_connection_write(struct wl_connection *connection, const void *data, size_t count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wl_connection_vmarshal(struct wl_connection *connection,
 | 
					struct wl_closure *
 | 
				
			||||||
 | 
					wl_connection_vmarshal(struct wl_connection *connection,
 | 
				
			||||||
		       struct wl_object *sender,
 | 
							       struct wl_object *sender,
 | 
				
			||||||
		       uint32_t opcode, va_list ap,
 | 
							       uint32_t opcode, va_list ap,
 | 
				
			||||||
		       const struct wl_message *message);
 | 
							       const struct wl_message *message);
 | 
				
			||||||
| 
						 | 
					@ -58,6 +59,8 @@ void
 | 
				
			||||||
wl_closure_invoke(struct wl_closure *closure,
 | 
					wl_closure_invoke(struct wl_closure *closure,
 | 
				
			||||||
		  struct wl_object *target, void (*func)(void), void *data);
 | 
							  struct wl_object *target, void (*func)(void), void *data);
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
 | 
					wl_closure_send(struct wl_closure *closure, struct wl_connection *connection);
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
wl_closure_print(struct wl_closure *closure, struct wl_object *target);
 | 
					wl_closure_print(struct wl_closure *closure, struct wl_object *target);
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
wl_closure_destroy(struct wl_closure *closure);
 | 
					wl_closure_destroy(struct wl_closure *closure);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -195,13 +195,17 @@ wl_proxy_add_listener(struct wl_proxy *proxy,
 | 
				
			||||||
WL_EXPORT void
 | 
					WL_EXPORT void
 | 
				
			||||||
wl_proxy_marshal(struct wl_proxy *proxy, uint32_t opcode, ...)
 | 
					wl_proxy_marshal(struct wl_proxy *proxy, uint32_t opcode, ...)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct wl_closure *closure;
 | 
				
			||||||
	va_list ap;
 | 
						va_list ap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	va_start(ap, opcode);
 | 
						va_start(ap, opcode);
 | 
				
			||||||
	wl_connection_vmarshal(proxy->display->connection,
 | 
						closure = wl_connection_vmarshal(proxy->display->connection,
 | 
				
			||||||
					 &proxy->base, opcode, ap,
 | 
										 &proxy->base, opcode, ap,
 | 
				
			||||||
					 &proxy->base.interface->methods[opcode]);
 | 
										 &proxy->base.interface->methods[opcode]);
 | 
				
			||||||
	va_end(ap);
 | 
						va_end(ap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_closure_send(closure, proxy->display->connection);
 | 
				
			||||||
 | 
						wl_closure_destroy(closure);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,6 +79,7 @@ WL_EXPORT void
 | 
				
			||||||
wl_client_post_event(struct wl_client *client, struct wl_object *sender,
 | 
					wl_client_post_event(struct wl_client *client, struct wl_object *sender,
 | 
				
			||||||
		     uint32_t opcode, ...)
 | 
							     uint32_t opcode, ...)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct wl_closure *closure;
 | 
				
			||||||
	va_list ap;
 | 
						va_list ap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (client == NULL)
 | 
						if (client == NULL)
 | 
				
			||||||
| 
						 | 
					@ -86,10 +87,13 @@ wl_client_post_event(struct wl_client *client, struct wl_object *sender,
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	va_start(ap, opcode);
 | 
						va_start(ap, opcode);
 | 
				
			||||||
	wl_connection_vmarshal(client->connection,
 | 
						closure = wl_connection_vmarshal(client->connection,
 | 
				
			||||||
					 sender, opcode, ap,
 | 
										 sender, opcode, ap,
 | 
				
			||||||
					 &sender->interface->events[opcode]);
 | 
										 &sender->interface->events[opcode]);
 | 
				
			||||||
	va_end(ap);
 | 
						va_end(ap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_closure_send(closure, client->connection);
 | 
				
			||||||
 | 
						wl_closure_destroy(closure);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
| 
						 | 
					@ -163,7 +167,6 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
 | 
				
			||||||
				  object->implementation[opcode], client);
 | 
									  object->implementation[opcode], client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		wl_closure_destroy(closure);
 | 
							wl_closure_destroy(closure);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue