From: Markus Armbruster <armbru@redhat.com>
To: Thomas Huth <thuth@redhat.com>
Cc: Matthew Rosato <mjrosato@linux.vnet.ibm.com>,
Eduardo Habkost <ehabkost@redhat.com>,
David Hildenbrand <david@redhat.com>,
cohuck@redhat.com,
Richard Henderson <richard.henderson@linaro.org>,
qemu-devel@nongnu.org, Alexander Graf <agraf@suse.de>,
borntraeger@de.ibm.com, Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
Date: Mon, 02 Oct 2017 09:01:45 +0200 [thread overview]
Message-ID: <87shf2qbhi.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <18360db6-0a06-375e-5ff7-a601c34b7123@redhat.com> (Thomas Huth's message of "Mon, 11 Sep 2017 04:19:03 +0200")
Thomas Huth <thuth@redhat.com> writes:
> On 08.09.2017 14:29, Markus Armbruster wrote:
>> Thomas Huth <thuth@redhat.com> writes:
>>
>>> On 07.09.2017 22:13, David Hildenbrand wrote:
>>>> Implemented in sclp.c, so let's move it to the right include file.
>>>> Fix up one include. Do a forward declaration of CPUS390XState to fix the
>>>> two sclp consoles complaining.
>>>>
>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>> ---
>>>> include/hw/s390x/sclp.h | 2 ++
>>>> target/s390x/cpu.h | 1 -
>>>> target/s390x/misc_helper.c | 1 +
>>>> 3 files changed, 3 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>>>> index a72d096081..4b86a8a293 100644
>>>> --- a/include/hw/s390x/sclp.h
>>>> +++ b/include/hw/s390x/sclp.h
>>>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
>>>> sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>>>> void sclp_service_interrupt(uint32_t sccb);
>>>> void raise_irq_cpu_hotplug(void);
>>>> +typedef struct CPUS390XState CPUS390XState;
>>>> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
>>>
>>> That's dangerous and likely does not work with certain versions of GCC.
>>> You can't do a "forward declaration" with typedef in C, I'm afraid. See
>>> for example:
>>>
>>> https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
>>> https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
>>> https://stackoverflow.com/questions/8367646/redefinition-of-typedef
>>>
>>> All this typedef'ing in QEMU is pretty bad ... we run into this problem
>>> again and again. include/qemu/typedefs.h is just a work-around for this.
>>> I know people like typedefs for some reasons (I used to do that, too,
>>> before I realized the trouble with them), but IMHO we should rather
>>> adopt the typedef-related rules from the kernel coding conventions instead:
>>>
>>> https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs
>>
>> I prefer the kernel style for typedefs myself. But it's strictly a
>> matter of style. Excessive typedeffing makes code harder to understand,
>> it isn't wrong. The part that's wrong is defining things more than
>> once, and that applies to everything, not just typedefs.
>>
>> Sometimes you get away with defining something more than once. It's
>> still wrong.
>>
>> You're not supposed to define the same variable more than once, either
>> (although many C compilers let you get away with it, see -fno-common).
>> You define it in *one* place. If you need to declare it, declare it in
>> *one* place, and make sure that place is in scope at the definition, so
>> the compiler can check the two match.
>>
>> Likewise, you're not supposed to define the same struct tag more than
>> once, and you should declare it in just one place.
>
> AFAIK it's perfect valid C to do a forward declaration of a struct
> multiple times by just writing e.g. "struct CPUS390XState;" somewhere in
> your code. This is also what is done in various Linux kernel headers all
> over the place.
"Define it in one place" is dictated by the language, i.e. violating the
rule is wrong.
"Declare it in one place" is merely style. I insist on it for
declarations the compiler can meaningfully check against definitions,
such as function declarations. It can't for struct tags, and I consider
"one place" a matter of taste there.
>> Likewise, you're not supposed to define (with typedef) the same type
>> more than once. There is no such thing as a typedef declaration.
>>
>> qemu/typedefs.h is not a work-around for a typedef-happy style. Its
>> purpose is breaking inclusion cycles. Secondary purpose is reducing the
>> need for non-cyclic includes. If we didn't typedef, we'd still put our
>> struct declarations there.
>
> No, since it's not required for struct forward declarations, only to
> avoid multiple typedef definitions.
I definitely would, because I prefer sticking to "declare in one place"
style.
next prev parent reply other threads:[~2017-10-02 7:01 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 01/21] exec, dump, i386, ppc, s390x: don't include exec/cpu-all.h explicitly David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 02/21] cpu: drop old comments describing members David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 03/21] s390x: get rid of s390-virtio.c David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 04/21] s390x: rename s390-virtio.h to s390-virtio-hcall.h David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 05/21] target/s390x: move typedef of S390CPU to its definition David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 06/21] s390x: move s390_virtio_hypercall() to s390-virtio-hcall.h David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 07/21] s390x: move subsystem_reset() to s390-virtio-ccw.h David Hildenbrand
2017-09-08 3:58 ` Thomas Huth
2017-09-08 7:50 ` Christian Borntraeger
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h David Hildenbrand
2017-09-08 4:21 ` Thomas Huth
2017-09-08 12:29 ` Markus Armbruster
2017-09-11 2:19 ` Thomas Huth
2017-10-02 7:01 ` Markus Armbruster [this message]
2017-09-08 12:46 ` David Hildenbrand
2017-09-09 22:07 ` Eduardo Habkost
2017-09-11 2:23 ` Thomas Huth
2017-09-11 18:22 ` Eduardo Habkost
2017-09-11 10:23 ` Paolo Bonzini
2017-09-11 13:45 ` David Hildenbrand
2017-09-11 17:52 ` Eduardo Habkost
2017-09-11 17:56 ` David Hildenbrand
2017-09-11 18:06 ` Eduardo Habkost
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 09/21] target/s390x: use trigger_pgm_exception() in s390_cpu_handle_mmu_fault() David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 10/21] target/s390x: use program_interrupt() in per_check_exception() David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 11/21] s390x: allow only 1 CPU with TCG David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 12/21] target/s390x: set cpu->id for linux user when realizing David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 13/21] target/s390x: use "core-id" for cpu number/address/id handling David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 14/21] target/s390x: rename next_cpu_id to next_core_id David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 15/21] s390x: print CPU definitions in sorted order David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 16/21] s390x: allow cpu hotplug via device_add David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 17/21] s390x: CPU hot unplug via device_del cannot work for now David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 18/21] s390x: implement query-hotpluggable-cpus David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 19/21] s390x: get rid of cpu_s390x_create() David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 20/21] s390x: generate sclp cpu information from possible_cpus David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 21/21] s390x: allow CPU hotplug in random core-id order David Hildenbrand
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=87shf2qbhi.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=agraf@suse.de \
--cc=borntraeger@de.ibm.com \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=ehabkost@redhat.com \
--cc=mjrosato@linux.vnet.ibm.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=thuth@redhat.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.