char: introduce generic qemu_chr_get_kind()
This allows to remove the "is_mux" field from CharDriverState. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									acbfbe4a06
								
							
						
					
					
						commit
						ad5c679c7f
					
				| 
						 | 
				
			
			@ -96,7 +96,6 @@ struct CharDriverState {
 | 
			
		|||
    char *filename;
 | 
			
		||||
    int logfd;
 | 
			
		||||
    int be_open;
 | 
			
		||||
    int is_mux;
 | 
			
		||||
    guint fd_in_tag;
 | 
			
		||||
    bool replay;
 | 
			
		||||
    DECLARE_BITMAP(features, QEMU_CHAR_FEATURE_LAST);
 | 
			
		||||
| 
						 | 
				
			
			@ -455,7 +454,19 @@ void qemu_chr_be_generic_open(CharDriverState *s);
 | 
			
		|||
void qemu_chr_fe_accept_input(CharBackend *be);
 | 
			
		||||
int qemu_chr_add_client(CharDriverState *s, int fd);
 | 
			
		||||
CharDriverState *qemu_chr_find(const char *name);
 | 
			
		||||
bool chr_is_ringbuf(const CharDriverState *chr);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @qemu_chr_get_kind:
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the kind of char backend, or -1 if unspecified.
 | 
			
		||||
 */
 | 
			
		||||
ChardevBackendKind qemu_chr_get_kind(const CharDriverState *chr);
 | 
			
		||||
 | 
			
		||||
static inline bool qemu_chr_is_ringbuf(const CharDriverState *chr)
 | 
			
		||||
{
 | 
			
		||||
    return qemu_chr_get_kind(chr) == CHARDEV_BACKEND_KIND_RINGBUF ||
 | 
			
		||||
        qemu_chr_get_kind(chr) == CHARDEV_BACKEND_KIND_MEMORY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool qemu_chr_has_feature(CharDriverState *chr,
 | 
			
		||||
                          CharDriverFeature feature);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3196,7 +3196,7 @@ static void ringbuf_completion(ReadLineState *rs, const char *str)
 | 
			
		|||
 | 
			
		||||
        if (!strncmp(chr_info->label, str, len)) {
 | 
			
		||||
            CharDriverState *chr = qemu_chr_find(chr_info->label);
 | 
			
		||||
            if (chr && chr_is_ringbuf(chr)) {
 | 
			
		||||
            if (chr && qemu_chr_is_ringbuf(chr)) {
 | 
			
		||||
                readline_add_completion(rs, chr_info->label);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										21
									
								
								qemu-char.c
								
								
								
								
							
							
						
						
									
										21
									
								
								qemu-char.c
								
								
								
								
							| 
						 | 
				
			
			@ -781,7 +781,7 @@ static void muxes_realize_done(Notifier *notifier, void *unused)
 | 
			
		|||
    CharDriverState *chr;
 | 
			
		||||
 | 
			
		||||
    QTAILQ_FOREACH(chr, &chardevs, next) {
 | 
			
		||||
        if (chr->is_mux) {
 | 
			
		||||
        if (qemu_chr_get_kind(chr) == CHARDEV_BACKEND_KIND_MUX) {
 | 
			
		||||
            MuxDriver *d = chr->opaque;
 | 
			
		||||
            int i;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -888,7 +888,6 @@ static CharDriverState *qemu_chr_open_mux(const CharDriver *driver,
 | 
			
		|||
     * set of muxes
 | 
			
		||||
     */
 | 
			
		||||
    *be_opened = muxes_realized;
 | 
			
		||||
    chr->is_mux = 1;
 | 
			
		||||
    if (!qemu_chr_fe_init(&d->chr, drv, errp)) {
 | 
			
		||||
        qemu_chr_free(chr);
 | 
			
		||||
        return NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -906,7 +905,7 @@ bool qemu_chr_fe_init(CharBackend *b, CharDriverState *s, Error **errp)
 | 
			
		|||
{
 | 
			
		||||
    int tag = 0;
 | 
			
		||||
 | 
			
		||||
    if (s->is_mux) {
 | 
			
		||||
    if (qemu_chr_get_kind(s) == CHARDEV_BACKEND_KIND_MUX) {
 | 
			
		||||
        MuxDriver *d = s->opaque;
 | 
			
		||||
 | 
			
		||||
        if (d->mux_cnt >= MAX_MUX) {
 | 
			
		||||
| 
						 | 
				
			
			@ -933,7 +932,7 @@ unavailable:
 | 
			
		|||
 | 
			
		||||
static bool qemu_chr_is_busy(CharDriverState *s)
 | 
			
		||||
{
 | 
			
		||||
    if (s->is_mux) {
 | 
			
		||||
    if (qemu_chr_get_kind(s) == CHARDEV_BACKEND_KIND_MUX) {
 | 
			
		||||
        MuxDriver *d = s->opaque;
 | 
			
		||||
        return d->mux_cnt >= 0;
 | 
			
		||||
    } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -950,7 +949,7 @@ void qemu_chr_fe_deinit(CharBackend *b)
 | 
			
		|||
        if (b->chr->be == b) {
 | 
			
		||||
            b->chr->be = NULL;
 | 
			
		||||
        }
 | 
			
		||||
        if (b->chr->is_mux) {
 | 
			
		||||
        if (qemu_chr_get_kind(b->chr) == CHARDEV_BACKEND_KIND_MUX) {
 | 
			
		||||
            MuxDriver *d = b->chr->opaque;
 | 
			
		||||
            d->backends[b->tag] = NULL;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -1001,7 +1000,7 @@ void qemu_chr_fe_set_handlers(CharBackend *b,
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (s->is_mux) {
 | 
			
		||||
    if (qemu_chr_get_kind(s) == CHARDEV_BACKEND_KIND_MUX) {
 | 
			
		||||
        mux_chr_set_handlers(s, context);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1012,7 +1011,7 @@ void qemu_chr_fe_take_focus(CharBackend *b)
 | 
			
		|||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (b->chr->is_mux) {
 | 
			
		||||
    if (qemu_chr_get_kind(b->chr) == CHARDEV_BACKEND_KIND_MUX) {
 | 
			
		||||
        mux_set_focus(b->chr, b->tag);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3559,9 +3558,9 @@ fail:
 | 
			
		|||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool chr_is_ringbuf(const CharDriverState *chr)
 | 
			
		||||
ChardevBackendKind qemu_chr_get_kind(const CharDriverState *chr)
 | 
			
		||||
{
 | 
			
		||||
    return chr->driver->chr_write == ringbuf_chr_write;
 | 
			
		||||
    return chr->driver->kind;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qmp_ringbuf_write(const char *device, const char *data,
 | 
			
		||||
| 
						 | 
				
			
			@ -3579,7 +3578,7 @@ void qmp_ringbuf_write(const char *device, const char *data,
 | 
			
		|||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!chr_is_ringbuf(chr)) {
 | 
			
		||||
    if (!qemu_chr_is_ringbuf(chr)) {
 | 
			
		||||
        error_setg(errp,"%s is not a ringbuf device", device);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -3623,7 +3622,7 @@ char *qmp_ringbuf_read(const char *device, int64_t size,
 | 
			
		|||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!chr_is_ringbuf(chr)) {
 | 
			
		||||
    if (!qemu_chr_is_ringbuf(chr)) {
 | 
			
		||||
        error_setg(errp,"%s is not a ringbuf device", device);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue