Error reporting patches for 2025-09-30
-----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEENUvIs9frKmtoZ05fOHC0AOuRhlMFAmjczNQSHGFybWJydUBy ZWRoYXQuY29tAAoJEDhwtADrkYZTX3kP/1doayteIqVfNLYJn8EDIU6ccZgAsdVw GLHkxSikaBBzjJoG2ebadGusmX8F5H16/KG4vpilP1WHuIw73QRiCFJduFmfFjU/ SCagaj58PPZaiNJeydN8dSHIDyLLAbIpI1xqdFObBgVKl37E7nZ2uatjKwopmK69 iV7y39Xcs6wu4gVsz5IH3FC+CdzctWfjjkZbkk3PeNj+Nt7q22RvbB0Rf30P9SBo FWnh3UEDz2VIlnuIFSAAXQfJ0+h2l9L0yZ05RnVyMM8rZ72v393X8h/jgEo0ETHI eNnJHh/pKL6I+vq10aM/mMgj5fRsly+CsAmjC+11ULg7ybDUMbEU32Ftqeylo2HS ZkGw20egEgzMldC5yELTgTjMPCGF9VWWwNNH9OWM58w9ZCyjDb9wDw1uaHU3Tc15 TZaBwcCGEc/atRFHfWD66oK/KcDrFnWETr6qi9fPJ2SJxiHjHbJe/eNQaxxrEZCu 1OntcQdL46Ef1LeQGzhgLNlKyAxq9V9ybh8gPD4yhCK5NCNub2NvWj/CLlnxGJwH JHZRRXvVoBPlIMSMydGPV8RHkfUr4NMgHql5Y+VykheEBcg+ThZ2JSjS7avwzCHM 5dSUeV+YcvhQN2sojH4xdnUUJWxAAEM1SirkaHTHWZoDKagfjHu3SEYwNyIIchhi BAfRdd94Lxpg =tlEf -----END PGP SIGNATURE----- Merge tag 'pull-error-2025-09-30-v2' of https://repo.or.cz/qemu/armbru into staging Error reporting patches for 2025-09-30 # -----BEGIN PGP SIGNATURE----- # # iQJGBAABCAAwFiEENUvIs9frKmtoZ05fOHC0AOuRhlMFAmjczNQSHGFybWJydUBy # ZWRoYXQuY29tAAoJEDhwtADrkYZTX3kP/1doayteIqVfNLYJn8EDIU6ccZgAsdVw # GLHkxSikaBBzjJoG2ebadGusmX8F5H16/KG4vpilP1WHuIw73QRiCFJduFmfFjU/ # SCagaj58PPZaiNJeydN8dSHIDyLLAbIpI1xqdFObBgVKl37E7nZ2uatjKwopmK69 # iV7y39Xcs6wu4gVsz5IH3FC+CdzctWfjjkZbkk3PeNj+Nt7q22RvbB0Rf30P9SBo # FWnh3UEDz2VIlnuIFSAAXQfJ0+h2l9L0yZ05RnVyMM8rZ72v393X8h/jgEo0ETHI # eNnJHh/pKL6I+vq10aM/mMgj5fRsly+CsAmjC+11ULg7ybDUMbEU32Ftqeylo2HS # ZkGw20egEgzMldC5yELTgTjMPCGF9VWWwNNH9OWM58w9ZCyjDb9wDw1uaHU3Tc15 # TZaBwcCGEc/atRFHfWD66oK/KcDrFnWETr6qi9fPJ2SJxiHjHbJe/eNQaxxrEZCu # 1OntcQdL46Ef1LeQGzhgLNlKyAxq9V9ybh8gPD4yhCK5NCNub2NvWj/CLlnxGJwH # JHZRRXvVoBPlIMSMydGPV8RHkfUr4NMgHql5Y+VykheEBcg+ThZ2JSjS7avwzCHM # 5dSUeV+YcvhQN2sojH4xdnUUJWxAAEM1SirkaHTHWZoDKagfjHu3SEYwNyIIchhi # BAfRdd94Lxpg # =tlEf # -----END PGP SIGNATURE----- # gpg: Signature made Tue 30 Sep 2025 11:40:20 PM PDT # gpg: using RSA key 354BC8B3D7EB2A6B68674E5F3870B400EB918653 # gpg: issuer "armbru@redhat.com" # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" [unknown] # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" [unknown] # gpg: WARNING: The key's User ID is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867 4E5F 3870 B400 EB91 8653 * tag 'pull-error-2025-09-30-v2' of https://repo.or.cz/qemu/armbru: error: Kill @error_warn ivshmem-flat: Mark an instance of missing error handling FIXME ui/dbus: Consistent handling of texture mutex failure ui/dbus: Clean up dbus_update_gl_cb() error checking ui/pixman: Consistent error handling in qemu_pixman_shareable_free() util/oslib-win32: Do not treat null @errp as &error_warn ui/spice-core: Clean up error reporting net/slirp: Clean up error reporting hw/remote/vfio-user: Clean up error reporting migration/cpr: Clean up error reporting in cpr_resave_fd() hw/cxl: Convert cxl_fmws_link() to Error tcg: Fix error reporting on mprotect() failure in tcg_region_init() monitor: Clean up HMP gdbserver error reporting Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
f665537f15
22 changed files with 112 additions and 76 deletions
|
|
@ -72,6 +72,7 @@ static void cxl_fixed_memory_window_config(CXLFixedMemoryWindowOptions *object,
|
|||
|
||||
static int cxl_fmws_link(Object *obj, void *opaque)
|
||||
{
|
||||
Error **errp = opaque;
|
||||
struct CXLFixedWindow *fw;
|
||||
int i;
|
||||
|
||||
|
|
@ -87,9 +88,9 @@ static int cxl_fmws_link(Object *obj, void *opaque)
|
|||
o = object_resolve_path_type(fw->targets[i], TYPE_PXB_CXL_DEV,
|
||||
&ambig);
|
||||
if (!o) {
|
||||
error_setg(&error_fatal, "Could not resolve CXLFM target %s",
|
||||
error_setg(errp, "Could not resolve CXLFM target %s",
|
||||
fw->targets[i]);
|
||||
return 1;
|
||||
return -1;
|
||||
}
|
||||
fw->target_hbs[i] = PXB_CXL_DEV(o);
|
||||
}
|
||||
|
|
@ -99,7 +100,7 @@ static int cxl_fmws_link(Object *obj, void *opaque)
|
|||
void cxl_fmws_link_targets(Error **errp)
|
||||
{
|
||||
/* Order doesn't matter for this, so no need to build list */
|
||||
object_child_foreach_recursive(object_get_root(), cxl_fmws_link, NULL);
|
||||
object_child_foreach_recursive(object_get_root(), cxl_fmws_link, errp);
|
||||
}
|
||||
|
||||
static bool cxl_hdm_find_target(uint32_t *cache_mem, hwaddr addr,
|
||||
|
|
|
|||
|
|
@ -242,6 +242,7 @@ static uint32_t calc_image_hostmem(pixman_format_code_t pformat,
|
|||
static void virtio_gpu_resource_create_2d(VirtIOGPU *g,
|
||||
struct virtio_gpu_ctrl_command *cmd)
|
||||
{
|
||||
Error *err = NULL;
|
||||
pixman_format_code_t pformat;
|
||||
struct virtio_gpu_simple_resource *res;
|
||||
struct virtio_gpu_resource_create_2d c2d;
|
||||
|
|
@ -293,7 +294,8 @@ static void virtio_gpu_resource_create_2d(VirtIOGPU *g,
|
|||
c2d.width,
|
||||
c2d.height,
|
||||
c2d.height ? res->hostmem / c2d.height : 0,
|
||||
&error_warn)) {
|
||||
&err)) {
|
||||
warn_report_err(err);
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
|
@ -1282,6 +1284,7 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
|
|||
const VMStateField *field)
|
||||
{
|
||||
VirtIOGPU *g = opaque;
|
||||
Error *err = NULL;
|
||||
struct virtio_gpu_simple_resource *res;
|
||||
uint32_t resource_id, pformat;
|
||||
int i;
|
||||
|
|
@ -1317,7 +1320,8 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
|
|||
res->width,
|
||||
res->height,
|
||||
res->height ? res->hostmem / res->height : 0,
|
||||
&error_warn)) {
|
||||
&err)) {
|
||||
warn_report_err(err);
|
||||
g_free(res);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -138,6 +138,8 @@ static void ivshmem_flat_remove_peer(IvshmemFTState *s, uint16_t peer_id)
|
|||
static void ivshmem_flat_add_vector(IvshmemFTState *s, IvshmemPeer *peer,
|
||||
int vector_fd)
|
||||
{
|
||||
Error *err = NULL;
|
||||
|
||||
if (peer->vector_counter >= IVSHMEM_MAX_VECTOR_NUM) {
|
||||
trace_ivshmem_flat_add_vector_failure(peer->vector_counter,
|
||||
vector_fd, peer->id);
|
||||
|
|
@ -154,8 +156,10 @@ static void ivshmem_flat_add_vector(IvshmemFTState *s, IvshmemPeer *peer,
|
|||
* peer.
|
||||
*/
|
||||
peer->vector[peer->vector_counter].id = peer->vector_counter;
|
||||
/* WARNING: qemu_socket_set_nonblock() return code ignored */
|
||||
qemu_set_blocking(vector_fd, false, &error_warn);
|
||||
if (!qemu_set_blocking(vector_fd, false, &err)) {
|
||||
/* FIXME handle the error */
|
||||
warn_report_err(err);
|
||||
}
|
||||
event_notifier_init_fd(&peer->vector[peer->vector_counter].event_notifier,
|
||||
vector_fd);
|
||||
|
||||
|
|
|
|||
|
|
@ -1289,6 +1289,8 @@ exit:
|
|||
|
||||
static bool virtio_net_load_ebpf(VirtIONet *n, Error **errp)
|
||||
{
|
||||
Error *err = NULL;
|
||||
|
||||
if (!virtio_net_attach_ebpf_to_backend(n->nic, -1)) {
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1306,7 +1308,11 @@ static bool virtio_net_load_ebpf(VirtIONet *n, Error **errp)
|
|||
return virtio_net_load_ebpf_fds(n, errp);
|
||||
}
|
||||
|
||||
ebpf_rss_load(&n->ebpf_rss, &error_warn);
|
||||
ebpf_rss_load(&n->ebpf_rss, &err);
|
||||
/* Beware, ebpf_rss_load() can return false with @err unset */
|
||||
if (err) {
|
||||
warn_report_err(err);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -75,12 +75,17 @@ OBJECT_DECLARE_TYPE(VfuObject, VfuObjectClass, VFU_OBJECT)
|
|||
*/
|
||||
#define VFU_OBJECT_ERROR(o, fmt, ...) \
|
||||
{ \
|
||||
error_report((fmt), ## __VA_ARGS__); \
|
||||
if (vfu_object_auto_shutdown()) { \
|
||||
error_setg(&error_abort, (fmt), ## __VA_ARGS__); \
|
||||
} else { \
|
||||
error_report((fmt), ## __VA_ARGS__); \
|
||||
/* \
|
||||
* FIXME This looks inappropriate. The error is serious \
|
||||
* enough programming error to warrant aborting the process \
|
||||
* when auto-shutdown is enabled, yet harmless enough to \
|
||||
* permit carrying on when it's disabled. Makes no sense. \
|
||||
*/ \
|
||||
abort(); \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
struct VfuObjectClass {
|
||||
ObjectClass parent_class;
|
||||
|
|
|
|||
|
|
@ -55,9 +55,6 @@ void gdb_unregister_coprocessor_all(CPUState *cpu);
|
|||
* system emulation you can use a full chardev spec for your gdbserver
|
||||
* port.
|
||||
*
|
||||
* The error handle should be either &error_fatal (for start-up) or
|
||||
* &error_warn (for QMP/HMP initiated sessions).
|
||||
*
|
||||
* Returns true when server successfully started.
|
||||
*/
|
||||
bool gdbserver_start(const char *port_or_device, Error **errp);
|
||||
|
|
|
|||
|
|
@ -533,12 +533,6 @@ static inline void error_propagator_cleanup(ErrorPropagator *prop)
|
|||
|
||||
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(ErrorPropagator, error_propagator_cleanup);
|
||||
|
||||
/*
|
||||
* Special error destination to warn on error.
|
||||
* See error_setg() and error_propagate() for details.
|
||||
*/
|
||||
extern Error *error_warn;
|
||||
|
||||
/*
|
||||
* Special error destination to abort on error.
|
||||
* See error_setg() and error_propagate() for details.
|
||||
|
|
|
|||
|
|
@ -168,11 +168,14 @@ static inline void qemu_funlockfile(FILE *f)
|
|||
#endif
|
||||
}
|
||||
|
||||
/* Helper for WSAEventSelect, to report errors */
|
||||
/* Helpers for WSAEventSelect() */
|
||||
bool qemu_socket_select(int sockfd, WSAEVENT hEventObject,
|
||||
long lNetworkEvents, Error **errp);
|
||||
void qemu_socket_select_nofail(int sockfd, WSAEVENT hEventObject,
|
||||
long lNetworkEvents);
|
||||
|
||||
bool qemu_socket_unselect(int sockfd, Error **errp);
|
||||
void qemu_socket_unselect_nofail(int sockfd);
|
||||
|
||||
/* We wrap all the sockets functions so that we can set errno based on
|
||||
* WSAGetLastError(), and use file-descriptors instead of SOCKET.
|
||||
|
|
|
|||
|
|
@ -454,7 +454,7 @@ static void qio_channel_socket_finalize(Object *obj)
|
|||
}
|
||||
}
|
||||
#ifdef WIN32
|
||||
qemu_socket_unselect(ioc->fd, NULL);
|
||||
qemu_socket_unselect_nofail(ioc->fd);
|
||||
#endif
|
||||
close(ioc->fd);
|
||||
ioc->fd = -1;
|
||||
|
|
@ -929,7 +929,7 @@ qio_channel_socket_close(QIOChannel *ioc,
|
|||
|
||||
if (sioc->fd != -1) {
|
||||
#ifdef WIN32
|
||||
qemu_socket_unselect(sioc->fd, NULL);
|
||||
qemu_socket_unselect_nofail(sioc->fd);
|
||||
#endif
|
||||
if (qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_LISTEN)) {
|
||||
socket_listen_cleanup(sioc->fd, errp);
|
||||
|
|
|
|||
|
|
@ -281,9 +281,9 @@ GSource *qio_channel_create_socket_watch(QIOChannel *ioc,
|
|||
GSource *source;
|
||||
QIOChannelSocketSource *ssource;
|
||||
|
||||
qemu_socket_select(sockfd, ioc->event,
|
||||
FD_READ | FD_ACCEPT | FD_CLOSE |
|
||||
FD_CONNECT | FD_WRITE | FD_OOB, NULL);
|
||||
qemu_socket_select_nofail(sockfd, ioc->event,
|
||||
FD_READ | FD_ACCEPT | FD_CLOSE |
|
||||
FD_CONNECT | FD_WRITE | FD_OOB);
|
||||
|
||||
source = g_source_new(&qio_channel_socket_source_funcs,
|
||||
sizeof(QIOChannelSocketSource));
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "hw/vfio/vfio-device.h"
|
||||
#include "migration/cpr.h"
|
||||
#include "migration/misc.h"
|
||||
|
|
@ -100,10 +101,10 @@ void cpr_resave_fd(const char *name, int id, int fd)
|
|||
if (old_fd < 0) {
|
||||
cpr_save_fd(name, id, fd);
|
||||
} else if (old_fd != fd) {
|
||||
error_setg(&error_fatal,
|
||||
"internal error: cpr fd '%s' id %d value %d "
|
||||
"already saved with a different value %d",
|
||||
name, id, fd, old_fd);
|
||||
error_report("internal error: cpr fd '%s' id %d value %d "
|
||||
"already saved with a different value %d",
|
||||
name, id, fd, old_fd);
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -280,14 +280,15 @@ void hmp_log(Monitor *mon, const QDict *qdict)
|
|||
|
||||
void hmp_gdbserver(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
Error *err = NULL;
|
||||
const char *device = qdict_get_try_str(qdict, "device");
|
||||
|
||||
if (!device) {
|
||||
device = "tcp::" DEFAULT_GDBSTUB_PORT;
|
||||
}
|
||||
|
||||
if (!gdbserver_start(device, &error_warn)) {
|
||||
monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
|
||||
device);
|
||||
if (!gdbserver_start(device, &err)) {
|
||||
error_report_err(err);
|
||||
} else if (strcmp(device, "none") == 0) {
|
||||
monitor_printf(mon, "Disabled gdbserver\n");
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -258,11 +258,13 @@ static void net_slirp_register_poll_sock(slirp_os_socket fd, void *opaque)
|
|||
{
|
||||
#ifdef WIN32
|
||||
AioContext *ctxt = qemu_get_aio_context();
|
||||
g_autofree char *msg = NULL;
|
||||
|
||||
if (WSAEventSelect(fd, event_notifier_get_handle(&ctxt->notifier),
|
||||
FD_READ | FD_ACCEPT | FD_CLOSE |
|
||||
FD_CONNECT | FD_WRITE | FD_OOB) != 0) {
|
||||
error_setg_win32(&error_warn, WSAGetLastError(), "failed to WSAEventSelect()");
|
||||
msg = g_win32_error_message(WSAGetLastError());
|
||||
warn_report("failed to WSAEventSelect(): %s", msg);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
@ -270,8 +272,11 @@ static void net_slirp_register_poll_sock(slirp_os_socket fd, void *opaque)
|
|||
static void net_slirp_unregister_poll_sock(slirp_os_socket fd, void *opaque)
|
||||
{
|
||||
#ifdef WIN32
|
||||
g_autofree char *msg = NULL;
|
||||
|
||||
if (WSAEventSelect(fd, NULL, 0) != 0) {
|
||||
error_setg_win32(&error_warn, WSAGetLastError(), "failed to WSAEventSelect()");
|
||||
msg = g_win32_error_message(WSAGetLastError());
|
||||
warn_report("failed to WSAEventSelect(): %s", msg);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -832,13 +832,16 @@ void tcg_region_init(size_t tb_size, int splitwx, unsigned max_threads)
|
|||
} else {
|
||||
#ifdef CONFIG_POSIX
|
||||
rc = mprotect(start, end - start, need_prot);
|
||||
if (rc) {
|
||||
error_report("mprotect of jit buffer: %s",
|
||||
strerror(errno));
|
||||
}
|
||||
#else
|
||||
g_assert_not_reached();
|
||||
#endif
|
||||
}
|
||||
if (rc) {
|
||||
error_setg_errno(&error_fatal, errno,
|
||||
"mprotect of jit buffer");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
if (have_prot != 0) {
|
||||
|
|
|
|||
|
|
@ -104,22 +104,6 @@ test_error_report_timestamp(void)
|
|||
");
|
||||
}
|
||||
|
||||
static void
|
||||
test_error_warn(void)
|
||||
{
|
||||
if (g_test_subprocess()) {
|
||||
error_setg(&error_warn, "Testing &error_warn");
|
||||
return;
|
||||
}
|
||||
|
||||
g_test_trap_subprocess(NULL, 0, 0);
|
||||
g_test_trap_assert_passed();
|
||||
g_test_trap_assert_stderr("\
|
||||
test-error-report: warning: Testing &error_warn*\
|
||||
");
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
|
|
@ -133,7 +117,6 @@ main(int argc, char *argv[])
|
|||
g_test_add_func("/error-report/glog", test_error_report_glog);
|
||||
g_test_add_func("/error-report/once", test_error_report_once);
|
||||
g_test_add_func("/error-report/timestamp", test_error_report_timestamp);
|
||||
g_test_add_func("/error-report/warn", test_error_warn);
|
||||
|
||||
return g_test_run();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -214,25 +214,33 @@ static void dbus_update_gl_cb(GObject *source_object,
|
|||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_autoptr(GError) err = NULL;
|
||||
g_autoptr(GError) gerr = NULL;
|
||||
#ifdef WIN32
|
||||
Error *err = NULL;
|
||||
#endif
|
||||
DBusDisplayListener *ddl = user_data;
|
||||
bool success;
|
||||
|
||||
#ifdef CONFIG_GBM
|
||||
success = qemu_dbus_display1_listener_call_update_dmabuf_finish(
|
||||
ddl->proxy, res, &err);
|
||||
ddl->proxy, res, &gerr);
|
||||
if (!success) {
|
||||
error_report("Failed to call update: %s", gerr->message);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
success = qemu_dbus_display1_listener_win32_d3d11_call_update_texture2d_finish(
|
||||
ddl->d3d11_proxy, res, &err);
|
||||
d3d_texture2d_acquire0(ddl->d3d_texture, &error_warn);
|
||||
#endif
|
||||
|
||||
ddl->d3d11_proxy, res, &gerr);
|
||||
if (!success) {
|
||||
error_report("Failed to call update: %s", err->message);
|
||||
error_report("Failed to call update: %s", gerr->message);
|
||||
}
|
||||
|
||||
if (!d3d_texture2d_acquire0(ddl->d3d_texture, &err)) {
|
||||
error_report_err(err);
|
||||
}
|
||||
#endif
|
||||
|
||||
graphic_hw_gl_block(ddl->dcl.con, false);
|
||||
g_object_unref(ddl);
|
||||
}
|
||||
|
|
|
|||
6
ui/gtk.c
6
ui/gtk.c
|
|
@ -1181,6 +1181,7 @@ static gboolean gd_touch_event(GtkWidget *widget, GdkEventTouch *touch,
|
|||
void *opaque)
|
||||
{
|
||||
VirtualConsole *vc = opaque;
|
||||
Error *err = NULL;
|
||||
uint64_t num_slot = GPOINTER_TO_UINT(touch->sequence);
|
||||
int type = -1;
|
||||
|
||||
|
|
@ -1203,7 +1204,10 @@ static gboolean gd_touch_event(GtkWidget *widget, GdkEventTouch *touch,
|
|||
console_handle_touch_event(vc->gfx.dcl.con, touch_slots,
|
||||
num_slot, surface_width(vc->gfx.ds),
|
||||
surface_height(vc->gfx.ds), touch->x,
|
||||
touch->y, type, &error_warn);
|
||||
touch->y, type, &err);
|
||||
if (err) {
|
||||
warn_report_err(err);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -288,7 +288,10 @@ qemu_pixman_shareable_free(qemu_pixman_shareable handle,
|
|||
void *ptr, size_t size)
|
||||
{
|
||||
#ifdef WIN32
|
||||
qemu_win32_map_free(ptr, handle, &error_warn);
|
||||
Error *err = NULL;
|
||||
|
||||
qemu_win32_map_free(ptr, handle, &err);
|
||||
error_report_err(err);
|
||||
#else
|
||||
qemu_memfd_free(ptr, size, handle);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -126,11 +126,13 @@ static void watch_update_mask(SpiceWatch *watch, int event_mask)
|
|||
static SpiceWatch *watch_add(int fd, int event_mask, SpiceWatchFunc func, void *opaque)
|
||||
{
|
||||
SpiceWatch *watch;
|
||||
|
||||
#ifdef WIN32
|
||||
g_autofree char *msg = NULL;
|
||||
|
||||
fd = _open_osfhandle(fd, _O_BINARY);
|
||||
if (fd < 0) {
|
||||
error_setg_win32(&error_warn, WSAGetLastError(), "Couldn't associate a FD with the SOCKET");
|
||||
msg = g_win32_error_message(WSAGetLastError());
|
||||
warn_report("Couldn't associate a FD with the SOCKET: %s", msg);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ void aio_set_fd_handler(AioContext *ctx,
|
|||
|
||||
QLIST_INSERT_HEAD_RCU(&ctx->aio_handlers, node, node);
|
||||
event = event_notifier_get_handle(&ctx->notifier);
|
||||
qemu_socket_select(fd, event, bitmask, NULL);
|
||||
qemu_socket_select_nofail(fd, event, bitmask);
|
||||
}
|
||||
if (old_node) {
|
||||
aio_remove_fd_handler(ctx, old_node);
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
Error *error_abort;
|
||||
Error *error_fatal;
|
||||
Error *error_warn;
|
||||
|
||||
static void error_handle(Error **errp, Error *err)
|
||||
{
|
||||
|
|
@ -41,9 +40,7 @@ static void error_handle(Error **errp, Error *err)
|
|||
error_report_err(err);
|
||||
exit(1);
|
||||
}
|
||||
if (errp == &error_warn) {
|
||||
warn_report_err(err);
|
||||
} else if (errp && !*errp) {
|
||||
if (errp && !*errp) {
|
||||
*errp = err;
|
||||
} else {
|
||||
error_free(err);
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ bool qemu_set_blocking(int fd, bool block, Error **errp)
|
|||
unsigned long opt = block ? 0 : 1;
|
||||
|
||||
if (block) {
|
||||
qemu_socket_unselect(fd, NULL);
|
||||
qemu_socket_unselect_nofail(fd);
|
||||
}
|
||||
|
||||
if (ioctlsocket(fd, FIONBIO, &opt) != NO_ERROR) {
|
||||
|
|
@ -293,10 +293,6 @@ bool qemu_socket_select(int sockfd, WSAEVENT hEventObject,
|
|||
{
|
||||
SOCKET s = _get_osfhandle(sockfd);
|
||||
|
||||
if (errp == NULL) {
|
||||
errp = &error_warn;
|
||||
}
|
||||
|
||||
if (s == INVALID_SOCKET) {
|
||||
error_setg(errp, "invalid socket fd=%d", sockfd);
|
||||
return false;
|
||||
|
|
@ -315,6 +311,25 @@ bool qemu_socket_unselect(int sockfd, Error **errp)
|
|||
return qemu_socket_select(sockfd, NULL, 0, errp);
|
||||
}
|
||||
|
||||
void qemu_socket_select_nofail(int sockfd, WSAEVENT hEventObject,
|
||||
long lNetworkEvents)
|
||||
{
|
||||
Error *err = NULL;
|
||||
|
||||
if (!qemu_socket_select(sockfd, hEventObject, lNetworkEvents, &err)) {
|
||||
warn_report_err(err);
|
||||
}
|
||||
}
|
||||
|
||||
void qemu_socket_unselect_nofail(int sockfd)
|
||||
{
|
||||
Error *err = NULL;
|
||||
|
||||
if (!qemu_socket_unselect(sockfd, &err)) {
|
||||
warn_report_err(err);
|
||||
}
|
||||
}
|
||||
|
||||
int qemu_socketpair(int domain, int type, int protocol, int sv[2])
|
||||
{
|
||||
struct sockaddr_un addr = {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue