Changes in / [61dd73d:f90d10f]


Ignore:
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/alarm.cfa

    r61dd73d rf90d10f  
    5151        this.alarm = alarm;
    5252        this.period = period;
    53         next = 0;
    5453        set = false;
    5554        kernel_alarm = false;
     
    6059        this.alarm = alarm;
    6160        this.period = period;
    62         next = 0;
    6361        set = false;
    6462        kernel_alarm = true;
     
    7169}
    7270
    73 #if !defined(NDEBUG) && (defined(__CFA_DEBUG__) || defined(__CFA_VERIFY__))
    74 bool validate( alarm_list_t * this ) {
    75         alarm_node_t ** it = &this->head;
    76         while( (*it) ) {
    77                 it = &(*it)->next;
     71void insert( alarm_list_t * this, alarm_node_t * n ) {
     72        alarm_node_t * it = & (*this)`first;
     73        while( it && (n->alarm > it->alarm) ) {
     74                it = & (*it)`next;
     75        }
     76        if ( it ) {
     77                insert_before( *it, *n );
     78        } else {
     79                insert_last(*this, *n);
    7880        }
    7981
    80         return it == this->tail;
    81 }
    82 #endif
    83 
    84 static inline void insert_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t p ) {
    85         verify( !n->next );
    86         if( p == this->tail ) {
    87                 this->tail = &n->next;
    88         }
    89         else {
    90                 n->next = *p;
    91         }
    92         *p = n;
    93 
    94         verify( validate( this ) );
    95 }
    96 
    97 void insert( alarm_list_t * this, alarm_node_t * n ) {
    98         alarm_node_t ** it = &this->head;
    99         while( (*it) && (n->alarm > (*it)->alarm) ) {
    100                 it = &(*it)->next;
    101         }
    102 
    103         insert_at( this, n, it );
    104 
    105         verify( validate( this ) );
     82        verify( validate( *this ) );
    10683}
    10784
    10885alarm_node_t * pop( alarm_list_t * this ) {
    109         alarm_node_t * head = this->head;
     86        verify( validate( *this ) );
     87        alarm_node_t * head = & (*this)`first;
    11088        if( head ) {
    111                 this->head = head->next;
    112                 if( !head->next ) {
    113                         this->tail = &this->head;
    114                 }
    115                 head->next = 0p;
     89                remove(*head);
    11690        }
    117         verify( validate( this ) );
     91        verify( validate( *this ) );
    11892        return head;
    11993}
    12094
    121 static inline void remove_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t it ) {
    122         verify( it );
    123         verify( (*it) == n );
    124 
    125         (*it) = n->next;
    126         if( !n-> next ) {
    127                 this->tail = it;
    128         }
    129         n->next = 0p;
    130 
    131         verify( validate( this ) );
    132 }
    133 
    134 static inline void remove( alarm_list_t * this, alarm_node_t * n ) {
    135         alarm_node_t ** it = &this->head;
    136         while( (*it) && (*it) != n ) {
    137                 it = &(*it)->next;
    138         }
    139 
    140         verify( validate( this ) );
    141 
    142         if( *it ) { remove_at( this, n, it ); }
    143 
    144         verify( validate( this ) );
    145 }
    146 
    14795void register_self( alarm_node_t * this ) {
    148         alarm_list_t * alarms = &event_kernel->alarms;
     96        alarm_list_t & alarms = event_kernel->alarms;
    14997
    15098        disable_interrupts();
     
    152100        {
    153101                verify( validate( alarms ) );
    154                 bool first = !alarms->head;
     102                bool first = ! & alarms`first;
    155103
    156                 insert( alarms, this );
     104                insert( &alarms, this );
    157105                if( first ) {
    158                         __kernel_set_timer( alarms->head->alarm - __kernel_get_time() );
     106                        __kernel_set_timer( alarms`first.alarm - __kernel_get_time() );
    159107                }
    160108        }
     
    168116        lock( event_kernel->lock __cfaabi_dbg_ctx2 );
    169117        {
    170                 verify( validate( &event_kernel->alarms ) );
    171                 remove( &event_kernel->alarms, this );
     118                verify( validate( event_kernel->alarms ) );
     119                remove( *this );
    172120        }
    173121        unlock( event_kernel->lock );
     
    187135
    188136        /* paranoid */ verify( !node.set );
    189         /* paranoid */ verify( node.next == 0p );
     137        /* paranoid */ verify( & node`next == 0p );
     138        /* paranoid */ verify( & node`prev == 0p );
    190139}
    191140
  • libcfa/src/concurrency/alarm.hfa

    r61dd73d rf90d10f  
    2323#include "time.hfa"
    2424
     25#include <containers/list.hfa>
     26
    2527struct $thread;
    2628struct processor;
     
    4042        Time alarm;                             // time when alarm goes off
    4143        Duration period;                        // if > 0 => period of alarm
    42         alarm_node_t * next;            // intrusive link list field
     44
     45        DLISTED_MGD_IMPL_IN(alarm_node_t)
    4346
    4447        union {
     
    5053        bool kernel_alarm       :1;             // true if this is not a user defined alarm
    5154};
    52 
    53 typedef alarm_node_t ** __alarm_it_t;
     55DLISTED_MGD_IMPL_OUT(alarm_node_t)
    5456
    5557void ?{}( alarm_node_t & this, $thread * thrd, Time alarm, Duration period );
     
    5759void ^?{}( alarm_node_t & this );
    5860
    59 struct alarm_list_t {
    60         alarm_node_t * head;
    61         __alarm_it_t tail;
    62 };
    63 
    64 static inline void ?{}( alarm_list_t & this ) with( this ) {
    65         head = 0;
    66         tail = &head;
    67 }
     61typedef dlist(alarm_node_t, alarm_node_t) alarm_list_t;
    6862
    6963void insert( alarm_list_t * this, alarm_node_t * n );
  • libcfa/src/concurrency/io.cfa

    r61dd73d rf90d10f  
    2020
    2121#if !defined(HAVE_LINUX_IO_URING_H)
    22         void __kernel_io_startup( cluster & ) {
     22        void __kernel_io_startup( cluster &, bool ) {
    2323                // Nothing to do without io_uring
    2424        }
    2525
    26         void __kernel_io_start_thrd( cluster & ) {
     26        void __kernel_io_finish_start( cluster & ) {
    2727                // Nothing to do without io_uring
    2828        }
    2929
    30         void __kernel_io_stop_thrd ( cluster & ) {
     30        void __kernel_io_prepare_stop( cluster & ) {
    3131                // Nothing to do without io_uring
    3232        }
    3333
    34         void __kernel_io_shutdown( cluster & ) {
     34        void __kernel_io_shutdown( cluster &, bool ) {
    3535                // Nothing to do without io_uring
    3636        }
     
    695695        extern int close(int fd);
    696696
    697         struct statx;
    698         extern int statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf);
    699 
    700697        extern ssize_t read (int fd, void *buf, size_t count);
    701698}
     
    907904
    908905                (*sqe){ IORING_OP_CLOSE, fd };
    909 
    910                 __submit_wait
    911         #endif
    912 }
    913 
    914 int cfa_statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf) {
    915         #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_STATX)
    916                 //return statx( dirfd, pathname, flags, mask, statxbuf );
    917                 return syscall( __NR_statx, dirfd, pathname, flags, mask, statxbuf );
    918         #else
    919                 __submit_prelude
    920 
    921                 (*sqe){ IORING_OP_STATX, dirfd };
    922                 sqe->addr = (uint64_t)pathname;
    923                 sqe->statx_flags = flags;
    924                 sqe->len = mask;
    925                 sqe->off = (uint64_t)statxbuf;
    926906
    927907                __submit_wait
     
    10401020                        return IS_DEFINED(IORING_OP_CLOSE);
    10411021
    1042                 if( /*func == (fptr_t)statx || */
    1043                         func == (fptr_t)cfa_statx )
    1044                         #define _CFA_IO_FEATURE_IORING_OP_STATX ,
    1045                         return IS_DEFINED(IORING_OP_STATX);
    1046 
    10471022                if( /*func == (fptr_t)read || */
    10481023                        func == (fptr_t)cfa_read )
  • libcfa/src/concurrency/preemption.cfa

    r61dd73d rf90d10f  
    8484// Get next expired node
    8585static inline alarm_node_t * get_expired( alarm_list_t * alarms, Time currtime ) {
    86         if( !alarms->head ) return 0p;                                          // If no alarms return null
    87         if( alarms->head->alarm >= currtime ) return 0p;        // If alarms head not expired return null
     86        if( ! & (*alarms)`first ) return 0p;                                            // If no alarms return null
     87        if( (*alarms)`first.alarm >= currtime ) return 0p;      // If alarms head not expired return null
    8888        return pop(alarms);                                                                     // Otherwise just pop head
    8989}
     
    120120
    121121        // If there are still alarms pending, reset the timer
    122         if( alarms->head ) {
     122        if( & (*alarms)`first ) {
    123123                __cfaabi_dbg_print_buffer_decl( " KERNEL: @%ju(%ju) resetting alarm to %ju.\n", currtime.tv, __kernel_get_time().tv, (alarms->head->alarm - currtime).tv);
    124                 Duration delta = alarms->head->alarm - currtime;
    125                 Duration caped = max(delta, 50`us);
     124                Duration delta = (*alarms)`first.alarm - currtime;
     125                Duration capped = max(delta, 50`us);
    126126                // itimerval tim  = { caped };
    127127                // __cfaabi_dbg_print_buffer_local( "    Values are %lu, %lu, %lu %lu.\n", delta.tv, caped.tv, tim.it_value.tv_sec, tim.it_value.tv_usec);
    128128
    129                 __kernel_set_timer( caped );
     129                __kernel_set_timer( capped );
    130130        }
    131131}
  • libcfa/src/containers/list.hfa

    r61dd73d rf90d10f  
    7171                // will collapse to single pointer with tag bit
    7272        };
    73         inline void ?{}( $mgd_link(tE) &this, tE* elem ) {
     73        static inline void ?{}( $mgd_link(tE) &this, tE* elem ) {
    7474                (this.elem){ elem };
    7575                (this.terminator){ 0p };
    7676                (this.is_terminator){ 0 };
    7777        }
    78         inline void ?{}( $mgd_link(tE) &this, void * terminator ) {
     78        static inline void ?{}( $mgd_link(tE) &this, void * terminator ) {
    7979                (this.elem){ 0p };
    8080                (this.terminator){ terminator };
     
    8282        }
    8383        forall ( otype tInit | { void ?{}( $mgd_link(tE) &, tInit); } )
    84         void ?=?( $mgd_link(tE) &this, tInit i ) {
     84        static inline void ?=?( $mgd_link(tE) &this, tInit i ) {
    8585                ^?{}( this );
    8686                ?{}( this, i );
     
    9393                $mgd_link(tE) prev;
    9494        };
    95         inline void ?{}( $dlinks(tE) &this ) {
     95        static inline void ?{}( $dlinks(tE) &this ) {
    9696                (this.next){ (tE *)0p };
    9797                (this.prev){ (tE *)0p };
     
    132132        // an empty dlist
    133133        // links refer to self, making a tight circle
    134         void ?{}( dlist(Tnode, Telem) & this ) {
     134        static inline void ?{}( dlist(Tnode, Telem) & this ) {
    135135                $mgd_link(Telem) selfRef = (void *) &this;
    136136                ( this.$links ) { selfRef, selfRef };
    137137        }
    138138
    139         Telem & ?`first( dlist(Tnode, Telem) &l ) {
     139        static inline Telem & ?`first( dlist(Tnode, Telem) &l ) {
    140140                return * l.$links.next.elem;
    141141        }
    142142
    143         Telem & ?`last( dlist(Tnode, Telem) &l ) {
     143        static inline Telem & ?`last( dlist(Tnode, Telem) &l ) {
    144144                return * l.$links.prev.elem;
    145145        }
     146
     147        #if !defined(NDEBUG) && (defined(__CFA_DEBUG__) || defined(__CFA_VERIFY__))
     148        static bool $validate_fwd( dlist(Tnode, Telem) & this ) {
     149                Tnode * it = & $tempcv_e2n( this`first );
     150                if (!it) return (& this`last == 0p);
     151
     152                while( $next_link(*it).elem ) {
     153                        it = & $tempcv_e2n( * $next_link(*it).elem );
     154                }
     155
     156                return ( it == & $tempcv_e2n( this`last ) ) &&
     157                           ( $next_link(*it).is_terminator ) &&
     158                           ( ((dlist(Tnode, Telem)*)$next_link(*it).terminator) == &this );
     159        }
     160        static bool $validate_rev( dlist(Tnode, Telem) & this ) {
     161                Tnode * it = & $tempcv_e2n( this`last );
     162                if (!it) return (& this`first == 0p);
     163
     164                while( $prev_link(*it).elem ) {
     165                        it = & $tempcv_e2n( * $prev_link(*it).elem );
     166                }
     167
     168                return ( it == & $tempcv_e2n( this`first ) ) &&
     169                           ( $prev_link(*it).is_terminator ) &&
     170                           ( ((dlist(Tnode, Telem)*)$prev_link(*it).terminator) == &this );
     171        }
     172        static bool validate( dlist(Tnode, Telem) & this ) {
     173                return $validate_fwd(this) && $validate_rev(this);
     174        }
     175        #endif
    146176
    147177        static inline void insert_after(Tnode &list_pos, Telem &to_insert) {
     
    152182                assert($next_link(singleton_to_insert).elem == 0p);
    153183                $prev_link(singleton_to_insert) = & $tempcv_n2e(list_pos);
    154                 $next_link(singleton_to_insert) = $next_link(list_pos).elem;
     184                $next_link(singleton_to_insert) = $next_link(list_pos);
    155185                if ($next_link(list_pos).is_terminator) {
    156186                        dlist(Tnode, Telem) *list = $next_link(list_pos).terminator;
     
    175205                assert($next_link(singleton_to_insert).elem == 0p);
    176206                $next_link(singleton_to_insert) = & $tempcv_n2e(list_pos);
    177                 $prev_link(singleton_to_insert) = $prev_link(list_pos).elem;
     207                $prev_link(singleton_to_insert) = $prev_link(list_pos);
    178208                if ($prev_link(list_pos).is_terminator) {
    179209                        dlist(Tnode, Telem) *list = $prev_link(list_pos).terminator;
  • tests/list/dlist-insert-remove.cfa

    r61dd73d rf90d10f  
    258258        dlist(fred_in_mine, fred) lf;
    259259
     260        verify(validate(lf));
     261
    260262        printMyFreddies(f1, f2, 1);     // 3.14; 3.14; 0.5; 0.5
    261263        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
     
    264266        insert_first(lf, f1);
    265267
     268        verify(validate(lf));
     269
    266270        printMyFreddies(f1, f2, 0);     // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    267271        printYourFreddies(f1, f2, 0);   // 3.14; 3.14; 0.5; 0.5 (unmodified)
     
    275279        dlist(fred_in_yours, fred) lf;
    276280
     281        verify(validate(lf));
     282
    277283        printMyFreddies(f1, f2, 1);     // 3.14; 3.14; 0.5; 0.5
    278284        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
     
    281287        insert_first(lf, f1);
    282288
     289        verify(validate(lf));
     290
    283291        printMyFreddies(f1, f2, 0);     // 3.14; 3.14; 0.5; 0.5 (unmodified)
    284292        printYourFreddies(f1, f2, 0);   // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    292300        dlist(mary, mary) lm;
    293301
     302        verify(validate(lm));
    294303        printMariatheotokos(m1, m2, 1); // 3.14; 3.14; 0.5; 0.5
    295304
     
    298307
    299308        printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     309        verify(validate(lm));
    300310}
    301311
     
    317327        dlist(fred_in_mine, fred) lf;
    318328
     329        verify(validate(lf));
     330
    319331        printMyFreddies(f1, f2, 1);     // 3.14; 3.14; 0.5; 0.5
    320332        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
     
    323335        insert_last(lf, f2);
    324336
     337        verify(validate(lf));
     338
    325339        printMyFreddies(f1, f2, 0);     // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    326340        printYourFreddies(f1, f2, 0);   // 3.14; 3.14; 0.5; 0.5 (unmodified)
     
    334348        dlist(fred_in_yours, fred) lf;
    335349
     350        verify(validate(lf));
     351
    336352        printMyFreddies(f1, f2, 1);     // 3.14; 3.14; 0.5; 0.5
    337353        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
     
    340356        insert_last(lf, f2);
    341357
     358        verify(validate(lf));
     359
    342360        printMyFreddies(f1, f2, 0);     // 3.14; 3.14; 0.5; 0.5 (unmodified)
    343361        printYourFreddies(f1, f2, 0);   // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    351369        dlist(mary, mary) lm;
    352370
     371        verify(validate(lm));
    353372        printMariatheotokos(m1, m2, 1); // 3.14; 3.14; 0.5; 0.5
    354373
     
    356375        insert_last(lm, m2);
    357376
     377        verify(validate(lm));
    358378        printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    359379}
     
    384404        assert(& lf`last == & f1);
    385405
     406        verify(validate(lf));
     407
    386408        insert_after(f1`in_mine, f2);
     409
     410        verify(validate(lf));
    387411
    388412        printMyFreddies(f1, f2, 0);     // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    408432        assert(& lf`last == & f1);
    409433
     434        verify(validate(lf));
     435
    410436        insert_after(f1`in_yours, f2);
     437
     438        verify(validate(lf));
    411439
    412440        printMyFreddies(f1, f2, 0);     // 3.14; 3.14; 0.5; 0.5 (unmodified)
     
    432460        assert(& lm`last == & m1);
    433461
     462        verify(validate(lm));
     463
    434464        insert_after(m1, m2);
     465
     466        verify(validate(lm));
    435467
    436468        printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    465497        assert(& lf`last == & f2);
    466498
     499        verify(validate(lf));
     500
    467501        insert_before(f2`in_mine, f1);
     502
     503        verify(validate(lf));
    468504
    469505        printMyFreddies(f1, f2, 0);     // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    489525        assert(& lf`last == & f2);
    490526
     527        verify(validate(lf));
     528
    491529        insert_before(f2`in_yours, f1);
     530
     531        verify(validate(lf));
    492532
    493533        printMyFreddies(f1, f2, 0);     // 3.14; 3.14; 0.5; 0.5 (unmodified)
     
    513553        assert(& lm`last == & m2);
    514554
     555        verify(validate(lm));
     556
    515557        insert_before(m2, m1);
     558
     559        verify(validate(lm));
    516560
    517561        printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    822866        printYourFreddies(fly`first, fly`last, 1);   // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    823867
     868        verify(validate(fly));
     869        verify(validate(flm));
     870
    824871        remove(f1`in_mine);
     872
     873        verify(validate(fly));
     874        verify(validate(flm));
    825875
    826876        printMyFreddies(flm`first, flm`last, 0);     // 2.7, 3.7;       2.7;  3.7;  3.7, 2.7      (modified)
     
    854904        printYourFreddies(fly`first, fly`last, 1);   // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    855905
     906        verify(validate(fly));
     907        verify(validate(flm));
     908
    856909        remove(f1`in_yours);
     910
     911        verify(validate(fly));
     912        verify(validate(flm));
    857913
    858914        printMyFreddies(flm`first, flm`last, 0);     // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7 (unmodified)
     
    880936        printMariatheotokos(ml`first, ml`last, 1);     // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    881937
     938        verify(validate(ml));
     939
    882940        remove(m1);
     941
     942        verify(validate(ml));
    883943
    884944        printMariatheotokos(ml`first, ml`last, 0);     // 2.7, 3.7;       2.7;  3.7;  3.7, 2.7      (modified)
     
    921981        printYourFreddies(fly`first, fly`last, 1);   // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    922982
     983        verify(validate(fly));
     984        verify(validate(flm));
     985
    923986        remove(f3`in_mine);
     987
     988        verify(validate(fly));
     989        verify(validate(flm));
    924990
    925991        printMyFreddies(flm`first, flm`last, 0);     // 1.7, 2.7;       1.7;  2.7;  2.7, 1.7      (modified)
     
    9531019        printYourFreddies(fly`first, fly`last, 1);   // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    9541020
     1021        verify(validate(fly));
     1022        verify(validate(flm));
     1023
    9551024        remove(f3`in_yours);
     1025
     1026        verify(validate(fly));
     1027        verify(validate(flm));
    9561028
    9571029        printMyFreddies(flm`first, flm`last, 0);     // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7 (unmodified)
     
    9791051        printMariatheotokos(ml`first, ml`last, 1);     // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    9801052
     1053        verify(validate(ml));
     1054
    9811055        remove(m3);
     1056
     1057        verify(validate(ml));
    9821058
    9831059        printMariatheotokos(ml`first, ml`last, 0);     // 1.7, 2.7;       1.7;  2.7;  2.7, 1.7      (modified)
     
    10141090        printYourFreddies(fly`first, fly`last, 1);   // 0.7; 0.7; 0.7; 0.7
    10151091
     1092        verify(validate(fly));
     1093        verify(validate(flm));
     1094
    10161095        remove(f`in_mine);
     1096
     1097        verify(validate(fly));
     1098        verify(validate(flm));
    10171099
    10181100        assert(& flm`first == 0p);
     
    10291111
    10301112        insert_last(flm, f);
     1113        verify(validate(fly));
     1114        verify(validate(flm));
    10311115        printMyFreddies(flm`first, flm`last, 0);     // 0.7; 0.7; 0.7; 0.7
    10321116}
     
    10451129        printYourFreddies(fly`first, fly`last, 1);   // 0.7; 0.7; 0.7; 0.7
    10461130
     1131        verify(validate(fly));
     1132        verify(validate(flm));
     1133
    10471134        remove(f`in_yours);
     1135
     1136        verify(validate(fly));
     1137        verify(validate(flm));
    10481138
    10491139        assert(& fly`first == 0p);
     
    10601150
    10611151        insert_last(fly, f);
     1152        verify(validate(fly));
     1153        verify(validate(flm));
    10621154        printYourFreddies(fly`first, fly`last, 0);     // 0.7; 0.7; 0.7; 0.7
    10631155}
     
    10721164        printMariatheotokos(ml`first, ml`last, 1);     // 0.7; 0.7; 0.7; 0.7
    10731165
     1166        verify(validate(ml));
     1167
    10741168        remove(m);
     1169
     1170        verify(validate(ml));
    10751171
    10761172        assert(& ml`first == 0p);
     
    10851181
    10861182        insert_last(ml, m);
     1183        verify(validate(ml));
    10871184        printMariatheotokos(ml`first, ml`last, 0);     // 0.7; 0.7; 0.7; 0.7
    10881185}
Note: See TracChangeset for help on using the changeset viewer.