svn commit: r243215 - user/andre/tcp_workqueue/sys/sys

mdf at FreeBSD.org mdf at FreeBSD.org
Mon Nov 19 18:44:01 UTC 2012


On Mon, Nov 19, 2012 at 10:16 AM, Navdeep Parhar <np at freebsd.org> wrote:
> On 11/19/12 10:13, Andre Oppermann wrote:
>> On 19.11.2012 18:01, mdf at FreeBSD.org wrote:
>>> On Mon, Nov 19, 2012 at 5:33 AM, Andre Oppermann <andre at freebsd.org>
>>> wrote:
>>>> On 19.11.2012 12:45, Gleb Smirnoff wrote:
>>>>>
>>>>> On Sun, Nov 18, 2012 at 12:17:07PM +0000, Andre Oppermann wrote:
>>>>> A> Author: andre
>>>>> A> Date: Sun Nov 18 12:17:07 2012
>>>>> A> New Revision: 243215
>>>>> A> URL: http://svnweb.freebsd.org/changeset/base/243215
>>>>> A>
>>>>> A> Log:
>>>>> A>   Add mtodo(m, o, t) macro taking an additional offset into
>>>>> A>   the mbuf data section before the casting to type 't'.
>>>>>
>>>>> IMHO, argument order of (m, t, o) is more intuitive, since
>>>>> matches order of mtod().
>>>>
>>>>
>>>> Yes, but that looks rather horrible and counter-intuitive:
>>>>
>>>>   th = mtodo(m, struct tcphdr *, 20);
>>>>
>>>> vs.
>>>>
>>>>   th = mtodo(m, 20, struct tcphdr *);
>>>>
>>>> Reads m->m_data at offset 20 is struct tcphdr.
>>>>
>>>> Naming it mtood() wasn't convincing either. ;-)
>>>
>>> Why a cast at all?  Perpetuating the mistake of mtod()'s casting isn't
>>> necessary.  mtod() can't be fixed for source reasons, but the new one
>>> doesn't need to cast.  Since C automatically casts from void * to any
>>> other pointer, the code gets shorter (usually) too:
>>>
>>> th = mtodo(m, 20);
>>
>> m->m_data is caddr_t which is "char *"
>
> No matter what it is you can always cast it to void * before returning,
> instead of having the caller supply the type.

Right, this is what I meant.  Instead of a parameter to cast to, just
return void *.  Let the caller cast, or not, as needed.  It's a
simpler macro that way.

Cheers,
matthew


More information about the svn-src-user mailing list