Changeset 7b84d3e
- Timestamp:
- Oct 23, 2023, 11:58:10 AM (14 months ago)
- Branches:
- master
- Children:
- edc4813
- Parents:
- 2ad5e1d5 (diff), abb04a4 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/collections/string.cfa
r2ad5e1d5 r7b84d3e 10 10 // Created On : Fri Sep 03 11:00:00 2021 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Sep 2 12:05:57202313 // Update Count : 20 612 // Last Modified On : Wed Oct 18 21:52:09 2023 13 // Update Count : 208 14 14 // 15 15 … … 138 138 139 139 void ?|?( ifstream & in, _Istream_Sstr f ) { 140 (ifstream &)(in | f); ends( in );140 (ifstream &)(in | f); 141 141 } 142 142 -
libcfa/src/collections/string_res.cfa
r2ad5e1d5 r7b84d3e 10 10 // Created On : Fri Sep 03 11:00:00 2021 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Aug 14 18:06:01202313 // Update Count : 1 212 // Last Modified On : Wed Oct 18 21:54:54 2023 13 // Update Count : 15 14 14 // 15 15 … … 253 253 254 254 void ?|?( ifstream & in, string_res & this ) { 255 (ifstream &)(in | this); ends( in );255 (ifstream &)(in | this); 256 256 } 257 257 … … 297 297 298 298 void ?|?( ifstream & in, _Istream_Rstr f ) { 299 (ifstream &)(in | f); ends( in );299 (ifstream &)(in | f); 300 300 } 301 301 -
libcfa/src/fstream.cfa
r2ad5e1d5 r7b84d3e 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Aug 18 10:41:17202313 // Update Count : 54 112 // Last Modified On : Wed Oct 18 22:05:54 2023 13 // Update Count : 549 14 14 // 15 15 … … 230 230 void nlOff( ifstream & os ) { os.nlOnOff$ = false; } 231 231 232 void ends( ifstream & is ) {}233 234 232 bool eof( ifstream & is ) { return feof( (FILE *)(is.file$) ) != 0; } 235 233 … … 311 309 } // if 312 310 va_end( args ); 311 // if ( len == 0 ) throw ExceptionInst( missing_data ); 313 312 return len; 314 313 } // fmt -
libcfa/src/fstream.hfa
r2ad5e1d5 r7b84d3e 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Aug 18 10:41:15202313 // Update Count : 2 5812 // Last Modified On : Wed Oct 18 20:30:12 2023 13 // Update Count : 261 14 14 // 15 15 … … 117 117 void nlOn( ifstream & ); 118 118 void nlOff( ifstream & ); 119 void ends( ifstream & );120 119 int fmt( ifstream &, const char format[], ... ) __attribute__(( format(scanf, 2, 3) )); 120 ifstream & ungetc( ifstream & is, char c ); 121 bool eof( ifstream & is ); 121 122 122 123 bool fail( ifstream & is ); 123 124 void clear( ifstream & ); 124 bool eof( ifstream & is );125 125 void open( ifstream & is, const char name[], const char mode[] ); // FIX ME: use default = "r" 126 126 void open( ifstream & is, const char name[] ); 127 127 void close( ifstream & is ); 128 129 128 ifstream & read( ifstream & is, char data[], size_t size ); 130 ifstream & ungetc( ifstream & is, char c );131 129 132 130 void ?{}( ifstream & is ); -
libcfa/src/iostream.cfa
r2ad5e1d5 r7b84d3e 1 2 1 // 3 2 // Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo … … 11 10 // Created On : Wed May 27 17:56:53 2015 12 11 // Last Modified By : Peter A. Buhr 13 // Last Modified On : Sun Oct 8 12:10:21202314 // Update Count : 1 56412 // Last Modified On : Thu Oct 19 21:10:10 2023 13 // Update Count : 1801 15 14 // 16 15 … … 785 784 return is; 786 785 } // ?|? 787 ISTYPE_VOID_IMPL( bool & )788 786 789 787 istype & ?|?( istype & is, char & c ) { … … 797 795 return is; 798 796 } // ?|? 799 ISTYPE_VOID_IMPL( char & )800 797 801 798 istype & ?|?( istype & is, signed char & sc ) { … … 803 800 return is; 804 801 } // ?|? 805 ISTYPE_VOID_IMPL( signed char & )806 802 807 803 istype & ?|?( istype & is, unsigned char & usc ) { … … 809 805 return is; 810 806 } // ?|? 811 ISTYPE_VOID_IMPL( unsigned char & )812 807 813 808 istype & ?|?( istype & is, short int & si ) { … … 815 810 return is; 816 811 } // ?|? 817 ISTYPE_VOID_IMPL( short int & )818 812 819 813 istype & ?|?( istype & is, unsigned short int & usi ) { … … 821 815 return is; 822 816 } // ?|? 823 ISTYPE_VOID_IMPL( unsigned short int & )824 817 825 818 istype & ?|?( istype & is, int & i ) { … … 827 820 return is; 828 821 } // ?|? 829 ISTYPE_VOID_IMPL( int & )830 822 831 823 istype & ?|?( istype & is, unsigned int & ui ) { … … 833 825 return is; 834 826 } // ?|? 835 ISTYPE_VOID_IMPL( unsigned int & )836 827 837 828 istype & ?|?( istype & is, long int & li ) { … … 839 830 return is; 840 831 } // ?|? 841 ISTYPE_VOID_IMPL( long int & )842 832 843 833 istype & ?|?( istype & is, unsigned long int & ulli ) { … … 845 835 return is; 846 836 } // ?|? 847 ISTYPE_VOID_IMPL( unsigned long int & )848 837 849 838 istype & ?|?( istype & is, long long int & lli ) { … … 851 840 return is; 852 841 } // ?|? 853 ISTYPE_VOID_IMPL( long long int & )854 842 855 843 istype & ?|?( istype & is, unsigned long long int & ulli ) { … … 857 845 return is; 858 846 } // ?|? 859 ISTYPE_VOID_IMPL( unsigned long long int & )860 847 861 848 #if defined( __SIZEOF_INT128__ ) … … 863 850 return (istype &)(is | (unsigned int128 &)llli); 864 851 } // ?|? 865 ISTYPE_VOID_IMPL( int128 & )866 852 867 853 istype & ?|?( istype & is, unsigned int128 & ullli ) { … … 880 866 return is; 881 867 } // ?|? 882 ISTYPE_VOID_IMPL( unsigned int128 & )883 868 #endif // __SIZEOF_INT128__ 884 869 … … 887 872 return is; 888 873 } // ?|? 889 ISTYPE_VOID_IMPL( float & )890 874 891 875 istype & ?|?( istype & is, double & d ) { … … 893 877 return is; 894 878 } // ?|? 895 ISTYPE_VOID_IMPL( double & )896 879 897 880 istype & ?|?( istype & is, long double & ld ) { … … 899 882 return is; 900 883 } // ?|? 901 ISTYPE_VOID_IMPL( long double & )902 884 903 885 istype & ?|?( istype & is, float _Complex & fc ) { … … 907 889 return is; 908 890 } // ?|? 909 ISTYPE_VOID_IMPL( float _Complex & )910 891 911 892 istype & ?|?( istype & is, double _Complex & dc ) { … … 915 896 return is; 916 897 } // ?|? 917 ISTYPE_VOID_IMPL( double _Complex & )918 898 919 899 istype & ?|?( istype & is, long double _Complex & ldc ) { … … 923 903 return is; 924 904 } // ?|? 925 ISTYPE_VOID_IMPL( long double _Complex & )926 905 927 906 istype & ?|?( istype & is, const char fmt[] ) { … … 929 908 return is; 930 909 } // ?|? 931 ISTYPE_VOID_IMPL( const char * )932 910 933 911 // manipulators … … 937 915 938 916 void ?|?( istype & is, istype & (* manip)( istype & ) ) { 939 manip( is ); ends( is );917 manip( is ); 940 918 } // ?|? 941 919 … … 966 944 char fmtstr[ sizeof("%*[]") + nscanset ]; 967 945 int pos = 0; 968 fmtstr[pos] = '%'; pos += 1; 969 fmtstr[pos] = '*'; pos += 1; 970 fmtstr[pos] = '['; pos += 1; 946 strcpy( &fmtstr[pos], "%*[" ); pos += 3; 971 947 strcpy( &fmtstr[pos], f.scanset ); pos += nscanset; 972 fmtstr[pos] = ']'; pos += 1; 973 fmtstr[pos] = '\0'; 974 fmt( is, fmtstr, (void*)0 ); // last arg is dummy: suppress gcc warning 975 } 976 else for ( f.wd ) fmt( is, "%*c" ); 948 strcpy( &fmtstr[pos], "]" ); 949 fmt( is, fmtstr, "" ); // skip scanset 950 } else { 951 char ch; 952 // fprintf( stderr, "skip " ); 953 for ( f.wd ) { // skip N characters 954 if ( eof( is ) ) break; 955 fmt( is, "%c", &ch ); 956 // fprintf( stderr, "`%c' ", ch ); 957 } // for 958 } // if 977 959 return is; 978 960 } 979 ISTYPE_VOID_IMPL( _Istream_Cskip )980 961 981 962 istype & ?|?( istype & is, _Istream_Cstr f ) { 982 const char * scanset = f.scanset; 963 const char * scanset; 964 size_t nscanset = 0; 983 965 if ( f.flags.delimiter ) scanset = f.delimiter; // getline ? 984 985 size_t len = 0; 986 if ( scanset ) len = strlen( scanset ); 987 char fmtstr[len + 16]; 988 int start = 1; 966 else scanset = f.scanset; 967 if ( scanset ) nscanset = strlen( scanset ); 968 969 char fmtstr[nscanset + 32]; // storage for scanset and format codes 989 970 fmtstr[0] = '%'; 990 if ( f.flags.ignore ) { fmtstr[1] = '*'; start += 1; } 991 // no maximum width necessary because text ignored => width is read width 992 if ( f.wd != -1 ) { 971 972 int pos = 1; 973 int args; 974 bool check = true; 975 976 if ( f.flags.ignore ) { check = false; fmtstr[1] = '*'; pos += 1; } 977 int rwd = f.wd; 978 if ( f.wd != -1 ) { // => just ignore versus ignore with width 993 979 // wd is buffer bytes available (for input chars + null terminator) 994 980 // rwd is count of input chars 995 int rwd; 996 if (f.flags.rwd) { 997 verify (f.wd >= 0); 998 rwd = f.wd; 981 // no maximum width necessary because text ignored => width is read width 982 if ( f.flags.rwd ) check = false; 983 else rwd = f.wd - 1; 984 pos += sprintf( &fmtstr[pos], "%d", rwd ); 985 } // if 986 987 if ( ! scanset ) { // %s, %*s, %ws, %*ws 988 // fprintf( stderr, "cstr %s\n", f.s ); 989 strcpy( &fmtstr[pos], "s%n" ); 990 int len = 0; // may not be set in fmt 991 if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*' 992 else args = fmt( is, fmtstr, f.s, &len ); 993 // fprintf( stderr, "cstr %s %d %d %d %s\n", fmtstr, args, len, f.wd, f.s ); 994 if ( check && len >= rwd && ! eof( is ) ) { // might not fit 995 char peek; 996 fmt( is, "%c", &peek ); // check for whitespace terminator 997 // fprintf( stderr, "peek %d '%c'\n", args, peek ); 998 if ( ! eof( is ) ) { 999 ungetc( is, peek ); 1000 if ( ! isspace( peek ) ) throw ExceptionInst( cstring_length ); 1001 } // if 1002 } // if 1003 } else { 1004 if ( f.flags.delimiter ) { // getline 1005 // fprintf( stderr, "getline\n" ); 1006 sprintf( &fmtstr[pos], "[%s%s]%%n", f.flags.inex ? "^" : "", scanset ); 1007 // fprintf( stderr, "getline %s %d\n", fmtstr, f.wd ); 1008 int len = 0; // may not be set in fmt 1009 if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*' 1010 else args = fmt( is, fmtstr, f.s, &len ); 1011 // fprintf( stderr, "getline %s %d %d %d\n", fmtstr, args, f.wd, eof( is ) ); 1012 if ( check && len == rwd && ! eof( is ) ) { // might not fit 1013 char peek; 1014 fmt( is, "%c", &peek ); // check for delimiter 1015 // fprintf( stderr, "peek %d '%c'\n", args, peek ); 1016 if ( ! eof( is ) ) { 1017 if ( peek != f.delimiter[0] ) { 1018 ungetc( is, peek ); 1019 throw ExceptionInst( cstring_length ); 1020 } // if 1021 } // if 1022 } else fmt( is, "%*c" ); // remove delimiter 999 1023 } else { 1000 verify (f.wd >= 1); 1001 rwd = f.wd - 1; 1024 // incl %[xxx], %*[xxx], %w[xxx], %*w[xxx] 1025 // excl %[^xxx], %*[^xxx], %w[^xxx], %*w[^xxx] 1026 sprintf( &fmtstr[pos], "[%s%s]%%n", f.flags.inex ? "^" : "", scanset ); 1027 // fprintf( stderr, "incl/excl %s %d\n", fmtstr, f.wd ); 1028 int len = 0; // may not be set in fmt 1029 if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*' 1030 else args = fmt( is, fmtstr, f.s, &len ); 1031 // fprintf( stderr, "incl/excl %s \"%s\" %d %d %d %d %d %c\n", fmtstr, f.s, args, f.wd, len, eof( is ), check, f.s[f.wd] ); 1032 if ( check && len == rwd && ! eof( is ) ) { // might not fit 1033 // fprintf( stderr, "overflow\n" ); 1034 char peek; 1035 fmt( is, "%c", &peek ); // check for whitespace terminator 1036 // fprintf( stderr, "peek %d '%c'\n", args, peek ); 1037 if ( ! eof( is ) ) { 1038 ungetc( is, peek ); 1039 if ( f.flags.inex ^ strchr( f.scanset, peek ) != 0p ) throw ExceptionInst( cstring_length ); 1040 } // if 1041 } // if 1002 1042 } // if 1003 start += sprintf( &fmtstr[start], "%d", rwd ); 1004 } 1005 1006 if ( ! scanset ) { 1007 // %s, %*s, %ws, %*ws 1008 fmtstr[start] = 's'; fmtstr[start + 1] = '\0'; 1009 // printf( "cstr %s\n", fmtstr ); 1010 } else { 1011 // incl %[xxx], %*[xxx], %w[xxx], %*w[xxx] 1012 // excl %[^xxx], %*[^xxx], %w[^xxx], %*w[^xxx] 1013 fmtstr[start] = '['; start += 1; 1014 if ( f.flags.inex ) { fmtstr[start] = '^'; start += 1; } 1015 strcpy( &fmtstr[start], scanset ); // copy includes '\0' 1016 len += start; 1017 fmtstr[len] = ']'; fmtstr[len + 1] = '\0'; 1018 // printf( "incl/excl %s\n", fmtstr ); 1019 } // if 1020 1021 int check = f.wd - 2; 1022 if (! f.flags.ignore ) { 1023 if ( ! f.flags.rwd ) f.s[check] = '\0'; // insert sentinel 1024 } 1025 len = fmt( is, fmtstr, f.s ); 1026 //fprintf( stderr, "KK %s %zd %d %c %s\n", fmtstr, len, check, f.s[check], f.s ); 1027 1028 if ( ! f.flags.ignore && ! f.flags.rwd && f.s[check] != '\0' ) { // sentinel overwritten ? 1029 // buffer filled, but would we have kept going? 1030 if ( ! eof( is ) ) { 1031 char peek; 1032 fmt( is, "%c", &peek ); 1033 ungetc( is, peek ); 1034 bool hasMore; 1035 if (f.flags.delimiter) { // getline 1036 hasMore = (peek != f.delimiter[0]); 1037 } else if (f.scanset) { // incl/excl 1038 bool peekMatch = strchr(f.scanset, peek) != 0p; 1039 hasMore = f.flags.inex ? (!peekMatch) : (peekMatch); 1040 } else { // %s 1041 hasMore = !isspace(peek); 1042 } 1043 if (hasMore) throw (cstring_length){ &cstring_length_vt }; 1044 } // if 1045 } // if 1046 1047 if ( f.flags.delimiter ) { // getline ? 1048 if ( len == 0 ) f.s[0] = '\0'; // empty read => argument unchanged => set empty 1049 if ( ! eof( is ) ) { // ignore delimiter, may not be present because of width 1050 char delimiter; 1051 fmt( is, "%c", &delimiter ); 1052 if ( delimiter != f.delimiter[0] ) ungetc( is, delimiter ); 1053 } // if 1054 } //if 1055 return is; 1056 } // ?|? 1057 ISTYPE_VOID_IMPL( _Istream_Cstr ) 1043 } // if 1044 if ( args == 1 && eof( is ) ) { // data but scan ended at EOF 1045 // fprintf( stderr, "clear\n" ); 1046 clear( is ); // => reset EOF => detect again on next read 1047 } // if 1048 return is; 1049 } // ?|? 1058 1050 1059 1051 istype & ?|?( istype & is, _Istream_Char f ) { … … 1061 1053 return is; 1062 1054 } // ?|? 1063 ISTYPE_VOID_IMPL( _Istream_Char )1064 1055 } // distribution 1065 1056 … … 1078 1069 return is; \ 1079 1070 } /* ?|? */ \ 1080 ISTYPE_VOID_IMPL( _Istream_Manip(T) ) \1081 1071 } // distribution 1082 1072 … … 1106 1096 return is; 1107 1097 } // ?|? 1108 ISTYPE_VOID_IMPL( _Istream_Manip(float _Complex) )1109 1098 1110 1099 istype & ?|?( istype & is, _Istream_Manip(double _Complex) dc ) { … … 1117 1106 return is; 1118 1107 } // ?|? 1119 ISTYPE_VOID_IMPL( _Istream_Manip(double _Complex) )1120 1108 1121 1109 istype & ?|?( istype & is, _Istream_Manip(long double _Complex) ldc ) { … … 1128 1116 return is; 1129 1117 } // ?|? 1130 ISTYPE_VOID_IMPL( _Istream_Manip(long double _Complex) )1131 1118 } // distribution 1132 1119 -
libcfa/src/iostream.hfa
r2ad5e1d5 r7b84d3e 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Oct 8 12:02:55202313 // Update Count : 5 6812 // Last Modified On : Wed Oct 18 21:21:20 2023 13 // Update Count : 583 14 14 // 15 15 … … 306 306 // *********************************** istream *********************************** 307 307 308 #define ISTYPE_VOID( T ) void ?|?( istype &, T )309 #define ISTYPE_VOID_IMPL( T ) \310 void ?|?( istype & is, T t ) { \311 (istype &)(is | t); ends( is ); \312 } // ?|?313 314 308 forall( istype & ) 315 309 trait basic_istream { … … 320 314 void nlOn( istype & ); // read newline 321 315 void nlOff( istype & ); // scan newline 322 void ends( istype & os ); // end of output statement323 316 int fmt( istype &, const char format[], ... ) __attribute__(( format(scanf, 2, 3) )); 324 317 istype & ungetc( istype &, char ); 325 318 bool eof( istype & ); 319 void clear( istype & ); 326 320 }; // basic_istream 327 321 … … 329 323 trait istream { 330 324 bool fail( istype & ); 331 void clear( istype &);325 void open( istype & is, const char name[], const char mode[] ); 332 326 void open( istype & is, const char name[] ); 333 327 void close( istype & is ); … … 342 336 forall( istype & | basic_istream( istype ) ) { 343 337 istype & ?|?( istype &, bool & ); 344 ISTYPE_VOID( bool & );345 338 346 339 istype & ?|?( istype &, char & ); 347 ISTYPE_VOID( char & );348 340 istype & ?|?( istype &, signed char & ); 349 ISTYPE_VOID( signed char & );350 341 istype & ?|?( istype &, unsigned char & ); 351 ISTYPE_VOID( unsigned char & );352 342 353 343 istype & ?|?( istype &, short int & ); 354 ISTYPE_VOID( short int & );355 344 istype & ?|?( istype &, unsigned short int & ); 356 ISTYPE_VOID( unsigned short int & );357 345 istype & ?|?( istype &, int & ); 358 ISTYPE_VOID( int & );359 346 istype & ?|?( istype &, unsigned int & ); 360 ISTYPE_VOID( unsigned int & );361 347 istype & ?|?( istype &, long int & ); 362 ISTYPE_VOID( long int & );363 348 istype & ?|?( istype &, unsigned long int & ); 364 ISTYPE_VOID( unsigned long int & );365 349 istype & ?|?( istype &, long long int & ); 366 ISTYPE_VOID( long long int & );367 350 istype & ?|?( istype &, unsigned long long int & ); 368 ISTYPE_VOID( unsigned long long int & );369 351 #if defined( __SIZEOF_INT128__ ) 370 352 istype & ?|?( istype &, int128 & ); 371 ISTYPE_VOID( int128 & );372 353 istype & ?|?( istype &, unsigned int128 & ); 373 ISTYPE_VOID( unsigned int128 & );374 354 #endif // __SIZEOF_INT128__ 375 355 376 356 istype & ?|?( istype &, float & ); 377 ISTYPE_VOID( float & );378 357 istype & ?|?( istype &, double & ); 379 ISTYPE_VOID( double & );380 358 istype & ?|?( istype &, long double & ); 381 ISTYPE_VOID( long double & );382 359 383 360 istype & ?|?( istype &, float _Complex & ); 384 ISTYPE_VOID( float _Complex & );385 361 istype & ?|?( istype &, double _Complex & ); 386 ISTYPE_VOID( double _Complex & );387 362 istype & ?|?( istype &, long double _Complex & ); 388 ISTYPE_VOID( long double _Complex & );389 363 390 364 istype & ?|?( istype &, const char [] ); 391 ISTYPE_VOID( const char [] );392 365 393 366 // manipulators 394 367 istype & ?|?( istype &, istype & (*)( istype & ) ); 395 ISTYPE_VOID( istype & (*)( istype & ) );396 368 istype & nl( istype & is ); 397 369 istype & nlOn( istype & ); … … 402 374 403 375 ExceptionDecl( cstring_length ); 376 ExceptionDecl( missing_data ); 404 377 405 378 // *********************************** manipulators *********************************** 406 379 380 // skip does not compose with other C string manipulators. 407 381 struct _Istream_Cskip { 408 382 const char * scanset; … … 416 390 forall( istype & | basic_istream( istype ) ) { 417 391 istype & ?|?( istype & is, _Istream_Cskip f ); 418 ISTYPE_VOID( _Istream_Cskip );419 392 } 420 393 … … 458 431 forall( istype & | basic_istream( istype ) ) { 459 432 istype & ?|?( istype & is, _Istream_Cstr f ); 460 ISTYPE_VOID( _Istream_Cstr );461 433 } 462 434 … … 471 443 forall( istype & | basic_istream( istype ) ) { 472 444 istype & ?|?( istype & is, _Istream_Char f ); 473 ISTYPE_VOID( _Istream_Char );474 445 } 475 446 … … 490 461 forall( istype & | basic_istream( istype ) ) { \ 491 462 istype & ?|?( istype & is, _Istream_Manip(T) f ); \ 492 ISTYPE_VOID( _Istream_Manip(T) ); \493 463 } // ?|? 494 464 -
tests/concurrency/waituntil/channel_close.cfa
r2ad5e1d5 r7b84d3e 26 26 for( ;; ) { 27 27 if ( useAnd ) { 28 waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; }29 and waituntil( (in2 << B) ) { assert( B_removes == in2 ); B_removes++; removes++; }28 waituntil( (in << A) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); assert( A_removes == in ); A_removes++; removes++; } 29 and waituntil( (in2 << B) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); assert( B_removes == in2 ); B_removes++; removes++; } 30 30 continue; 31 31 } 32 waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; }33 or waituntil( (in << B) ) { assert( B_removes == in ); B_removes++; removes++; }32 waituntil( (in << A) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); assert( A_removes == in ); A_removes++; removes++; } 33 or waituntil( (in << B) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); ( B_removes == in ); B_removes++; removes++; } 34 34 } 35 35 } catchResume ( channel_closed * e ) {} // continue to remove until would block … … 37 37 try { 38 38 for( ;; ) 39 waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; }39 waituntil( (in << A) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); assert( A_removes == in ); A_removes++; removes++; } 40 40 } catchResume ( channel_closed * e ) {} // continue to remove until would block 41 41 catch ( channel_closed * e ) {} 42 42 try { 43 43 for( ;; ) 44 waituntil( (in << B) ) { assert( B_removes == in ); B_removes++; removes++; }44 waituntil( (in << B) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); assert( B_removes == in ); B_removes++; removes++; } 45 45 } catchResume ( channel_closed * e ) {} // continue to remove until would block 46 46 catch ( channel_closed * e ) {} -
tests/genericUnion.cfa
r2ad5e1d5 r7b84d3e 10 10 // Created On : Tue Dec 25 14:42:46 2018 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 25 14:46:33 201813 // Update Count : 212 // Last Modified On : Fri Oct 20 09:13:26 2023 13 // Update Count : 15 14 14 // 15 15 16 #include <fstream.hfa> 16 17 #include <limits.hfa> 17 18 18 forall( T)19 forall( T ) 19 20 union ByteView { 20 21 T val; … … 23 24 24 25 forall(T) 25 void print( ByteView(T) x) {26 for ( int i = 0; i < sizeof(int); i++) {// want to change to sizeof(T)27 printf("%02x", x.bytes[i] & 0xff);26 void print( ByteView(T) x ) { 27 for ( i; sizeof(int) ) { // want to change to sizeof(T) 28 sout | nobase( pad0( wd( 2, hex( x.bytes[i] & 0xff ) ) ) ) | nosep; 28 29 } 29 30 } 30 31 31 32 forall(T) 32 void f( ByteView(T) x, T val) {33 print( x);34 printf(" ");33 void f( ByteView(T) x, T val ) { 34 print( x ); 35 sout | " "; 35 36 x.val = val; 36 print( x);37 printf("\n");37 print( x ); 38 sout | nl; 38 39 } 39 40 40 41 int main() { 42 sout | nlOff; 41 43 ByteView(unsigned) u = { 0 }; 42 44 ByteView(int) i = { 0 }; 43 f( u, MAX);44 f( i, -1);45 f( u, MAX ); 46 f( i, -1 ); 45 47 } 46 48
Note: See TracChangeset
for help on using the changeset viewer.