Date: Wed, 22 Jun 2005 11:21:18 -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: <200506221121.19848.jhb@FreeBSD.org> In-Reply-To: <200506211116.32625.jhb@FreeBSD.org> References: <42887FEE.3000705@kepa.fi> <20050516125109.GF33622@wombat.fafoe.narf.at> <200506211116.32625.jhb@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tuesday 21 June 2005 11:16 am, John Baldwin wrote: > 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. I just committed it to HEAD and will MFC in a week or so. -- 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?200506221121.19848.jhb>