Changes in / [f90d10f:61dd73d]


Ignore:
Files:
6 edited

Legend:

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

    rf90d10f r61dd73d  
    5151        this.alarm = alarm;
    5252        this.period = period;
     53        next = 0;
    5354        set = false;
    5455        kernel_alarm = false;
     
    5960        this.alarm = alarm;
    6061        this.period = period;
     62        next = 0;
    6163        set = false;
    6264        kernel_alarm = true;
     
    6971}
    7072
    71 void 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);
     73#if !defined(NDEBUG) && (defined(__CFA_DEBUG__) || defined(__CFA_VERIFY__))
     74bool validate( alarm_list_t * this ) {
     75        alarm_node_t ** it = &this->head;
     76        while( (*it) ) {
     77                it = &(*it)->next;
    8078        }
    8179
    82         verify( validate( *this ) );
     80        return it == this->tail;
     81}
     82#endif
     83
     84static 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
     97void 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 ) );
    83106}
    84107
    85108alarm_node_t * pop( alarm_list_t * this ) {
    86         verify( validate( *this ) );
    87         alarm_node_t * head = & (*this)`first;
     109        alarm_node_t * head = this->head;
    88110        if( head ) {
    89                 remove(*head);
     111                this->head = head->next;
     112                if( !head->next ) {
     113                        this->tail = &this->head;
     114                }
     115                head->next = 0p;
    90116        }
    91         verify( validate( *this ) );
     117        verify( validate( this ) );
    92118        return head;
    93119}
    94120
     121static 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
     134static 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
    95147void register_self( alarm_node_t * this ) {
    96         alarm_list_t & alarms = event_kernel->alarms;
     148        alarm_list_t * alarms = &event_kernel->alarms;
    97149
    98150        disable_interrupts();
     
    100152        {
    101153                verify( validate( alarms ) );
    102                 bool first = ! & alarms`first;
     154                bool first = !alarms->head;
    103155
    104                 insert( &alarms, this );
     156                insert( alarms, this );
    105157                if( first ) {
    106                         __kernel_set_timer( alarms`first.alarm - __kernel_get_time() );
     158                        __kernel_set_timer( alarms->head->alarm - __kernel_get_time() );
    107159                }
    108160        }
     
    116168        lock( event_kernel->lock __cfaabi_dbg_ctx2 );
    117169        {
    118                 verify( validate( event_kernel->alarms ) );
    119                 remove( *this );
     170                verify( validate( &event_kernel->alarms ) );
     171                remove( &event_kernel->alarms, this );
    120172        }
    121173        unlock( event_kernel->lock );
     
    135187
    136188        /* paranoid */ verify( !node.set );
    137         /* paranoid */ verify( & node`next == 0p );
    138         /* paranoid */ verify( & node`prev == 0p );
     189        /* paranoid */ verify( node.next == 0p );
    139190}
    140191
  • libcfa/src/concurrency/alarm.hfa

    rf90d10f r61dd73d  
    2323#include "time.hfa"
    2424
    25 #include <containers/list.hfa>
    26 
    2725struct $thread;
    2826struct processor;
     
    4240        Time alarm;                             // time when alarm goes off
    4341        Duration period;                        // if > 0 => period of alarm
    44 
    45         DLISTED_MGD_IMPL_IN(alarm_node_t)
     42        alarm_node_t * next;            // intrusive link list field
    4643
    4744        union {
     
    5350        bool kernel_alarm       :1;             // true if this is not a user defined alarm
    5451};
    55 DLISTED_MGD_IMPL_OUT(alarm_node_t)
     52
     53typedef alarm_node_t ** __alarm_it_t;
    5654
    5755void ?{}( alarm_node_t & this, $thread * thrd, Time alarm, Duration period );
     
    5957void ^?{}( alarm_node_t & this );
    6058
    61 typedef dlist(alarm_node_t, alarm_node_t) alarm_list_t;
     59struct alarm_list_t {
     60        alarm_node_t * head;
     61        __alarm_it_t tail;
     62};
     63
     64static inline void ?{}( alarm_list_t & this ) with( this ) {
     65        head = 0;
     66        tail = &head;
     67}
    6268
    6369void insert( alarm_list_t * this, alarm_node_t * n );
  • libcfa/src/concurrency/io.cfa

    rf90d10f r61dd73d  
    2020
    2121#if !defined(HAVE_LINUX_IO_URING_H)
    22         void __kernel_io_startup( cluster &, bool ) {
     22        void __kernel_io_startup( cluster & ) {
    2323                // Nothing to do without io_uring
    2424        }
    2525
    26         void __kernel_io_finish_start( cluster & ) {
     26        void __kernel_io_start_thrd( cluster & ) {
    2727                // Nothing to do without io_uring
    2828        }
    2929
    30         void __kernel_io_prepare_stop( cluster & ) {
     30        void __kernel_io_stop_thrd ( cluster & ) {
    3131                // Nothing to do without io_uring
    3232        }
    3333
    34         void __kernel_io_shutdown( cluster &, bool ) {
     34        void __kernel_io_shutdown( cluster & ) {
    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
    697700        extern ssize_t read (int fd, void *buf, size_t count);
    698701}
     
    904907
    905908                (*sqe){ IORING_OP_CLOSE, fd };
     909
     910                __submit_wait
     911        #endif
     912}
     913
     914int 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;
    906926
    907927                __submit_wait
     
    10201040                        return IS_DEFINED(IORING_OP_CLOSE);
    10211041
     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
    10221047                if( /*func == (fptr_t)read || */
    10231048                        func == (fptr_t)cfa_read )
  • libcfa/src/concurrency/preemption.cfa

    rf90d10f r61dd73d  
    8484// Get next expired node
    8585static inline alarm_node_t * get_expired( alarm_list_t * alarms, Time currtime ) {
    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
     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
    8888        return pop(alarms);                                                                     // Otherwise just pop head
    8989}
     
    120120
    121121        // If there are still alarms pending, reset the timer
    122         if( & (*alarms)`first ) {
     122        if( alarms->head ) {
    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)`first.alarm - currtime;
    125                 Duration capped = max(delta, 50`us);
     124                Duration delta = alarms->head->alarm - currtime;
     125                Duration caped = 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( capped );
     129                __kernel_set_timer( caped );
    130130        }
    131131}
  • libcfa/src/containers/list.hfa

    rf90d10f r61dd73d  
    7171                // will collapse to single pointer with tag bit
    7272        };
    73         static inline void ?{}( $mgd_link(tE) &this, tE* elem ) {
     73        inline void ?{}( $mgd_link(tE) &this, tE* elem ) {
    7474                (this.elem){ elem };
    7575                (this.terminator){ 0p };
    7676                (this.is_terminator){ 0 };
    7777        }
    78         static inline void ?{}( $mgd_link(tE) &this, void * terminator ) {
     78        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         static inline void ?=?( $mgd_link(tE) &this, tInit i ) {
     84        void ?=?( $mgd_link(tE) &this, tInit i ) {
    8585                ^?{}( this );
    8686                ?{}( this, i );
     
    9393                $mgd_link(tE) prev;
    9494        };
    95         static inline void ?{}( $dlinks(tE) &this ) {
     95        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         static inline void ?{}( dlist(Tnode, Telem) & this ) {
     134        void ?{}( dlist(Tnode, Telem) & this ) {
    135135                $mgd_link(Telem) selfRef = (void *) &this;
    136136                ( this.$links ) { selfRef, selfRef };
    137137        }
    138138
    139         static inline Telem & ?`first( dlist(Tnode, Telem) &l ) {
     139        Telem & ?`first( dlist(Tnode, Telem) &l ) {
    140140                return * l.$links.next.elem;
    141141        }
    142142
    143         static inline Telem & ?`last( dlist(Tnode, Telem) &l ) {
     143        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
    176146
    177147        static inline void insert_after(Tnode &list_pos, Telem &to_insert) {
     
    182152                assert($next_link(singleton_to_insert).elem == 0p);
    183153                $prev_link(singleton_to_insert) = & $tempcv_n2e(list_pos);
    184                 $next_link(singleton_to_insert) = $next_link(list_pos);
     154                $next_link(singleton_to_insert) = $next_link(list_pos).elem;
    185155                if ($next_link(list_pos).is_terminator) {
    186156                        dlist(Tnode, Telem) *list = $next_link(list_pos).terminator;
     
    205175                assert($next_link(singleton_to_insert).elem == 0p);
    206176                $next_link(singleton_to_insert) = & $tempcv_n2e(list_pos);
    207                 $prev_link(singleton_to_insert) = $prev_link(list_pos);
     177                $prev_link(singleton_to_insert) = $prev_link(list_pos).elem;
    208178                if ($prev_link(list_pos).is_terminator) {
    209179                        dlist(Tnode, Telem) *list = $prev_link(list_pos).terminator;
  • tests/list/dlist-insert-remove.cfa

    rf90d10f r61dd73d  
    258258        dlist(fred_in_mine, fred) lf;
    259259
    260         verify(validate(lf));
    261 
    262260        printMyFreddies(f1, f2, 1);     // 3.14; 3.14; 0.5; 0.5
    263261        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
     
    266264        insert_first(lf, f1);
    267265
    268         verify(validate(lf));
    269 
    270266        printMyFreddies(f1, f2, 0);     // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    271267        printYourFreddies(f1, f2, 0);   // 3.14; 3.14; 0.5; 0.5 (unmodified)
     
    279275        dlist(fred_in_yours, fred) lf;
    280276
    281         verify(validate(lf));
    282 
    283277        printMyFreddies(f1, f2, 1);     // 3.14; 3.14; 0.5; 0.5
    284278        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
     
    287281        insert_first(lf, f1);
    288282
    289         verify(validate(lf));
    290 
    291283        printMyFreddies(f1, f2, 0);     // 3.14; 3.14; 0.5; 0.5 (unmodified)
    292284        printYourFreddies(f1, f2, 0);   // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    300292        dlist(mary, mary) lm;
    301293
    302         verify(validate(lm));
    303294        printMariatheotokos(m1, m2, 1); // 3.14; 3.14; 0.5; 0.5
    304295
     
    307298
    308299        printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    309         verify(validate(lm));
    310300}
    311301
     
    327317        dlist(fred_in_mine, fred) lf;
    328318
    329         verify(validate(lf));
    330 
    331319        printMyFreddies(f1, f2, 1);     // 3.14; 3.14; 0.5; 0.5
    332320        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
     
    335323        insert_last(lf, f2);
    336324
    337         verify(validate(lf));
    338 
    339325        printMyFreddies(f1, f2, 0);     // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    340326        printYourFreddies(f1, f2, 0);   // 3.14; 3.14; 0.5; 0.5 (unmodified)
     
    348334        dlist(fred_in_yours, fred) lf;
    349335
    350         verify(validate(lf));
    351 
    352336        printMyFreddies(f1, f2, 1);     // 3.14; 3.14; 0.5; 0.5
    353337        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
     
    356340        insert_last(lf, f2);
    357341
    358         verify(validate(lf));
    359 
    360342        printMyFreddies(f1, f2, 0);     // 3.14; 3.14; 0.5; 0.5 (unmodified)
    361343        printYourFreddies(f1, f2, 0);   // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    369351        dlist(mary, mary) lm;
    370352
    371         verify(validate(lm));
    372353        printMariatheotokos(m1, m2, 1); // 3.14; 3.14; 0.5; 0.5
    373354
     
    375356        insert_last(lm, m2);
    376357
    377         verify(validate(lm));
    378358        printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    379359}
     
    404384        assert(& lf`last == & f1);
    405385
    406         verify(validate(lf));
    407 
    408386        insert_after(f1`in_mine, f2);
    409 
    410         verify(validate(lf));
    411387
    412388        printMyFreddies(f1, f2, 0);     // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    432408        assert(& lf`last == & f1);
    433409
    434         verify(validate(lf));
    435 
    436410        insert_after(f1`in_yours, f2);
    437 
    438         verify(validate(lf));
    439411
    440412        printMyFreddies(f1, f2, 0);     // 3.14; 3.14; 0.5; 0.5 (unmodified)
     
    460432        assert(& lm`last == & m1);
    461433
    462         verify(validate(lm));
    463 
    464434        insert_after(m1, m2);
    465 
    466         verify(validate(lm));
    467435
    468436        printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    497465        assert(& lf`last == & f2);
    498466
    499         verify(validate(lf));
    500 
    501467        insert_before(f2`in_mine, f1);
    502 
    503         verify(validate(lf));
    504468
    505469        printMyFreddies(f1, f2, 0);     // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    525489        assert(& lf`last == & f2);
    526490
    527         verify(validate(lf));
    528 
    529491        insert_before(f2`in_yours, f1);
    530 
    531         verify(validate(lf));
    532492
    533493        printMyFreddies(f1, f2, 0);     // 3.14; 3.14; 0.5; 0.5 (unmodified)
     
    553513        assert(& lm`last == & m2);
    554514
    555         verify(validate(lm));
    556 
    557515        insert_before(m2, m1);
    558 
    559         verify(validate(lm));
    560516
    561517        printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    866822        printYourFreddies(fly`first, fly`last, 1);   // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    867823
    868         verify(validate(fly));
    869         verify(validate(flm));
    870 
    871824        remove(f1`in_mine);
    872 
    873         verify(validate(fly));
    874         verify(validate(flm));
    875825
    876826        printMyFreddies(flm`first, flm`last, 0);     // 2.7, 3.7;       2.7;  3.7;  3.7, 2.7      (modified)
     
    904854        printYourFreddies(fly`first, fly`last, 1);   // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    905855
    906         verify(validate(fly));
    907         verify(validate(flm));
    908 
    909856        remove(f1`in_yours);
    910 
    911         verify(validate(fly));
    912         verify(validate(flm));
    913857
    914858        printMyFreddies(flm`first, flm`last, 0);     // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7 (unmodified)
     
    936880        printMariatheotokos(ml`first, ml`last, 1);     // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    937881
    938         verify(validate(ml));
    939 
    940882        remove(m1);
    941 
    942         verify(validate(ml));
    943883
    944884        printMariatheotokos(ml`first, ml`last, 0);     // 2.7, 3.7;       2.7;  3.7;  3.7, 2.7      (modified)
     
    981921        printYourFreddies(fly`first, fly`last, 1);   // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    982922
    983         verify(validate(fly));
    984         verify(validate(flm));
    985 
    986923        remove(f3`in_mine);
    987 
    988         verify(validate(fly));
    989         verify(validate(flm));
    990924
    991925        printMyFreddies(flm`first, flm`last, 0);     // 1.7, 2.7;       1.7;  2.7;  2.7, 1.7      (modified)
     
    1019953        printYourFreddies(fly`first, fly`last, 1);   // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    1020954
    1021         verify(validate(fly));
    1022         verify(validate(flm));
    1023 
    1024955        remove(f3`in_yours);
    1025 
    1026         verify(validate(fly));
    1027         verify(validate(flm));
    1028956
    1029957        printMyFreddies(flm`first, flm`last, 0);     // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7 (unmodified)
     
    1051979        printMariatheotokos(ml`first, ml`last, 1);     // 1.7, 2.7, 3.7;  1.7;  3.7;  3.7, 2.7, 1.7
    1052980
    1053         verify(validate(ml));
    1054 
    1055981        remove(m3);
    1056 
    1057         verify(validate(ml));
    1058982
    1059983        printMariatheotokos(ml`first, ml`last, 0);     // 1.7, 2.7;       1.7;  2.7;  2.7, 1.7      (modified)
     
    10901014        printYourFreddies(fly`first, fly`last, 1);   // 0.7; 0.7; 0.7; 0.7
    10911015
    1092         verify(validate(fly));
    1093         verify(validate(flm));
    1094 
    10951016        remove(f`in_mine);
    1096 
    1097         verify(validate(fly));
    1098         verify(validate(flm));
    10991017
    11001018        assert(& flm`first == 0p);
     
    11111029
    11121030        insert_last(flm, f);
    1113         verify(validate(fly));
    1114         verify(validate(flm));
    11151031        printMyFreddies(flm`first, flm`last, 0);     // 0.7; 0.7; 0.7; 0.7
    11161032}
     
    11291045        printYourFreddies(fly`first, fly`last, 1);   // 0.7; 0.7; 0.7; 0.7
    11301046
    1131         verify(validate(fly));
    1132         verify(validate(flm));
    1133 
    11341047        remove(f`in_yours);
    1135 
    1136         verify(validate(fly));
    1137         verify(validate(flm));
    11381048
    11391049        assert(& fly`first == 0p);
     
    11501060
    11511061        insert_last(fly, f);
    1152         verify(validate(fly));
    1153         verify(validate(flm));
    11541062        printYourFreddies(fly`first, fly`last, 0);     // 0.7; 0.7; 0.7; 0.7
    11551063}
     
    11641072        printMariatheotokos(ml`first, ml`last, 1);     // 0.7; 0.7; 0.7; 0.7
    11651073
    1166         verify(validate(ml));
    1167 
    11681074        remove(m);
    1169 
    1170         verify(validate(ml));
    11711075
    11721076        assert(& ml`first == 0p);
     
    11811085
    11821086        insert_last(ml, m);
    1183         verify(validate(ml));
    11841087        printMariatheotokos(ml`first, ml`last, 0);     // 0.7; 0.7; 0.7; 0.7
    11851088}
Note: See TracChangeset for help on using the changeset viewer.