📄 select.c
字号:
CYG_TEST_INFO( "Thread1: serstate 0"); if( FD_ISSET( ser0, &rd_res ) ) { CYG_TEST_INFO( "Thread1: calling read(ser0)"); done = read( ser0, sbuf2, TEST_BUFSIZE); if( done != TEST_BUFSIZE ) SHOW_RESULT( read, done ); CYG_TEST_CHECK( done == TEST_BUFSIZE, "read() returned bad size"); for( i = 0; i < TEST_BUFSIZE; i++ ) if( sbuf1[i] != sbuf2[i] ) diag_printf("buf1[%d](%02x) != buf2[%d](%02x)\n",i,sbuf1[i],i,sbuf2[i]); FD_CLR( ser0, &rd ); FD_SET( ser0, &wr ); serstate++; } break; case 1: CYG_TEST_INFO( "Thread1: serstate 1"); if( FD_ISSET( ser0, &wr_res ) ) { CYG_TEST_INFO( "Thread1: calling write(ser0)"); done = write( ser0, sbuf2, TEST_BUFSIZE); if( done != TEST_BUFSIZE ) SHOW_RESULT( write, done ); CYG_TEST_CHECK( done == TEST_BUFSIZE, "write() returned bad size"); FD_CLR( ser0, &wr ); serstate++; serdone = 1; CYG_TEST_INFO( "Thread1: serdone"); } else FD_SET( ser0, &wr ); break; }#endif }#ifdef TEST_NET CYG_TEST_INFO( "Thread1: calling close(fd)"); err = close(fd); if( err < 0 ) SHOW_RESULT( close, err ); CYG_TEST_CHECK( err == 0, "close() returned error"); if( fd2 >= 0 ) { CYG_TEST_INFO( "Thread1: calling close(fd2)"); err = close(fd2); if( err < 0 ) SHOW_RESULT( close, err ); CYG_TEST_CHECK( err == 0, "close() returned error"); }#endif#ifdef TEST_DEV CYG_TEST_INFO( "Thread1: calling close(ser0)"); err = close(ser0); if( err < 0 ) SHOW_RESULT( close, err ); CYG_TEST_CHECK( err == 0, "close() returned error"); #endif CYG_TEST_INFO( "Thread1: calling pthread_exit()"); pthread_exit( arg );}//--------------------------------------------------------------------------void *pthread_entry2( void *arg){#ifdef TEST_NET int fd; int netstate = 0;#endif #ifdef TEST_DEV int ser1; int serstate = 0;#endif #if defined(TEST_DEV) || defined(TEST_NET) int i; ssize_t done;#endif int netdone = 0; int serdone = 0; int err; fd_set rd, wr; CYG_TEST_INFO( "Thread 2 running" ); FD_ZERO( &rd ); FD_ZERO( &wr );#ifdef TEST_NET CYG_TEST_INFO( "Thread2: calling socket()"); fd = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if( fd < 0 ) SHOW_RESULT( socket, fd ); CYG_TEST_CHECK( fd >= 0, "socket() returned error"); CYG_TEST_INFO( "Thread2: calling connect()"); err = connect( fd, (struct sockaddr *)&sa, sizeof(sa)); if( err < 0 ) SHOW_RESULT( connect, err ); CYG_TEST_CHECK( err == 0, "connect() returned error"); FD_SET( fd, &rd );#else netdone = 1;#endif#ifdef TEST_DEV for( i = 0; i < TEST_BUFSIZE; i++ ) sbuf1[i] = i; CYG_TEST_INFO( "Thread2: calling open(/dev/ser1)"); ser1 = open("/dev/ser1", O_RDWR ); if( ser1 < 0 ) SHOW_RESULT( open, ser1 ); CYG_TEST_CHECK( ser1 >= 0, "open(/dev/ser1) returned error"); CYG_TEST_INFO( "Thread2: calling write(ser1)"); done = write( ser1, sbuf1, TEST_BUFSIZE); if( done != TEST_BUFSIZE ) SHOW_RESULT( write, done ); CYG_TEST_CHECK( done == TEST_BUFSIZE, "write() returned bad size"); FD_SET( ser1, &wr ); #else serdone = 1;#endif while(!(netdone && serdone)) { fd_set rd_res = rd; fd_set wr_res = wr; CYG_TEST_INFO( "Thread2: calling select()"); show_fdsets( "Thread2 request: ", 8, &rd_res, &wr_res, NULL ); err = select( 8, &rd_res, &wr_res, NULL, NULL ); if( err < 0 ) SHOW_RESULT( select, err ); CYG_TEST_CHECK( err >= 0, "select() returned error"); show_fdsets( "Thread2 result: ", 8, &rd_res, &wr_res, NULL ); #ifdef TEST_NET switch( netstate ) { case 0: CYG_TEST_INFO( "Thread2: netstate 0"); if( FD_ISSET( fd, &rd_res ) ) { CYG_TEST_INFO( "Thread2: calling read()"); done = read( fd, buf2, TEST_BUFSIZE); if( done != TEST_BUFSIZE ) SHOW_RESULT( read, done ); CYG_TEST_CHECK( done == TEST_BUFSIZE, "read() returned bad size"); for( i = 0; i < TEST_BUFSIZE; i++ ) if( buf1[i] != buf2[i] ) diag_printf("buf1[%d](%02x) != buf2[%d](%02x)\n",i,buf1[i],i,buf2[i]); netstate++; FD_CLR( fd, &rd ); FD_SET( fd, &wr ); } break; case 1: CYG_TEST_INFO( "Thread2: netstate 1"); if( FD_ISSET( fd, &wr_res ) ) { CYG_TEST_INFO( "Thread2: calling write()"); done = write( fd, buf2, TEST_BUFSIZE); if( done != TEST_BUFSIZE ) SHOW_RESULT( write, done ); CYG_TEST_CHECK( done == TEST_BUFSIZE, "write() returned bad size"); FD_CLR( fd, &wr ); netstate++; netdone = 1; CYG_TEST_INFO( "Thread2: netdone"); } break; }#endif#ifdef TEST_DEV switch( serstate ) { case 0: CYG_TEST_INFO( "Thread2: serstate 0"); if( FD_ISSET( ser1, &wr_res ) ) { FD_CLR( ser1, &wr ); FD_SET( ser1, &rd ); serstate++; } break; case 1: CYG_TEST_INFO( "Thread2: serstate 1"); if( FD_ISSET( ser1, &rd_res ) ) { CYG_TEST_INFO( "Thread2: calling read(ser1)"); done = read( ser1, sbuf3, TEST_BUFSIZE); if( done != TEST_BUFSIZE ) SHOW_RESULT( read, done ); CYG_TEST_CHECK( done == TEST_BUFSIZE, "read() returned bad size"); for( i = 0; i < TEST_BUFSIZE; i++ ) if( sbuf1[i] != sbuf3[i] ) diag_printf("sbuf1[%d](%02x) != sbuf3[%d](%02x)\n",i,sbuf1[i],i,sbuf3[i]); FD_CLR( ser1, &rd ); serstate++; serdone = 1; CYG_TEST_INFO( "Thread2: serdone"); } break; }#endif }#ifdef TEST_NET CYG_TEST_INFO( "Thread2: calling close(fd)"); err = close(fd); if( err < 0 ) SHOW_RESULT( close, err ); CYG_TEST_CHECK( err == 0, "close() returned error"); #endif#ifdef TEST_DEV CYG_TEST_INFO( "Thread2: calling close(ser1)"); err = close(ser1); if( err < 0 ) SHOW_RESULT( close, err ); CYG_TEST_CHECK( err == 0, "close(ser1) returned error"); #endif CYG_TEST_INFO( "Thread2: calling pthread_exit()"); pthread_exit( arg );}//==========================================================================// mainint main( int argc, char **argv ){ void *retval; pthread_attr_t attr; struct sched_param schedparam; CYG_TEST_INIT();#ifdef TEST_NET sa.sin_family = AF_INET; sa.sin_len = sizeof(sa); inet_aton("127.0.0.1", &sa.sin_addr); sa.sin_port = htons(1234); init_all_network_interfaces();#endif // Create test threads { pthread_attr_init( &attr ); schedparam.sched_priority = 10; pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED ); pthread_attr_setschedpolicy( &attr, SCHED_RR ); pthread_attr_setschedparam( &attr, &schedparam ); pthread_attr_setstackaddr( &attr, (void *)&thread1_stack[sizeof(thread1_stack)] ); pthread_attr_setstacksize( &attr, sizeof(thread1_stack) ); pthread_create( &thread1, &attr, pthread_entry1, (void *)0x12345671); } { pthread_attr_init( &attr ); schedparam.sched_priority = 5; pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED ); pthread_attr_setschedpolicy( &attr, SCHED_RR ); pthread_attr_setschedparam( &attr, &schedparam ); pthread_attr_setstackaddr( &attr, (void *)&thread2_stack[sizeof(thread2_stack)] ); pthread_attr_setstacksize( &attr, sizeof(thread2_stack) ); pthread_create( &thread2, &attr, pthread_entry2, (void *)0x12345672); } // Now join with thread1 CYG_TEST_INFO( "Main: calling pthread_join(thread1)"); pthread_join( thread1, &retval ); // And thread 2 CYG_TEST_INFO( "Main: calling pthread_join(thread2)"); pthread_join( thread2, &retval ); CYG_TEST_PASS_FINISH("select");}#else//==========================================================================// mainvoid cyg_start(void){ CYG_TEST_INIT(); CYG_TEST_NA(NA_MSG);}#endif// -------------------------------------------------------------------------// EOF socket.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -