From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: Luiz Capitulino <lcapitulino@redhat.com>
Cc: mreitz@redhat.com, qemu-devel@nongnu.org, armbru@redhat.com
Subject: Re: [Qemu-devel] [RFC PATCH V2 3/5] qapi script: add event support by qapi-event.py
Date: Tue, 07 Jan 2014 11:24:27 +0800 [thread overview]
Message-ID: <52CB736B.1060901@linux.vnet.ibm.com> (raw)
In-Reply-To: <20140106181700.3215f8ae@redhat.com>
>>> +
>>> +
>>> +# Following are the functions that generate event behavior control functions.
>>> +# Those functions are put here in the qapi-event.c, since it need to include
>>> +# qapi-event.h for the event enum type declaration, put them in other file
>>> +# requiring other file include qapi-event.h, causing a cross including. For
>>> +# example: if we have qmp-event.c and qmp-event.h, then qmp-event.c
>>> +# ->qmp-event.h->qapi-event.h, qapi-event.c->qmp-event.h. Another problem
>>> +# follow: test-qapi-event.c will meet event enum double declaration since it
>>> +# include both test-qapi-event.h and qmp-event.h. One solution is putting event
>>> +# enum declaration in a separate header file, but then qmp-event.h need to
>>> +# include test-qapi-event.h or qapi-event.h on compile time condition. So the
>>> +# easist way is, just generate them here.
>>> +
>>> +def generate_event_behavior_control_decl(event_enum_name):
>>> + ret = mcgen('''
>>> +
>>> +typedef void (*QAPIEventFuncEmit)(%(event_enum_name)s ev,
>>> + QDict *dict,
>>> + Error **errp);
>
> Why does the emit function need 'ev'? Doesn't 'dict' contain all the
> info it needs? Also, it's better to rename it to 'event' or 'qmp_event'.
>
ev is for rate limit. I didn't move rate limit logic from callback to
internal, mainly because it is a generated function, which seems
too complex. And the genrated function was not moved into a separte
file mainly because the enum and including issue, see the comments
in script above.
The problem is enum is changing, so the new file include it need
to recompile, for example, test schema and qapi-schema.json may
force recompile twice, I am not sure if it is good to do
some tricks in build system.
>>> +
>>> +void qapi_event_set_func_emit(QAPIEventFuncEmit emit);
>>> +
>>> +QAPIEventFuncEmit qapi_event_get_func_emit(void);
>>> +''',
>>> + event_enum_name = event_enum_name)
>>> + return ret;
>>> +
>>> +def generate_event_behavior_control_implement():
>>> + ret = mcgen('''
>>> +
>>> +typedef struct QAPIEventFunctions {
>>> + QAPIEventFuncEmit emit;
>>> +} QAPIEventFunctions;
>>> +
>>> +QAPIEventFunctions qapi_event_functions;
>>> +
>>> +void qapi_event_set_func_emit(QAPIEventFuncEmit emit)
>>> +{
>>> + qapi_event_functions.emit = emit;
>>> +}
>
> If this function and the typedefs don't change, I think they shouldn't
> be generated.
>
>>> +
>>> +QAPIEventFuncEmit qapi_event_get_func_emit(void)
>>> +{
>>> + return qapi_event_functions.emit;
>>> +}
>>> +''')
>>> + return ret
>>> +
>>> +
>>> +# Start the real job
>>> +
>>> +try:
>>> + opts, args = getopt.gnu_getopt(sys.argv[1:], "chbp:o:",
>>> + ["source", "header", "builtins", "prefix=",
>>> + "output-dir="])
>>> +except getopt.GetoptError, err:
>>> + print str(err)
>>> + sys.exit(1)
>>> +
>>> +output_dir = ""
>>> +prefix = ""
>>> +c_file = 'qapi-event.c'
>>> +h_file = 'qapi-event.h'
>>> +
>>> +do_c = False
>>> +do_h = False
>>> +do_builtins = False
>>> +
>>> +for o, a in opts:
>>> + if o in ("-p", "--prefix"):
>>> + prefix = a
>>> + elif o in ("-o", "--output-dir"):
>>> + output_dir = a + "/"
>>> + elif o in ("-c", "--source"):
>>> + do_c = True
>>> + elif o in ("-h", "--header"):
>>> + do_h = True
>>> + elif o in ("-b", "--builtins"):
>>> + do_builtins = True
>>> +
>>> +if not do_c and not do_h:
>>> + do_c = True
>>> + do_h = True
>>> +
>>> +c_file = output_dir + prefix + c_file
>>> +h_file = output_dir + prefix + h_file
>>> +
>>> +try:
>>> + os.makedirs(output_dir)
>>> +except os.error, e:
>>> + if e.errno != errno.EEXIST:
>>> + raise
>>> +
>>> +def maybe_open(really, name, opt):
>>> + if really:
>>> + return open(name, opt)
>>> + else:
>>> + import StringIO
>>> + return StringIO.StringIO()
>>> +
>>> +fdef = maybe_open(do_c, c_file, 'w')
>>> +fdecl = maybe_open(do_h, h_file, 'w')
>>> +
>>> +fdef.write(mcgen('''
>>> +/* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */
>>> +
>>> +/*
>>> + * schema-defined QAPI event functions
>>> + *
>>> + * Copyright IBM, Corp. 2014
>>> + *
>>> + * Authors:
>>> + * Wenchao Xia <xiawenc@linux.vnet.ibm.com>
>>> + *
>>> + * This work is licensed under the terms of the GNU GPLv2+ or later.
>>> + * See the COPYING.LIB file in the top-level directory.
>>> + *
>>> + */
>>> +
>>> +#include "qemu-common.h"
>>> +#include "%(header)s"
>>> +#include "%(prefix)sqapi-visit.h"
>>> +#include "qapi/qmp-output-visitor.h"
>>> +#include "qapi/qmp-event.h"
>>> +
>>> +''',
>>> + prefix=prefix, header=basename(h_file)))
>>> +
>>> +fdecl.write(mcgen('''
>>> +/* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */
>>> +
>>> +/*
>>> + * schema-defined QAPI event function
>>> + *
>>> + * Copyright IBM, Corp. 2014
>>> + *
>>> + * Authors:
>>> + * Wenchao Xia <xiawenc@linux.vnet.ibm.com>
>>> + *
>>> + * This work is licensed under the terms of the GNU GPLv2+ or later.
>>> + * See the COPYING.LIB file in the top-level directory.
>>> + *
>>> + */
>>> +
>>> +#ifndef %(guard)s
>>> +#define %(guard)s
>>> +
>>> +#include "qapi/error.h"
>>> +#include "qapi/qmp/qdict.h"
>>> +#include "%(prefix)sqapi-types.h"
>>> +
>>> +''',
>>> + prefix=prefix, guard=guardname(h_file)))
>>> +
>>> +exprs = parse_schema(sys.stdin)
>>> +
>>> +event_enum_name = "QAPIEvent"
>>> +event_enum_values = []
>>> +event_enum_strings = []
>>> +
>>> +for expr in exprs:
>>> + if expr.has_key('event'):
>>> + event_name = expr['event']
>>> + params = expr.get('data')
>>> + if params and len(params) == 0:
>>> + params = None
>>> +
>>> + api_name = _generate_event_api_name(event_name, params)
>>> + ret = generate_event_declaration(api_name)
>>> + fdecl.write(ret)
>>> +
>>> + # We need an enum value per event
>>> + event_enum_value = generate_enum_full_value_string(event_enum_name,
>>> + event_name)
>>> + ret = generate_event_implement(api_name, event_name, params)
>>> + fdef.write(ret)
>>> +
>>> + # Record it, and generate enum later
>>> + event_enum_values.append(event_enum_value)
>>> + event_enum_strings.append(event_name)
>>> +
>>> +ret = generate_event_enum_decl(event_enum_name, event_enum_values)
>>> +fdecl.write(ret)
>>> +ret = generate_event_enum_lookup(event_enum_name, event_enum_strings)
>>> +fdef.write(ret)
>>> +ret = generate_event_behavior_control_decl(event_enum_name)
>>> +fdecl.write(ret)
>>> +ret = generate_event_behavior_control_implement()
>>> +fdef.write(ret)
>>> +
>>> +fdecl.write('''
>>> +#endif
>>> +''')
>>> +
>>> +fdecl.flush()
>>> +fdecl.close()
>>> +
>>> +fdef.flush()
>>> +fdef.close()
>>
>
next prev parent reply other threads:[~2014-01-07 3:24 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-02 23:10 [Qemu-devel] [RFC PATCH V2 0/5] add direct support of event in qapi schema Wenchao Xia
2014-01-02 23:10 ` [Qemu-devel] [RFC PATCH V2 1/5] os-posix: include sys/time.h Wenchao Xia
2014-01-02 23:10 ` [Qemu-devel] [RFC PATCH V2 2/5] qapi: add event helper functions Wenchao Xia
2014-01-06 22:23 ` Luiz Capitulino
2014-01-07 2:28 ` Wenchao Xia
2014-03-06 18:26 ` Eric Blake
2014-01-02 23:10 ` [Qemu-devel] [RFC PATCH V2 3/5] qapi script: add event support by qapi-event.py Wenchao Xia
2014-01-06 23:10 ` Luiz Capitulino
2014-01-06 23:17 ` Luiz Capitulino
2014-01-07 3:24 ` Wenchao Xia [this message]
2014-02-14 3:26 ` Wenchao Xia
2014-01-07 2:53 ` Wenchao Xia
2014-03-06 18:49 ` Eric Blake
2014-03-19 2:38 ` Wenchao Xia
2014-03-20 22:29 ` Eric Blake
2014-03-24 0:55 ` Wenchao Xia
2014-03-26 12:42 ` Markus Armbruster
2014-03-26 13:13 ` Benoît Canet
2014-03-27 7:52 ` Wenchao Xia
2014-01-02 23:10 ` [Qemu-devel] [RFC PATCH V2 4/5] test: add test cases for qapi event Wenchao Xia
2014-03-06 20:05 ` Eric Blake
2014-01-02 23:10 ` [Qemu-devel] [RFC PATCH V2 5/5] qapi event: convert RTC_CHANGE Wenchao Xia
2014-03-06 20:24 ` Eric Blake
2014-01-06 23:18 ` [Qemu-devel] [RFC PATCH V2 0/5] add direct support of event in qapi schema Luiz Capitulino
2014-03-06 18:14 ` Eric Blake
2014-03-06 19:58 ` Luiz Capitulino
2014-03-07 1:13 ` Wenchao Xia
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52CB736B.1060901@linux.vnet.ibm.com \
--to=xiawenc@linux.vnet.ibm.com \
--cc=armbru@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).