Commit 1ee73216 authored by Richard Henderson's avatar Richard Henderson
Browse files

log: Add locking to large logging blocks



Reuse the existing locking provided by stdio to keep in_asm, cpu,
op, op_opt, op_ind, and out_asm as contiguous blocks.

While it isn't possible to interleave e.g. in_asm or op_opt logs
because of the TB lock protecting all code generation, it is
possible to interleave cpu logs, or to interleave a cpu dump with
an out_asm dump.

For mingw32, we appear to have no viable solution for this.  The locking
functions are not properly exported from the system runtime library.

Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarRichard Henderson <rth@twiddle.net>
parent 9acbf7d8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -150,11 +150,13 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, TranslationBlock *itb)
#if defined(DEBUG_DISAS)
    if (qemu_loglevel_mask(CPU_LOG_TB_CPU)
        && qemu_log_in_addr_range(itb->pc)) {
        qemu_log_lock();
#if defined(TARGET_I386)
        log_cpu_state(cpu, CPU_DUMP_CCOP);
#else
        log_cpu_state(cpu, 0);
#endif
        qemu_log_unlock();
    }
#endif /* DEBUG_DISAS */

+2 −0
Original line number Diff line number Diff line
@@ -911,11 +911,13 @@ void cpu_abort(CPUState *cpu, const char *fmt, ...)
    fprintf(stderr, "\n");
    cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU | CPU_DUMP_CCOP);
    if (qemu_log_separate()) {
        qemu_log_lock();
        qemu_log("qemu: fatal: ");
        qemu_log_vprintf(fmt, ap2);
        qemu_log("\n");
        log_cpu_state(cpu, CPU_DUMP_FPU | CPU_DUMP_CCOP);
        qemu_log_flush();
        qemu_log_unlock();
        qemu_log_close();
    }
    va_end(ap2);
+16 −0
Original line number Diff line number Diff line
@@ -51,6 +51,22 @@ static inline bool qemu_loglevel_mask(int mask)
    return (qemu_loglevel & mask) != 0;
}

/* Lock output for a series of related logs.  Since this is not needed
 * for a single qemu_log / qemu_log_mask / qemu_log_mask_and_addr, we
 * assume that qemu_loglevel_mask has already been tested, and that
 * qemu_loglevel is never set when qemu_logfile is unset.
 */

static inline void qemu_log_lock(void)
{
    qemu_flockfile(qemu_logfile);
}

static inline void qemu_log_unlock(void)
{
    qemu_funlockfile(qemu_logfile);
}

/* Logging functions: */

/* main logging function
+12 −0
Original line number Diff line number Diff line
@@ -87,4 +87,16 @@ void *qemu_alloc_stack(size_t *sz);
 */
void qemu_free_stack(void *stack, size_t sz);

/* POSIX and Mingw32 differ in the name of the stdio lock functions.  */

static inline void qemu_flockfile(FILE *f)
{
    flockfile(f);
}

static inline void qemu_funlockfile(FILE *f)
{
    funlockfile(f);
}

#endif
+15 −0
Original line number Diff line number Diff line
@@ -103,6 +103,21 @@ static inline char *realpath(const char *path, char *resolved_path)
    return resolved_path;
}

/* ??? Mingw appears to export _lock_file and _unlock_file as the functions
 * with which to lock a stdio handle.  But something is wrong in the markup,
 * either in the header or the library, such that we get undefined references
 * to "_imp___lock_file" etc when linking.  Since we seem to have no other
 * alternative, and the usage within the logging functions isn't critical,
 * ignore FILE locking.
 */

static inline void qemu_flockfile(FILE *f)
{
}

static inline void qemu_funlockfile(FILE *f)
{
}

/* We wrap all the sockets functions so that we can
 * set errno based on WSAGetLastError()
Loading