mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 01:03:55 -06:00
qemu-char: make writes thread-safe
This will let threads other than the I/O thread raise QMP events. GIOChannel is thread-safe, and send and receive state is usually well-separated. The only driver that requires some care is the pty driver, where some of the state is shared by the read and write sides. That state is protected with the chr_write_lock too. Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
1bb7fe725c
commit
9005b2a758
2 changed files with 53 additions and 16 deletions
|
@ -54,6 +54,7 @@ typedef struct {
|
|||
typedef void IOEventHandler(void *opaque, int event);
|
||||
|
||||
struct CharDriverState {
|
||||
QemuMutex chr_write_lock;
|
||||
void (*init)(struct CharDriverState *s);
|
||||
int (*chr_write)(struct CharDriverState *s, const uint8_t *buf, int len);
|
||||
int (*chr_sync_read)(struct CharDriverState *s,
|
||||
|
@ -164,6 +165,7 @@ void qemu_chr_fe_event(CharDriverState *s, int event);
|
|||
* @qemu_chr_fe_printf:
|
||||
*
|
||||
* Write to a character backend using a printf style interface.
|
||||
* This function is thread-safe.
|
||||
*
|
||||
* @fmt see #printf
|
||||
*/
|
||||
|
@ -176,8 +178,9 @@ int qemu_chr_fe_add_watch(CharDriverState *s, GIOCondition cond,
|
|||
/**
|
||||
* @qemu_chr_fe_write:
|
||||
*
|
||||
* Write data to a character backend from the front end. This function will
|
||||
* send data from the front end to the back end.
|
||||
* Write data to a character backend from the front end. This function
|
||||
* will send data from the front end to the back end. This function
|
||||
* is thread-safe.
|
||||
*
|
||||
* @buf the data
|
||||
* @len the number of bytes to send
|
||||
|
@ -192,7 +195,7 @@ int qemu_chr_fe_write(CharDriverState *s, const uint8_t *buf, int len);
|
|||
* Write data to a character backend from the front end. This function will
|
||||
* send data from the front end to the back end. Unlike @qemu_chr_fe_write,
|
||||
* this function will block if the back end cannot consume all of the data
|
||||
* attempted to be written.
|
||||
* attempted to be written. This function is thread-safe.
|
||||
*
|
||||
* @buf the data
|
||||
* @len the number of bytes to send
|
||||
|
@ -216,7 +219,7 @@ int qemu_chr_fe_read_all(CharDriverState *s, uint8_t *buf, int len);
|
|||
/**
|
||||
* @qemu_chr_fe_ioctl:
|
||||
*
|
||||
* Issue a device specific ioctl to a backend.
|
||||
* Issue a device specific ioctl to a backend. This function is thread-safe.
|
||||
*
|
||||
* @cmd see CHR_IOCTL_*
|
||||
* @arg the data associated with @cmd
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue