On  8/09/09 10:55 AM, Garrett D'Amore wrote:
> James Carlson wrote:
>>
>>> Given that, I'd actually prefer to remove the queue.h interfaces, and
>>> promote list.h.  list.h interfaces are safer than BSD queue.h (see 
>>> above
>>> argument), and have been around and available since ~forever.
>>>     
>>
>> Please don't!
>>
>> The BSD queue.h interfaces are used in both kernel *and* user-space code
>>  -- they're also present on Linux -- and the lack of them on classic
>> Solaris is a very annoying application portability issue.
>>
>> Removing them would be a big step backwards.
>>
>>   
>
> Ok.  Well in this case, someone else should raise the commitment level 
> and ARC them.  Just having them "appear" on Solaris without any ARC 
> coverage or interface stability is IMO less than helpful.
>
> It looks like this arrived with the Packet Filter Hooks stuff.

Because that was the easiest way to get it in. At the time there was
both programming desire and portability concerns and I was not
interested in the "lengthy discussion" that would likely ensure on the
PSARC mailing list if I tried to them introduced as a stable interface.

With the "new and improved" PSARC, maybe it would be an easier
task to raise their commitment level now.

But now that the topic has been brought up, maybe sometime soon
would be appropriate...

btw, the <sys/list.h> interfaces are only "safer" in some respects:
for example, they're less safe with types. The <sys/queue.h> interfaces
all require explicit types be used for every structure. You cannot
easily insert something of "type a" into a list of "type b". With
the gratuitous use of "void *" in <sys/list.h>, simple protection such
as this is non existent.

Personally, I prefer the <sys/queue.h> interfaces for another reason:
when you're choosing a "type of list" to store data in, you need to
make a conscious choice about whether it is a linked listed, tailq,
circular queue, etc. IMHO, this plays an important role in how
you manage the data and especially for how others view the code
later. Whilst <sys/list.h> is more flexible like that, I think it
opens up more risk by allowing one programmer to use it as
a list and someone else to expect it to be a circular queue
because the way data is organised may differ significantly.
But this is just an opinion.

Both interfaces suffer from other issues, such as if a data structure
is common to more than one module and the location of the list
data elements change in the structure, only updating one module
is likely to cause problems. But this is a generic C problem.

Whilst with <sys/list.h>, any change to list_t or list_node_t requires
that all of code using that interface needs to be updated, with the
<sys/queue.h> model, only "matching binaries" need to be updated.
I'm not really worried about this, for two reasons:
- the core data structures are very stable, it has been more common
  for newer list types to be added than the structures updated;
- if/when they do change, it is likely to be a significant flag day.
(both reasons apply to both sets of interfaces.)

I suspect that any change to the internal structures would draw a lot
of attention, even if it were "to provide locked(safe) API" as the
seemingly better alternative would be to just build a complete new
set of macros/functions that used their own data structures, rather
than impose a new operational paradigm on code that doesn't have
any need for it.

So the only significant difference that I'm aware of is that the
<sys/queue.h> interfaces offer type safety whereas the one in
<sys/list.h> does not. For some people this might be important,
for others not.

Darren

Reply via email to