<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Feb 26, 2015 at 6:22 PM, Zbigniew Jędrzejewski-Szmek <span dir="ltr"><<a href="mailto:zbyszek@in.waw.pl" target="_blank">zbyszek@in.waw.pl</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Thu, Feb 26, 2015 at 08:04:08AM +0000, Jan Janssen wrote:<br>
> Shawn Landden <shawn <at> <a href="http://churchofgit.com" target="_blank">churchofgit.com</a>> writes:<br>
><br>
> >  void strv_free(char **l) {<br>
> > -        strv_clear(l);<br>
> > +        char **k;<br>
> > +<br>
> > +        if (!l)<br>
> > +                return;<br>
> > +<br>
> > +        for (k = l; *k; k++)<br>
> > +                free(*k);<br>
> > +<br>
> >          free(l);<br>
> >  }<br>
> What are you trying to achieve here? I see no point in optimizing out the *l<br>
> = NULL from strv_clear.<br>
><br>
> > +                                entry->linux_loc  = l + strspn(l,<br>
> WHITESPACE);<br>
> > +                        else if ((l = startswith(m, "initrd ")))<br>
> > +                                entry->initrd     = l + strspn(l,<br>
> WHITESPACE);<br>
> You need to support more than one initrd per kernel, see<br>
> <a href="https://wiki.archlinux.org/index.php/Microcode" target="_blank">https://wiki.archlinux.org/index.php/Microcode</a> for why. Also, I am pretty<br>
> sure you can have a initrd=/path/to/initrd in the kernel options entry.<br>
> Since the efi bootloader just appends each given initrd to the kernel<br>
> command line.<br>
><br>
><br>
> All in all I am wondering why you need a rbtree for all this in the first<br>
> place? A simple hashmap should do just fine.<br>
A hashmap does not keep order. But a simple array + qsort_safe() should<br>
work too. I'm wary of introducing yet another data structure into systemd<br>
which raises the bar for people editing the code later on or making changes.<br>
<br>
We need two operations: sorting kernels to list them, and picking (I presume) the<br>
latest kernel or the kernel with the given version. Both of those operations<br>
are done once over the lifetime of the program, so any speedup in using<br>
a data structure should take into account the time to set up the structure.<br>
Neither of those operations is speed sensitive, and the more common operation<br>
of picking a specific version can be done in O(n) over an array. So using<br>
an rbtree will not save any time actually.<br></blockquote><div>I was initially using a vector of pointers here for the same reasons you reiterated, but I felt the use of greedy_realloc0() was messy and error-prone. The rbtree does not require the use of realloc(). There is no way to know how long the array needs to be from the start. Even the O(n) you mention could be turned into O(logn) by using a binary search.</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
> Also, you're not taking multi-boot into account (the machine-id field).<br>
> You're just discriminating based on the kernel version, but different<br>
> installations could have the same version field.<br>
This high-level design questions should probably be addressed first...<br>
<br>
Zbyszek<br>
_______________________________________________<br>
systemd-devel mailing list<br>
<a href="mailto:systemd-devel@lists.freedesktop.org">systemd-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/systemd-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/systemd-devel</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Shawn Landden</div>
</div></div>