Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Jun 2005 11:16:31 -0400
From:      John Baldwin <jhb@FreeBSD.org>
To:        freebsd-hackers@freebsd.org
Cc:        Stefan Farfeleder <stefan@fafoe.narf.at>, Juho Vuori <juho.vuori@kepa.fi>
Subject:   Re: Bug in devinfo or something wrong with me?
Message-ID:  <200506211116.32625.jhb@FreeBSD.org>
In-Reply-To: <20050516125109.GF33622@wombat.fafoe.narf.at>
References:  <42887FEE.3000705@kepa.fi> <20050516125109.GF33622@wombat.fafoe.narf.at>

next in thread | previous in thread | raw e-mail | index | archive | help
On Monday 16 May 2005 08:51 am, Stefan Farfeleder wrote:
> On Mon, May 16, 2005 at 02:11:42PM +0300, Juho Vuori wrote:
> > The below included simple program reliably printfs "error 4\n" on
> > 5.4-RELEASE. Am I understanding something wrong or is this a bug in
> > libdevinfo?
>
> There is indeed a bug in libdevinfo.
>
> > To continue on this however, if you put say sleep(5) between
> > devinfo_free() and the second devinfo_init() and manage to change the
> > device configuration during the sleep (tested with pluggin in/out a USB
> > memory), the program terminates with no errors. I've run into other
> > oddities with devinfo as well, but in much more complex situations so
> > they might just as well be variations of this simple example.
> >
> >        if (devinfo_init()) {
>
> devinfo_init() initialises the devinfo_dev tailq, devinfo_generation and
> sets devinfo_initted to 1.
>
> >        devinfo_free();
>
> devinfo_free() clears devinfo_dev and sets devinfo_initted to 0 but
> devinfo_generation keeps its value.
>
> >        if (devinfo_init()) {
>
> Now devinfo_dev doesn't get filled because ubus.ub_generation ==
> devinfo_generation.
>
> Here is a patch that resets devinfo_generation to 0 in devinfo_free().
> The whole file can probably be simplified a bit due to this bug.
>
> Stefan

I think the intent is actually so that you can call devinfo_init() 
periodically without calling devinfo_free() to make sure the tree is up to 
date.  However, the generation should still be cleared when free() is called.  
IOW, if you wanted to have a program that would poll the kernel each second 
to get the current tree, it would call devinfo_init() in a loop and only call 
devinfo_free() at program exit.  This would let devinfo_init() cache data if 
the device tree doesn't change.  I'll try to get the patch into the tree.

-- 
John Baldwin <jhb@FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200506211116.32625.jhb>