diff mbox series

[v2] CODING_STYLE.rst: flesh out our naming conventions.

Message ID 20200810105147.10670-1-alex.bennee@linaro.org
State New
Headers show
Series [v2] CODING_STYLE.rst: flesh out our naming conventions. | expand

Commit Message

Alex Bennée Aug. 10, 2020, 10:51 a.m. UTC
Mention a few of the more common naming conventions we follow in the
code base including common variable names and function prefix and
suffix examples.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>


---
v2
  - punctuation fixes suggested by Cornelia
  - re-worded section on qemu_ prefix
  - expanded on _locked suffix
---
 CODING_STYLE.rst | 30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

-- 
2.20.1

Comments

Cornelia Huck Aug. 11, 2020, 7:08 a.m. UTC | #1
On Mon, 10 Aug 2020 11:51:47 +0100
Alex Bennée <alex.bennee@linaro.org> wrote:

> Mention a few of the more common naming conventions we follow in the

> code base including common variable names and function prefix and

> suffix examples.

> 

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

> 

> ---

> v2

>   - punctuation fixes suggested by Cornelia

>   - re-worded section on qemu_ prefix

>   - expanded on _locked suffix

> ---

>  CODING_STYLE.rst | 30 ++++++++++++++++++++++++++++--

>  1 file changed, 28 insertions(+), 2 deletions(-)

> 

> diff --git a/CODING_STYLE.rst b/CODING_STYLE.rst

> index 427699e0e42..e7ae44aed7f 100644

> --- a/CODING_STYLE.rst

> +++ b/CODING_STYLE.rst

> @@ -109,8 +109,34 @@ names are lower_case_with_underscores_ending_with_a_t, like the POSIX

>  uint64_t and family.  Note that this last convention contradicts POSIX

>  and is therefore likely to be changed.

>  

> -When wrapping standard library functions, use the prefix ``qemu_`` to alert

> -readers that they are seeing a wrapped version; otherwise avoid this prefix.

> +Variable Naming Conventions

> +---------------------------

> +

> +A number of short naming conventions exist for variables that use

> +common QEMU types. For example, the architecture independent CPUState

> +this is often held as a ``cs`` pointer variable, whereas the concrete


s/this//

> +CPUArchState us usually held in a pointer called ``env``.


s/us/is/

> +

> +Likewise, in device emulation code the common DeviceState is usually

> +called ``dev`` with the actual status structure often uses the terse


s/with/while/

> +``s`` or maybe ``foodev``.

> +

> +Function Naming Conventions

> +---------------------------

> +

> +The ``qemu_`` prefix is used for utility functions that are widely

> +called from across the code-base. This includes wrapped versions of

> +standard library functions (e.g. qemu_strtol) where the prefix is

> +added to the function name to alert readers that they are seeing a

> +wrapped version; otherwise avoid this prefix.


Hm... not so sure about "otherwise avoid this prefix". It sounds a bit
like you should avoid it for anything but wrappers, but I think what we
want to say is that qemu_ should be used for anything that is
potentially useful in many places, but probably not if there is a
better prefix?

> +

> +If there are two versions of a function to be called with or without a

> +lock held, the function that expects the lock to be already held

> +usually uses the suffix ``_locked``.

> +

> +Public functions (i.e. declared in public headers) tend to be prefixed

> +with the subsystem or file they came from. For example, ``tlb_`` for

> +functions from ``cputlb.c`` or ``cpu_`` for functions from cpus.c.

>  

>  Block structure

>  ===============
Alex Bennée Aug. 11, 2020, 11:48 a.m. UTC | #2
Cornelia Huck <cohuck@redhat.com> writes:

> On Mon, 10 Aug 2020 11:51:47 +0100

> Alex Bennée <alex.bennee@linaro.org> wrote:

>

>> Mention a few of the more common naming conventions we follow in the

>> code base including common variable names and function prefix and

>> suffix examples.

>> 

>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

>> 

>> ---

>> v2

