- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel.cfa (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.cfa
rd3605f8 r6ddef36 27 27 extern "C" { 28 28 #include <sys/eventfd.h> 29 #include <sys/uio.h>30 29 } 31 30 … … 126 125 static void __wake_one(cluster * cltr); 127 126 128 static void idle_sleep(processor * proc, io_future_t & future, iovec & iov);127 static void idle_sleep(processor * proc, io_future_t & future, char buf[]); 129 128 static bool mark_idle (__cluster_proc_list & idles, processor & proc); 130 129 static void mark_awake(__cluster_proc_list & idles, processor & proc); … … 132 131 extern void __cfa_io_start( processor * ); 133 132 extern bool __cfa_io_drain( processor * ); 134 extern bool __cfa_io_flush( processor *, int min_comp);133 extern bool __cfa_io_flush( processor *, bool wait ); 135 134 extern void __cfa_io_stop ( processor * ); 136 135 static inline bool __maybe_io_drain( processor * ); 137 136 138 #if defined( CFA_WITH_IO_URING_IDLE)139 extern bool __kernel_read(processor * proc, io_future_t & future, iovec &, int fd);137 #if defined(IO_URING_IDLE) && defined(CFA_HAVE_LINUX_IO_URING_H) 138 extern bool __kernel_read(processor * proc, io_future_t & future, char buf[], int fd); 140 139 #endif 141 140 … … 172 171 io_future_t future; // used for idle sleep when io_uring is present 173 172 future.self.ptr = 1p; // mark it as already fulfilled so we know if there is a pending request or not 174 eventfd_t idle_val; 175 iovec idle_iovec = { &idle_val, sizeof(idle_val) }; 173 char buf[sizeof(uint64_t)]; 176 174 177 175 __cfa_io_start( this ); … … 208 206 209 207 if( !readyThread ) { 210 __cfa_io_flush( this, 0);208 __cfa_io_flush( this, false ); 211 209 212 210 readyThread = __next_thread_slow( this->cltr ); … … 239 237 } 240 238 241 idle_sleep( this, future, idle_iovec);239 idle_sleep( this, future, buf ); 242 240 243 241 // We were woken up, remove self from idle … … 260 258 261 259 if(this->io.pending && !this->io.dirty) { 262 __cfa_io_flush( this, 0);260 __cfa_io_flush( this, false ); 263 261 } 264 262 … … 276 274 277 275 // If we can't find a thread, might as well flush any outstanding I/O 278 if(this->io.pending) { __cfa_io_flush( this, 0); }276 if(this->io.pending) { __cfa_io_flush( this, false ); } 279 277 280 278 // Spin a little on I/O, just in case … … 371 369 372 370 if(this->io.pending && !this->io.dirty) { 373 __cfa_io_flush( this, 0);371 __cfa_io_flush( this, false ); 374 372 } 375 373 … … 381 379 382 380 __cfadbg_print_safe(runtime_core, "Kernel : core %p stopping\n", this); 383 }384 385 for(int i = 0; !available(future); i++) {386 if(i > 1000) __cfaabi_dbg_write( "ERROR: kernel has bin spinning on a flush after exit loop.\n", 60);387 __cfa_io_flush( this, 1 );388 381 } 389 382 … … 786 779 } 787 780 788 static void idle_sleep(processor * this, io_future_t & future, iovec & iov) {789 #if !defined( CFA_WITH_IO_URING_IDLE)781 static void idle_sleep(processor * this, io_future_t & future, char buf[]) { 782 #if !defined(IO_URING_IDLE) || !defined(CFA_HAVE_LINUX_IO_URING_H) 790 783 #if !defined(__CFA_NO_STATISTICS__) 791 784 if(this->print_halts) { … … 820 813 #endif 821 814 #else 815 #if !defined(CFA_HAVE_IORING_OP_READ) 816 #error this is only implemented if the read is present 817 #endif 822 818 // Do we already have a pending read 823 819 if(available(future)) { … … 825 821 reset(future); 826 822 827 __kernel_read(this, future, iov, this->idle_fd );828 } 829 830 __cfa_io_flush( this, 1);823 __kernel_read(this, future, buf, this->idle_fd ); 824 } 825 826 __cfa_io_flush( this, true ); 831 827 #endif 832 828 }
Note:
See TracChangeset
for help on using the changeset viewer.