qdev: remove print/parse methods from LostTickPolicy properties

Also generalize the code so that we can have more enum properties
in the future.

Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2012-02-02 22:09:44 +01:00
parent acbac4a1dc
commit 1ce0512557
3 changed files with 34 additions and 32 deletions

View File

@ -893,50 +893,50 @@ PropertyInfo qdev_prop_macaddr = {
/* --- lost tick policy --- */ /* --- lost tick policy --- */
static const struct { static const char *lost_tick_policy_table[LOST_TICK_MAX+1] = {
const char *name; [LOST_TICK_DISCARD] = "discard",
LostTickPolicy code; [LOST_TICK_DELAY] = "delay",
} lost_tick_policy_table[] = { [LOST_TICK_MERGE] = "merge",
{ .name = "discard", .code = LOST_TICK_DISCARD }, [LOST_TICK_SLEW] = "slew",
{ .name = "delay", .code = LOST_TICK_DELAY }, [LOST_TICK_MAX] = NULL,
{ .name = "merge", .code = LOST_TICK_MERGE },
{ .name = "slew", .code = LOST_TICK_SLEW },
}; };
static int parse_lost_tick_policy(DeviceState *dev, Property *prop, QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));
const char *str)
static void get_enum(Object *obj, Visitor *v, void *opaque,
const char *name, Error **errp)
{ {
LostTickPolicy *ptr = qdev_get_prop_ptr(dev, prop); DeviceState *dev = DEVICE(obj);
int i; Property *prop = opaque;
int *ptr = qdev_get_prop_ptr(dev, prop);
for (i = 0; i < ARRAY_SIZE(lost_tick_policy_table); i++) { visit_type_enum(v, ptr, prop->info->enum_table,
if (!strcasecmp(str, lost_tick_policy_table[i].name)) { prop->info->name, prop->name, errp);
*ptr = lost_tick_policy_table[i].code;
break;
}
}
if (i == ARRAY_SIZE(lost_tick_policy_table)) {
return -EINVAL;
}
return 0;
} }
static int print_lost_tick_policy(DeviceState *dev, Property *prop, char *dest, static void set_enum(Object *obj, Visitor *v, void *opaque,
size_t len) const char *name, Error **errp)
{ {
LostTickPolicy *ptr = qdev_get_prop_ptr(dev, prop); DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
int *ptr = qdev_get_prop_ptr(dev, prop);
return snprintf(dest, len, "%s", lost_tick_policy_table[*ptr].name); if (dev->state != DEV_STATE_CREATED) {
error_set(errp, QERR_PERMISSION_DENIED);
return;
}
visit_type_enum(v, ptr, prop->info->enum_table,
prop->info->name, prop->name, errp);
} }
PropertyInfo qdev_prop_losttickpolicy = { PropertyInfo qdev_prop_losttickpolicy = {
.name = "lost_tick_policy", .name = "LostTickPolicy",
.type = PROP_TYPE_LOSTTICKPOLICY, .type = PROP_TYPE_LOSTTICKPOLICY,
.size = sizeof(LostTickPolicy), .size = sizeof(LostTickPolicy),
.parse = parse_lost_tick_policy, .enum_table = lost_tick_policy_table,
.print = print_lost_tick_policy, .get = get_enum,
.get = get_generic, .set = set_enum,
.set = set_generic,
}; };
/* --- pci address --- */ /* --- pci address --- */

View File

@ -140,6 +140,7 @@ struct PropertyInfo {
const char *legacy_name; const char *legacy_name;
size_t size; size_t size;
enum PropertyType type; enum PropertyType type;
const char **enum_table;
int64_t min; int64_t min;
int64_t max; int64_t max;
int (*parse)(DeviceState *dev, Property *prop, const char *str); int (*parse)(DeviceState *dev, Property *prop, const char *str);

View File

@ -255,6 +255,7 @@ typedef enum LostTickPolicy {
LOST_TICK_DELAY, LOST_TICK_DELAY,
LOST_TICK_MERGE, LOST_TICK_MERGE,
LOST_TICK_SLEW, LOST_TICK_SLEW,
LOST_TICK_MAX
} LostTickPolicy; } LostTickPolicy;
void tcg_exec_init(unsigned long tb_size); void tcg_exec_init(unsigned long tb_size);