@@ -128,35 +128,36 @@ namespace nodepp { class kernel_t {
128128
129129 ulong tasks= obj->ev_queue .size () + obj->probe .get ();
130130 ulong TIME = get_timeout ();
131- ulong time = TIME==0 || tasks==0 ? 1 : TIME;
132131
133132 if (!obj->kv_queue .empty () && tasks==0 ){
134133 if ( obj.count ()==1 ){ return nullptr ; }}
134+ if ( obj->kv_queue .empty () && tasks==0 ){
135+ if ( obj.count ()> 1 ){ return nullptr ; }}
135136
136137 ptr_t <ETIMER> ts ( 0UL , ETIMER () );
137138
138- ts->tv_sec = time / 1000 ;
139- ts->tv_nsec = (time % 1000 ) * 1000000 ;
139+ ts->tv_sec = TIME / 1000 ;
140+ ts->tv_nsec = (TIME % 1000 ) * 1000000 ;
140141
141142 return ts; }
142143
143144 int get_delay_ms () const noexcept {
144145 ulong tasks= obj->ev_queue .size () + obj->probe .get ();
145- ulong TIME = get_timeout ();
146146 if (!obj->kv_queue .empty () && tasks==0 ){
147147 if ( obj.count ()==1 ){ return -1 ; }}
148- return TIME; }
148+ if ( obj->kv_queue .empty () && tasks==0 ){
149+ if ( obj.count ()> 1 ){ return -1 ; }}
150+ return get_timeout (); }
149151
150152protected:
151153
152154 struct NODE {
153- int pd, ed, idx; bool pl=true ;
155+ ulong /* --*/ timeout; int pd, ed, idx; bool pl=true ;
156+ uchar batch= NODEPP_MAX_BATCH_SIZE;
154157 loop_t /* ------*/ ev_queue;
155158 queue_t <kevent_t > kv_queue;
156159 probe_t /* -----*/ probe;
157- uchar batch = NODEPP_MAX_BATCH_SIZE;
158160 ptr_t <EPOLLFD> ev;
159- ulong /* --*/ timeout;
160161 }; ptr_t <NODE> obj;
161162
162163public:
@@ -210,7 +211,7 @@ namespace nodepp { class kernel_t {
210211 /* ─······································································─*/
211212
212213 template < class T , class U , class ... W >
213- ptr_t <task_t > poll_add ( T& inp, int flag, U cb, ulong timeout=0 , const W&... args ) noexcept {
214+ ptr_t <task_t > poll_add ( T& inp, int flag, U cb, ulong timeout=0 , const W&... args ) const noexcept {
214215 if ( cb ( args... )==-1 ){ return nullptr ; }
215216
216217 kevent_t kv;
@@ -229,8 +230,6 @@ namespace nodepp { class kernel_t {
229230 task->sign = &obj;
230231
231232 if ( task->addr ==nullptr ){ if ( is_std ( kv.fd ) ){
232-
233- auto clb = type::bind ( cb );
234233
235234 return loop_add ( coroutine::add ( COROUTINE (){
236235 coBegin;
@@ -246,7 +245,7 @@ namespace nodepp { class kernel_t {
246245 return task; }
247246
248247 template < class ... T >
249- ptr_t <task_t > loop_add ( const T&... args ) noexcept {
248+ ptr_t <task_t > loop_add ( const T&... args ) const noexcept {
250249 return obj->ev_queue .add ( args... );
251250 }
252251
@@ -296,10 +295,8 @@ namespace nodepp { class kernel_t {
296295 if ( obj->pl ){ obj->idx =epoll_pwait2 ( obj->pd , &obj->ev , obj->ev .size (),&get_delay_tm (), nullptr ); }
297296 if ( obj->idx ==-1 && errno==ENOSYS ) { obj->pl = false ; }
298297 if (!obj->pl ){ obj->idx =epoll_wait ( obj->pd , &obj->ev , obj->ev .size (), get_delay_ms () ); }
299- if ( obj->idx <= 0 ){ return 1 ; }
300298 #else
301299 /* ----------*/ obj->idx =epoll_wait ( obj->pd , &obj->ev , obj->ev .size (), get_delay_ms () );
302- if ( obj->idx <= 0 ){ return 1 ; }
303300 #endif
304301
305302 /* EXCECUTION */
@@ -409,7 +406,7 @@ namespace nodepp { class kernel_t {
409406 EV_SET ( &event, fd, fl, EV_DELETE, 0 , 0 , NULL );
410407 kevent ( obj->pd , &event, 1 , NULL , 0 , NULL );
411408
412- obj->kv_queue .erase (kv); return 0 ; }
409+ obj->kv_queue .erase (kv); return 1 ; }
413410
414411 /* ─······································································─*/
415412
@@ -450,8 +447,10 @@ namespace nodepp { class kernel_t {
450447 ulong TIME = get_timeout ();
451448
452449 if (!obj->kv_queue .empty () && tasks==0 ){
453- if ( obj.count ()==1 ){ return nullptr ; }}
454-
450+ if ( obj.count ()==1 ){ return nullptr ; }}
451+ if ( obj->kv_queue .empty () && tasks==0 ){
452+ if ( obj.count ()> 1 ){ return nullptr ; }}
453+
455454 ptr_t <KTIMER> ts ( 0UL , KTIMER () );
456455
457456 ts->tv_sec = TIME / 1000 ;
@@ -461,26 +460,28 @@ namespace nodepp { class kernel_t {
461460
462461 int get_delay_ms () const noexcept {
463462 ulong tasks= obj->ev_queue .size () + obj->probe .get ();
464- ulong TIME = get_timeout ();
465463 if (!obj->kv_queue .empty () && tasks==0 ){
466- if ( obj.count ()==1 ){ return -1 ; }}
467- return TIME; }
464+ if ( obj.count ()==1 ){ return -1 ; }}
465+ if ( obj->kv_queue .empty () && tasks==0 ){
466+ if ( obj.count ()> 1 ){ return -1 ; }}
467+ return get_timeout (); }
468468
469469protected:
470470
471471 struct NODE {
472- ulong /* --*/ timeout; int pd, idx;
472+ ulong /* --*/ timeout; int pd, idx ;
473+ uchar batch= NODEPP_MAX_BATCH_SIZE;
473474 loop_t /* ------*/ ev_queue;
474475 queue_t <kevent_t > kv_queue;
475476 probe_t /* -----*/ probe;
476- uchar batch = NODEPP_MAX_BATCH_SIZE;
477477 ptr_t <KPOLLFD> ev;
478478 }; ptr_t <NODE> obj;
479479
480480public:
481481
482482 ~kernel_t () noexcept {
483- if ( obj.count () > 1 ){ return ; } close ( obj->pd );
483+ if ( obj.count () > 1 ){ return ; }
484+ close ( obj->pd ); /* ----------*/
484485 }
485486
486487 kernel_t () : obj( new NODE() ) {
@@ -524,7 +525,7 @@ namespace nodepp { class kernel_t {
524525 /* ─······································································─*/
525526
526527 template < class T , class U , class ... W >
527- ptr_t <task_t > poll_add ( T& inp, int flag, U cb, ulong timeout=0 , const W&... args ) noexcept {
528+ ptr_t <task_t > poll_add ( T& inp, int flag, U cb, ulong timeout=0 , const W&... args ) const noexcept {
528529 if ( cb ( args... )==-1 ){ return nullptr ; }
529530
530531 kevent_t kv;
@@ -558,7 +559,7 @@ namespace nodepp { class kernel_t {
558559 return task; }
559560
560561 template < class ... T >
561- ptr_t <task_t > loop_add ( const T&... args ) noexcept {
562+ ptr_t <task_t > loop_add ( const T&... args ) const noexcept {
562563 return obj->ev_queue .add ( args... );
563564 }
564565
@@ -608,7 +609,6 @@ namespace nodepp { class kernel_t {
608609
609610 /* IO DETECTION */
610611 obj->idx =kevent ( obj->pd , NULL , 0 , &obj->ev , obj->ev .size (), &get_delay_tm () );
611- if ( obj->idx <= 0 ){ return 1 ; }
612612
613613 /* EXCECUTION */
614614 while ( obj->idx > 0 ){ obj->idx --; auto x = obj->ev [ obj->idx ];
@@ -685,8 +685,7 @@ namespace nodepp { class kernel_t {
685685
686686 int get_delay_ms () const noexcept {
687687 ulong tasks= obj->ev_queue .size () + obj->probe .get ();
688- ulong TIME = get_timeout ();
689- return ( tasks==0 ) ? 100 : TIME; }
688+ return ( tasks==0 ) ? 100 : get_timeout (); }
690689
691690protected:
692691
@@ -727,7 +726,7 @@ namespace nodepp { class kernel_t {
727726 /* ─······································································─*/
728727
729728 template < class T , class U , class ... W >
730- ptr_t <task_t > poll_add ( T str, int /* unused*/ , U cb, ulong timeout=0 , const W&... args ) noexcept {
729+ ptr_t <task_t > poll_add ( T str, int /* unused*/ , U cb, ulong timeout=0 , const W&... args ) const noexcept {
731730
732731 auto time = type::bind ( timeout>0 ? timeout + process::now () : timeout );
733732 auto clb = type::bind ( cb );
@@ -746,7 +745,7 @@ namespace nodepp { class kernel_t {
746745 }
747746
748747 template < class T , class ... V >
749- ptr_t <task_t > loop_add ( T cb, const V&... args ) noexcept {
748+ ptr_t <task_t > loop_add ( T cb, const V&... args ) const noexcept {
750749 return obj->ev_queue .add ( cb, args... );
751750 }
752751
0 commit comments