Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/adt/cht.c

    r8f9c808 r63e27ef  
    290290#include <adt/cht.h>
    291291#include <adt/hash.h>
    292 #include <debug.h>
    293 #include <memstr.h>
     292#include <assert.h>
    294293#include <mm/slab.h>
    295294#include <arch/barrier.h>
     
    523522        bool can_block, cht_ops_t *op)
    524523{
    525         ASSERT(h);
    526         ASSERT(op && op->hash && op->key_hash && op->equal && op->key_equal);
     524        assert(h);
     525        assert(op && op->hash && op->key_hash && op->equal && op->key_equal);
    527526        /* Memoized hashes are stored in the rcu_link.func function pointer. */
    528         STATIC_ASSERT(sizeof(size_t) == sizeof(rcu_func_t));
    529         ASSERT(sentinel.hash == (uintptr_t)sentinel.rcu_link.func);
     527        static_assert(sizeof(size_t) == sizeof(rcu_func_t), "");
     528        assert(sentinel.hash == (uintptr_t)sentinel.rcu_link.func);
    530529
    531530        /* All operations are compulsory. */
     
    626625       
    627626        /* You must clear the table of items. Otherwise cht_destroy will leak. */
    628         ASSERT(atomic_get(&h->item_cnt) == 0);
     627        assert(atomic_get(&h->item_cnt) == 0);
    629628}
    630629
     
    686685static inline cht_link_t *find_lazy(cht_t *h, void *key)
    687686{
    688         ASSERT(h);
     687        assert(h);
    689688        /* See docs to cht_find() and cht_find_lazy(). */
    690         ASSERT(rcu_read_locked());
     689        assert(rcu_read_locked());
    691690       
    692691        size_t hash = calc_key_hash(h, key);
     
    732731cht_link_t *cht_find_next_lazy(cht_t *h, const cht_link_t *item)
    733732{
    734         ASSERT(h);
    735         ASSERT(rcu_read_locked());
    736         ASSERT(item);
     733        assert(h);
     734        assert(rcu_read_locked());
     735        assert(item);
    737736       
    738737        return find_duplicate(h, item, calc_node_hash(h, item), get_next(item->link));
     
    756755        do {
    757756                cur = get_next(prev);
    758                 ASSERT(cur);
     757                assert(cur);
    759758                prev = cur->link;
    760759        } while (node_hash(h, cur) < search_hash);
     
    771770               
    772771                cur = get_next(cur->link);
    773                 ASSERT(cur);
     772                assert(cur);
    774773        }
    775774       
     
    791790        marked_ptr_t old_head, size_t old_idx)
    792791{
    793         ASSERT(N_INVALID == get_mark(old_head));
    794         ASSERT(h->new_b);
     792        assert(N_INVALID == get_mark(old_head));
     793        assert(h->new_b);
    795794       
    796795        size_t new_idx = calc_bucket_idx(hash, h->new_b->order);
     
    904903                         * traversing search_head.
    905904                         */
    906                         ASSERT(N_JOIN & get_mark(get_next(old_head)->link));
     905                        assert(N_JOIN & get_mark(get_next(old_head)->link));
    907906                        return search_bucket(h, old_head, key, hash);
    908907                }
     
    914913                 * sure all cpus see that the new table replaced the old one.
    915914                 */
    916                 ASSERT(h->b->order == h->new_b->order);
     915                assert(h->b->order == h->new_b->order);
    917916                /*
    918917                 * The resizer must ensure all new bucket heads are visible before
    919918                 * replacing the old table.
    920919                 */
    921                 ASSERT(N_NORMAL == get_mark(new_head));
     920                assert(N_NORMAL == get_mark(new_head));
    922921                return search_bucket(h, new_head, key, hash);
    923922        }
     
    962961bool cht_insert_unique(cht_t *h, cht_link_t *item, cht_link_t **dup_item)
    963962{
    964         ASSERT(rcu_read_locked());
    965         ASSERT(dup_item);
     963        assert(rcu_read_locked());
     964        assert(dup_item);
    966965        return insert_impl(h, item, dup_item);
    967966}
     
    10611060                return ret == make_link(wnd->cur, jf_mark);
    10621061        } else {
    1063                 ASSERT(walk_mode == WM_LEAVE_JOIN);
     1062                assert(walk_mode == WM_LEAVE_JOIN);
    10641063
    10651064                item->link = make_link(wnd->cur, N_NORMAL);
     
    10881087        cht_link_t *cur, cht_link_t **dup_item)
    10891088{
    1090         ASSERT(cur);
    1091         ASSERT(cur == &sentinel || hash <= node_hash(h, cur)
     1089        assert(cur);
     1090        assert(cur == &sentinel || hash <= node_hash(h, cur)
    10921091                || node_hash(h, cur) == h->invalid_hash);
    10931092       
     
    11111110        cht_link_t *start)
    11121111{
    1113         ASSERT(hash <= node_hash(h, start) || h->invalid_hash == node_hash(h, start));
     1112        assert(hash <= node_hash(h, start) || h->invalid_hash == node_hash(h, start));
    11141113
    11151114        cht_link_t *cur = start;
    11161115       
    11171116try_again:     
    1118         ASSERT(cur);
     1117        assert(cur);
    11191118
    11201119        while (node_hash(h, cur) == hash) {
    1121                 ASSERT(cur != &sentinel);
     1120                assert(cur != &sentinel);
    11221121               
    11231122                bool deleted = (N_DELETED & get_mark(cur->link));
     
    11281127               
    11291128                cur = get_next(cur->link);
    1130                 ASSERT(cur);
     1129                assert(cur);
    11311130        }
    11321131
     
    11431142size_t cht_remove_key(cht_t *h, void *key)
    11441143{
    1145         ASSERT(h);
     1144        assert(h);
    11461145       
    11471146        size_t hash = calc_key_hash(h, key);
     
    11641163bool cht_remove_item(cht_t *h, cht_link_t *item)
    11651164{
    1166         ASSERT(h);
    1167         ASSERT(item);
     1165        assert(h);
     1166        assert(item);
    11681167        /* Otherwise a concurrent cht_remove_key might free the item. */
    1169         ASSERT(rcu_read_locked());
     1168        assert(rcu_read_locked());
    11701169
    11711170        /*
     
    12631262        bool *deleted_but_gc, bool *resizing)
    12641263{
    1265         ASSERT(wnd->cur && wnd->cur != &sentinel);
     1264        assert(wnd->cur && wnd->cur != &sentinel);
    12661265       
    12671266        *deleted_but_gc = false;
     
    12931292        bool *resizing)
    12941293{
    1295         ASSERT(cur && cur != &sentinel);
     1294        assert(cur && cur != &sentinel);
    12961295       
    12971296        /*
     
    13111310                }
    13121311        } else {
    1313                 STATIC_ASSERT(N_JOIN == N_JOIN_FOLLOWS);
     1312                static_assert(N_JOIN == N_JOIN_FOLLOWS, "");
    13141313               
    13151314                /* Keep the N_JOIN/N_JOIN_FOLLOWS mark but strip N_DELETED. */
     
    13301329        bool *resizing)
    13311330{
    1332         ASSERT(wnd->cur != &sentinel);
    1333         ASSERT(wnd->cur && (N_DELETED & get_mark(wnd->cur->link)));
     1331        assert(wnd->cur != &sentinel);
     1332        assert(wnd->cur && (N_DELETED & get_mark(wnd->cur->link)));
    13341333       
    13351334        cht_link_t *next = get_next(wnd->cur->link);
     
    13371336        if (walk_mode == WM_LEAVE_JOIN) {
    13381337                /* Never try to unlink join nodes. */
    1339                 ASSERT(!(N_JOIN & get_mark(wnd->cur->link)));
     1338                assert(!(N_JOIN & get_mark(wnd->cur->link)));
    13401339
    13411340                mark_t pred_mark = get_mark(*wnd->ppred);
     
    13491348                        return false;
    13501349        } else {
    1351                 ASSERT(walk_mode == WM_MOVE_JOIN_FOLLOWS || walk_mode == WM_NORMAL);
     1350                assert(walk_mode == WM_MOVE_JOIN_FOLLOWS || walk_mode == WM_NORMAL);
    13521351                /* Move the JF mark if set. Clear DEL mark. */
    13531352                mark_t cur_mark = N_JOIN_FOLLOWS & get_mark(wnd->cur->link);
     
    13991398        equal_pred_t pred, void *pred_arg, wnd_t *wnd, bool *resizing)
    14001399{
    1401         ASSERT(wnd->cur);
     1400        assert(wnd->cur);
    14021401       
    14031402        if (wnd->cur == &sentinel)
     
    14161415               
    14171416        while (cur_hash <= hash) {
    1418                 ASSERT(wnd->cur && wnd->cur != &sentinel);
     1417                assert(wnd->cur && wnd->cur != &sentinel);
    14191418               
    14201419                /* GC any deleted nodes on the way. */
     
    14371436        if (cur_hash == h->invalid_hash) {
    14381437                next_wnd(wnd);
    1439                 ASSERT(wnd->cur);
     1438                assert(wnd->cur);
    14401439                goto try_again;
    14411440        }
     
    14701469{
    14711470try_again:
    1472         ASSERT(wnd->cur);
     1471        assert(wnd->cur);
    14731472
    14741473        while (node_hash(h, wnd->cur) < hash) {
     
    14831482                }
    14841483               
    1485                 ASSERT(wnd->cur);
     1484                assert(wnd->cur);
    14861485        }
    14871486       
     
    14991498        bool *resizing)
    15001499{
    1501         ASSERT(N_DELETED & get_mark(wnd->cur->link));
     1500        assert(N_DELETED & get_mark(wnd->cur->link));
    15021501
    15031502        /* Skip deleted JOIN nodes. */
     
    15061505        } else {
    15071506                /* Ordinary deleted node or a deleted JOIN_FOLLOWS. */
    1508                 ASSERT(walk_mode != WM_LEAVE_JOIN
     1507                assert(walk_mode != WM_LEAVE_JOIN
    15091508                        || !((N_JOIN | N_JOIN_FOLLOWS) & get_mark(wnd->cur->link)));
    15101509
     
    15471546         * it
    15481547         */
    1549         ASSERT(h->b->order > h->new_b->order);
    1550         ASSERT(wnd->cur);
     1548        assert(h->b->order > h->new_b->order);
     1549        assert(wnd->cur);
    15511550       
    15521551        /* Either we did not need the joining link or we have already followed it.*/
     
    16211620                /* The hash belongs to the moved bucket. */
    16221621                if (move_dest_idx == new_idx) {
    1623                         ASSERT(pmoved_head == pnew_head);
     1622                        assert(pmoved_head == pnew_head);
    16241623                        /*
    16251624                         * move_head() makes the new head of the moved bucket visible.
    16261625                         * The new head may be marked with a JOIN_FOLLOWS
    16271626                         */
    1628                         ASSERT(!(N_CONST & get_mark(*pmoved_head)));
     1627                        assert(!(N_CONST & get_mark(*pmoved_head)));
    16291628                        *walk_mode = WM_MOVE_JOIN_FOLLOWS;
    16301629                } else {
    1631                         ASSERT(pmoved_head != pnew_head);
     1630                        assert(pmoved_head != pnew_head);
    16321631                        /*
    16331632                         * The hash belongs to the bucket that is the result of splitting
     
    16441643                                 * JOIN_FOLLOWS in this part of split bucket.
    16451644                                 */
    1646                                 ASSERT(N_NORMAL == get_mark(*pnew_head));
     1645                                assert(N_NORMAL == get_mark(*pnew_head));
    16471646                        }
    16481647                       
     
    16761675               
    16771676                /* move_head() or join_buckets() makes it so or makes the mark visible.*/
    1678                 ASSERT(N_INVALID == get_mark(*pold_head));
     1677                assert(N_INVALID == get_mark(*pold_head));
    16791678                /* move_head() makes it visible. No JOIN_FOLLOWS used when shrinking. */
    1680                 ASSERT(N_NORMAL == get_mark(*pnew_head));
     1679                assert(N_NORMAL == get_mark(*pnew_head));
    16811680
    16821681                *walk_mode = WM_LEAVE_JOIN;
     
    16861685                 * readers to notice that the old table had been replaced.
    16871686                 */
    1688                 ASSERT(b == h->new_b);
     1687                assert(b == h->new_b);
    16891688                *walk_mode = WM_NORMAL;
    16901689        }
     
    17131712{
    17141713        /* Head move has to in progress already when calling this func. */
    1715         ASSERT(N_CONST & get_mark(*psrc_head));
     1714        assert(N_CONST & get_mark(*psrc_head));
    17161715       
    17171716        /* Head already moved. */
     
    17261725        }
    17271726       
    1728         ASSERT(!(N_CONST & get_mark(*pdest_head)));
     1727        assert(!(N_CONST & get_mark(*pdest_head)));
    17291728}
    17301729
     
    17571756static void complete_head_move(marked_ptr_t *psrc_head, marked_ptr_t *pdest_head)
    17581757{
    1759         ASSERT(N_JOIN_FOLLOWS != get_mark(*psrc_head));
    1760         ASSERT(N_CONST & get_mark(*psrc_head));
     1758        assert(N_JOIN_FOLLOWS != get_mark(*psrc_head));
     1759        assert(N_CONST & get_mark(*psrc_head));
    17611760       
    17621761        cht_link_t *next = get_next(*psrc_head);
     
    17641763        DBG(marked_ptr_t ret = )
    17651764                cas_link(pdest_head, &sentinel, N_INVALID, next, N_NORMAL);
    1766         ASSERT(ret == make_link(&sentinel, N_INVALID) || (N_NORMAL == get_mark(ret)));
     1765        assert(ret == make_link(&sentinel, N_INVALID) || (N_NORMAL == get_mark(ret)));
    17671766        cas_order_barrier();
    17681767       
    17691768        DBG(ret = )
    17701769                cas_link(psrc_head, next, N_CONST, next, N_INVALID);   
    1771         ASSERT(ret == make_link(next, N_CONST) || (N_INVALID == get_mark(ret)));
     1770        assert(ret == make_link(next, N_CONST) || (N_INVALID == get_mark(ret)));
    17721771        cas_order_barrier();
    17731772}
     
    18621861        DBG(marked_ptr_t ret = )
    18631862                cas_link(pdest_head, &sentinel, N_INVALID, wnd.cur, N_NORMAL);
    1864         ASSERT(ret == make_link(&sentinel, N_INVALID) || (N_NORMAL == get_mark(ret)));
     1863        assert(ret == make_link(&sentinel, N_INVALID) || (N_NORMAL == get_mark(ret)));
    18651864        cas_order_barrier();
    18661865       
     
    19061905               
    19071906                /* Must not report that the table is resizing if WM_MOVE_JOIN_FOLLOWS.*/
    1908                 ASSERT(!resizing);
     1907                assert(!resizing);
    19091908                /*
    19101909                 * Mark the last node of the first half of the split bucket
     
    20432042        DBG(marked_ptr_t ret = )
    20442043                cas_link(psrc_head, join_node, N_CONST, join_node, N_INVALID);
    2045         ASSERT(ret == make_link(join_node, N_CONST) || (N_INVALID == get_mark(ret)));
     2044        assert(ret == make_link(join_node, N_CONST) || (N_INVALID == get_mark(ret)));
    20462045        cas_order_barrier();
    20472046       
     
    20742073                        continue;
    20752074
    2076                 ASSERT(!resizing);
     2075                assert(!resizing);
    20772076               
    20782077                if (wnd.cur != &sentinel) {
    20792078                        /* Must be from the new appended bucket. */
    2080                         ASSERT(split_hash <= node_hash(h, wnd.cur)
     2079                        assert(split_hash <= node_hash(h, wnd.cur)
    20812080                                || h->invalid_hash == node_hash(h, wnd.cur));
    20822081                        return;
     
    20972096static void free_later(cht_t *h, cht_link_t *item)
    20982097{
    2099         ASSERT(item != &sentinel);
     2098        assert(item != &sentinel);
    21002099       
    21012100        /*
     
    21572156       
    21582157#ifdef CONFIG_DEBUG
    2159         ASSERT(h->b);
     2158        assert(h->b);
    21602159        /* Make resize_reqs visible. */
    21612160        read_barrier();
    2162         ASSERT(0 < atomic_get(&h->resize_reqs));
     2161        assert(0 < atomic_get(&h->resize_reqs));
    21632162#endif
    21642163
     
    23372336                /* Set the invalid joinee head to NULL. */
    23382337                if (old_idx != move_src_idx) {
    2339                         ASSERT(N_INVALID == get_mark(h->b->head[old_idx]));
     2338                        assert(N_INVALID == get_mark(h->b->head[old_idx]));
    23402339                       
    23412340                        if (&sentinel != get_next(h->b->head[old_idx]))
     
    23932392        marked_ptr_t *new_head)
    23942393{
    2395         ASSERT(join_node != &sentinel);
    2396         ASSERT(join_node && (N_JOIN & get_mark(join_node->link)));
     2394        assert(join_node != &sentinel);
     2395        assert(join_node && (N_JOIN & get_mark(join_node->link)));
    23972396       
    23982397        bool done;
     
    24102409                /* Done if the mark was cleared. Retry if a new node was inserted. */
    24112410                done = (ret == jn_link);
    2412                 ASSERT(ret == jn_link || (get_mark(ret) & N_JOIN));
     2411                assert(ret == jn_link || (get_mark(ret) & N_JOIN));
    24132412        } while (!done);
    24142413       
     
    24332432                        join_node, &wnd, &resizing);
    24342433               
    2435                 ASSERT(!resizing);
     2434                assert(!resizing);
    24362435        } while (!done);
    24372436}
     
    24402439static void cleanup_join_follows(cht_t *h, marked_ptr_t *new_head)
    24412440{
    2442         ASSERT(new_head);
     2441        assert(new_head);
    24432442       
    24442443        rcu_read_lock();
     
    24652464                /* GC any deleted nodes on the way - even deleted JOIN_FOLLOWS. */
    24662465                if (N_DELETED & get_mark(*cur_link)) {
    2467                         ASSERT(cur_link != new_head);
    2468                         ASSERT(wnd.ppred && wnd.cur && wnd.cur != &sentinel);
    2469                         ASSERT(cur_link == &wnd.cur->link);
     2466                        assert(cur_link != new_head);
     2467                        assert(wnd.ppred && wnd.cur && wnd.cur != &sentinel);
     2468                        assert(cur_link == &wnd.cur->link);
    24702469
    24712470                        bool dummy;
     
    24852484                                        cas_link(cur_link, next, N_JOIN_FOLLOWS, &sentinel, N_NORMAL);
    24862485                               
    2487                                 ASSERT(next == &sentinel
     2486                                assert(next == &sentinel
    24882487                                        || ((N_JOIN | N_JOIN_FOLLOWS) & get_mark(ret)));
    24892488
     
    25062505
    25072506                /* We must encounter a JF node before we reach the end of the bucket. */
    2508                 ASSERT(wnd.cur && wnd.cur != &sentinel);
     2507                assert(wnd.cur && wnd.cur != &sentinel);
    25092508                cur_link = &wnd.cur->link;
    25102509        }
     
    25202519static inline size_t calc_split_hash(size_t split_idx, size_t order)
    25212520{
    2522         ASSERT(1 <= order && order <= 8 * sizeof(size_t));
     2521        assert(1 <= order && order <= 8 * sizeof(size_t));
    25232522        return split_idx << (8 * sizeof(size_t) - order);
    25242523}
     
    25272526static inline size_t calc_bucket_idx(size_t hash, size_t order)
    25282527{
    2529         ASSERT(1 <= order && order <= 8 * sizeof(size_t));
     2528        assert(1 <= order && order <= 8 * sizeof(size_t));
    25302529        return hash >> (8 * sizeof(size_t) - order);
    25312530}
     
    25592558static inline size_t node_hash(cht_t *h, const cht_link_t *item)
    25602559{
    2561         ASSERT(item->hash == h->invalid_hash
     2560        assert(item->hash == h->invalid_hash
    25622561                || item->hash == sentinel.hash
    25632562                || item->hash == calc_node_hash(h, item));
     
    25692568static inline size_t calc_node_hash(cht_t *h, const cht_link_t *item)
    25702569{
    2571         ASSERT(item != &sentinel);
     2570        assert(item != &sentinel);
    25722571        /*
    25732572         * Clear the lowest order bit in order for sentinel's node hash
     
    25882587        marked_ptr_t ptr = (marked_ptr_t) next;
    25892588       
    2590         ASSERT(!(ptr & N_MARK_MASK));
    2591         ASSERT(!((unsigned)mark & ~N_MARK_MASK));
     2589        assert(!(ptr & N_MARK_MASK));
     2590        assert(!((unsigned)mark & ~N_MARK_MASK));
    25922591       
    25932592        return ptr | mark;
     
    26092608static inline void next_wnd(wnd_t *wnd)
    26102609{
    2611         ASSERT(wnd);
    2612         ASSERT(wnd->cur);
     2610        assert(wnd);
     2611        assert(wnd->cur);
    26132612
    26142613        wnd->last = wnd->cur;
     
    26362635        marked_ptr_t new)
    26372636{
    2638         ASSERT(link != &sentinel.link);
     2637        assert(link != &sentinel.link);
    26392638        /*
    26402639         * cas(x) on the same location x on one cpu must be ordered, but do not
Note: See TracChangeset for help on using the changeset viewer.