lkml.org 
[lkml]   [2002]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH][2.5] Single linked lists for Linux, overly complicated v2
    > My problem is just: where to put the old _entry? Anyway, since we're 
    > talking about list entry deletion, we could copy it nowhere and just
    > overwrite it with _entry->next...

    honestly, I think if you're contemplating this kind of thing, you've
    gone too far with the design. it should be dirt friggin simple', like
    what wli posted a while ago with struct list. if you need more, you
    really should just use list_head and be done with it. (restartable list
    walking? why did you stop walking in the first place? oh, you didn't
    mean restartable, you meant able to start walking at an arbitrary
    position? back to list_head.. )

    Here's something I'd consider using if it were in the kernel. if others
    agree, I can finalize and submit it.

    ( yeah, a lot of it is stinky, like the requirement that users magically
    have the right member in their structs. I have no deep love for the
    interface. at least this passes basic usage tests..)

    #define TSLIST_DECLARE(type, name) \
    type *name = NULL

    #define TSLIST_MEMBER_INIT(member) \
    NULL

    #define INIT_TSLIST_MEMBER(member) \
    do { \
    (member)->_slist_next = NULL; \
    } while (0)

    #define tslist_on_list(_head,_elem) \
    ( (_elem)->_slist_next != NULL || _head == _elem )

    #define tslist_push tslist_add

    #define tslist_add(_head, _elem) \
    do { \
    BUG_ON(tslist_on_list(_head, _elem)); \
    (_elem)->_slist_next = (_head); \
    (_head) = (_elem); \
    } while(0)

    #define tslist_pop(_head) \
    ({ \
    typeof(_head) _ret = _head; \
    if ( _head ) { \
    _ret = _head; \
    _head = _head->_slist_next; \
    _ret->_slist_next = NULL; \
    } \
    _ret; \
    })

    #define __tslist_walk_del(_start, _elem) \
    do { \
    typeof(_start) _pos, _prev = _start; \
    for (; _prev && (_pos = _prev->_slist_next) ; \
    _prev = _pos ) { \
    if ( _pos != _elem ) \
    continue; \
    _prev->_slist_next = (_elem)->_slist_next;\
    (_elem)->_slist_next = NULL; \
    break; \
    } \
    } while (0)


    #define tslist_del(_head, _elem) \
    do { \
    if ( _head == _elem ) { \
    _head = (_elem)->_slist_next; \
    (_elem)->_slist_next = NULL; \
    } else { \
    __tslist_walk_del(_head, _elem); \
    } \
    } while (0)

    #define tslist_for_each(_pos, _head) \
    for ( _pos = _head ; _pos ; _pos = _pos->_slist_next )
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:29    [W:2.498 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site