>>   - punctuation fixes suggested by Cornelia

>>   - re-worded section on qemu_ prefix

>>   - expanded on _locked suffix

>> ---

>>  CODING_STYLE.rst | 30 ++++++++++++++++++++++++++++--

>>  1 file changed, 28 insertions(+), 2 deletions(-)

>> 

>> diff --git a/CODING_STYLE.rst b/CODING_STYLE.rst

>> index 427699e0e42..e7ae44aed7f 100644

>> --- a/CODING_STYLE.rst

>> +++ b/CODING_STYLE.rst

>> @@ -109,8 +109,34 @@ names are lower_case_with_underscores_ending_with_a_t, like the POSIX

>>  uint64_t and family.  Note that this last convention contradicts POSIX

>>  and is therefore likely to be changed.

>>  

>> -When wrapping standard library functions, use the prefix ``qemu_`` to alert

>> -readers that they are seeing a wrapped version; otherwise avoid this prefix.

>> +Variable Naming Conventions

>> +---------------------------

>> +

>> +A number of short naming conventions exist for variables that use

>> +common QEMU types. For example, the architecture independent CPUState

>> +this is often held as a ``cs`` pointer variable, whereas the concrete

>

> s/this//

>

>> +CPUArchState us usually held in a pointer called ``env``.

>

> s/us/is/

>

>> +

>> +Likewise, in device emulation code the common DeviceState is usually

>> +called ``dev`` with the actual status structure often uses the terse

>

> s/with/while/


Oops sorry about those - serves me right for trying to re-spin too quickly.

>

>> +``s`` or maybe ``foodev``.

>> +

>> +Function Naming Conventions

>> +---------------------------

>> +

>> +The ``qemu_`` prefix is used for utility functions that are widely

>> +called from across the code-base. This includes wrapped versions of

>> +standard library functions (e.g. qemu_strtol) where the prefix is

>> +added to the function name to alert readers that they are seeing a

>> +wrapped version; otherwise avoid this prefix.

>

> Hm... not so sure about "otherwise avoid this prefix". It sounds a bit

> like you should avoid it for anything but wrappers, but I think what we

> want to say is that qemu_ should be used for anything that is

> potentially useful in many places, but probably not if there is a

> better prefix?


Yeah it's a hangover from the previous phrasing. Our current usage
certainly isn't just for wrapped functions - qemu_mutex_lock_iothread and
friends for example are very specifically qemu utility functions rather
than wrapped functions.

We also have a bunch of static functions that should really not have the
prefix - qemu_kvm_start_vcpu for example looses nothing by just being
kvm_start_vcpu.

We also have functions that could arguably just use a subsystem prefix -
for example qemu_chr_fe_accept_input is very much a thing you only call
when dealing with chardev frontends (chr_fe).

I'm certainly not proposing mass renames but it's clear our usage is
wider than just wrapped functions.

If I re-arrange slightly we can roll from qemu_ to public functions:

  Function Naming Conventions
  ---------------------------

  The ``qemu_`` prefix is used for utility functions that are widely
  called from across the code-base. This includes wrapped versions of
  standard library functions (e.g. ``qemu_strtol``) where the prefix is
  added to the library function name to alert readers that they are
  seeing a wrapped version.

  Public functions from a file or subsystem (declared in headers) tend
  to have a consistent prefix to show where they came from. For example,
  ``tlb_`` for functions from ``cputlb.c`` or ``cpu_`` for functions
  from cpus.c.

  If there are two versions of a function to be called with or without a
  lock held, the function that expects the lock to be already held
  usually uses the suffix ``_locked``.

What do you think?

(note to self, _impl seems like another convention we should document at
some point).

-- 
Alex Bennée
Cornelia Huck Aug. 11, 2020, 11:56 a.m. UTC | #3
On Tue, 11 Aug 2020 12:48:38 +0100
Alex Bennée <alex.bennee@linaro.org> wrote:

> If I re-arrange slightly we can roll from qemu_ to public functions:

> 

>   Function Naming Conventions

>   ---------------------------

> 

>   The ``qemu_`` prefix is used for utility functions that are widely

>   called from across the code-base. This includes wrapped versions of

>   standard library functions (e.g. ``qemu_strtol``) where the prefix is

>   added to the library function name to alert readers that they are

>   seeing a wrapped version.

> 

>   Public functions from a file or subsystem (declared in headers) tend

>   to have a consistent prefix to show where they came from. For example,

>   ``tlb_`` for functions from ``cputlb.c`` or ``cpu_`` for functions

>   from cpus.c.

> 

>   If there are two versions of a function to be called with or without a

>   lock held, the function that expects the lock to be already held

>   usually uses the suffix ``_locked``.

> 

> What do you think?


There naturally are places that don't follow the convention (for
example, hw/intc/s390_flic.c is using the qemu_ prefix to mark the
non-kvm functions), but this makes sense for new code. Looks good to me.
Philippe Mathieu-Daudé Aug. 11, 2020, 3:55 p.m. UTC | #4
Hi Alex,

On 8/10/20 12:51 PM, Alex Bennée wrote:
> Mention a few of the more common naming conventions we follow in the

> code base including common variable names and function prefix and

> suffix examples.

> 

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

> 

> ---

...
> +Function Naming Conventions

> +---------------------------

> +

> +The ``qemu_`` prefix is used for utility functions that are widely

> +called from across the code-base. This includes wrapped versions of

> +standard library functions (e.g. qemu_strtol) where the prefix is

> +added to the function name to alert readers that they are seeing a

> +wrapped version; otherwise avoid this prefix.

> +

> +If there are two versions of a function to be called with or without a

> +lock held, the function that expects the lock to be already held

> +usually uses the suffix ``_locked``.


And if there is only one version? I'm looking at:

  /* With q->lock */
  static void nvme_kick(NVMeQueuePair *q)
  {
  ...
  }

Should the style be enforced here and this function renamed
nvme_kick_locked()?

In this particular case, I think so, because we also have:

  /* With q->lock */
  static void nvme_put_free_req_locked(...)
  {
  ...
  }

  /* With q->lock */
  static void nvme_wake_free_req_locked(NVMeQueuePair *q)
  {
  ...
  }

For more cases:

$ git grep -A1 -i '\/\*.*with.*lock'
Cornelia Huck Aug. 11, 2020, 4:06 p.m. UTC | #5
On Tue, 11 Aug 2020 17:55:08 +0200
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> Hi Alex,

> 

> On 8/10/20 12:51 PM, Alex Bennée wrote:

> > Mention a few of the more common naming conventions we follow in the

> > code base including common variable names and function prefix and

> > suffix examples.

> > 

> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

> > 

> > ---  

> ...

> > +Function Naming Conventions

> > +---------------------------

> > +

> > +The ``qemu_`` prefix is used for utility functions that are widely

> > +called from across the code-base. This includes wrapped versions of

> > +standard library functions (e.g. qemu_strtol) where the prefix is

> > +added to the function name to alert readers that they are seeing a

> > +wrapped version; otherwise avoid this prefix.

> > +

> > +If there are two versions of a function to be called with or without a

> > +lock held, the function that expects the lock to be already held

> > +usually uses the suffix ``_locked``.  

> 

> And if there is only one version? I'm looking at:

> 

>   /* With q->lock */

>   static void nvme_kick(NVMeQueuePair *q)

>   {

>   ...

>   }

> 

> Should the style be enforced here and this function renamed

> nvme_kick_locked()?

> 

> In this particular case, I think so, because we also have:

> 

>   /* With q->lock */

>   static void nvme_put_free_req_locked(...)

>   {

>   ...

>   }

> 

>   /* With q->lock */

>   static void nvme_wake_free_req_locked(NVMeQueuePair *q)

>   {

>   ...

>   }

> 

> For more cases:

> 

> $ git grep -A1 -i '\/\*.*with.*lock'

> 

> 


I'm not sure we really want to encode calling conventions into function
names, beyond being able to distinguish between lock/no-lock versions.
Just appending _locked does not really tell us *which* lock is supposed
to be held, that needs to be documented in a comment anyway.
Thomas Huth Aug. 23, 2020, 8:20 a.m. UTC | #6
On 10/08/2020 12.51, Alex Bennée wrote:
> Mention a few of the more common naming conventions we follow in the

> code base including common variable names and function prefix and

> suffix examples.

> 

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

> 

> ---

> v2

>    - punctuation fixes suggested by Cornelia

>    - re-worded section on qemu_ prefix

>    - expanded on _locked suffix

> ---

>   CODING_STYLE.rst | 30 ++++++++++++++++++++++++++++--

>   1 file changed, 28 insertions(+), 2 deletions(-)

> 

> diff --git a/CODING_STYLE.rst b/CODING_STYLE.rst

> index 427699e0e42..e7ae44aed7f 100644

> --- a/CODING_STYLE.rst

> +++ b/CODING_STYLE.rst

> @@ -109,8 +109,34 @@ names are lower_case_with_underscores_ending_with_a_t, like the POSIX

>   uint64_t and family.  Note that this last convention contradicts POSIX

>   and is therefore likely to be changed.

>   

> -When wrapping standard library functions, use the prefix ``qemu_`` to alert

> -readers that they are seeing a wrapped version; otherwise avoid this prefix.

> +Variable Naming Conventions

> +---------------------------

> +

> +A number of short naming conventions exist for variables that use

> +common QEMU types. For example, the architecture independent CPUState

> +this is often held as a ``cs`` pointer variable, whereas the concrete

> +CPUArchState us usually held in a pointer called ``env``.

> +

> +Likewise, in device emulation code the common DeviceState is usually

> +called ``dev`` with the actual status structure often uses the terse

> +``s`` or maybe ``foodev``.


Please let's not recommend single-letter variables like 's' here. This 
is a really bad idea, since they are hard to "grep" and can be confused 
quite easily. I think it would be best to simply drop that last part of 
the sentence (starting with "with the actual...").

  Thomas
diff mbox series

Patch

diff --git a/CODING_STYLE.rst b/CODING_STYLE.rst
index 427699e0e42..e7ae44aed7f 100644
--- a/CODING_STYLE.rst
+++ b/CODING_STYLE.rst
@@ -109,8 +109,34 @@  names are lower_case_with_underscores_ending_with_a_t, like the POSIX
 uint64_t and family.  Note that this last convention contradicts POSIX
 and is therefore likely to be changed.
 
-When wrapping standard library functions, use the prefix ``qemu_`` to alert
-readers that they are seeing a wrapped version; otherwise avoid this prefix.
+Variable Naming Conventions
+---------------------------
+
+A number of short naming conventions exist for variables that use
+common QEMU types. For example, the architecture independent CPUState
+this is often held as a ``cs`` pointer variable, whereas the concrete
+CPUArchState us usually held in a pointer called ``env``.
+
+Likewise, in device emulation code the common DeviceState is usually
+called ``dev`` with the actual status structure often uses the terse
+``s`` or maybe ``foodev``.
+
+Function Naming Conventions
+---------------------------
+
+The ``qemu_`` prefix is used for utility functions that are widely
+called from across the code-base. This includes wrapped versions of
+standard library functions (e.g. qemu_strtol) where the prefix is
+added to the function name to alert readers that they are seeing a
+wrapped version; otherwise avoid this prefix.
+
+If there are two versions of a function to be called with or without a
+lock held, the function that expects the lock to be already held
+usually uses the suffix ``_locked``.
+
+Public functions (i.e. declared in public headers) tend to be prefixed
+with the subsystem or file they came from. For example, ``tlb_`` for
+functions from ``cputlb.c`` or ``cpu_`` for functions from cpus.c.
 
 Block structure
 ===============