Changes in doc/uC++toCFA/uC++toCFA.tex [8659435:de8a0286]
- File:
-
- 1 edited
-
doc/uC++toCFA/uC++toCFA.tex (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/uC++toCFA/uC++toCFA.tex
r8659435 rde8a0286 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Fri Feb 20 11:19:31 202614 %% Update Count : 6 71713 %% Last Modified On : Mon Nov 17 11:14:48 2025 14 %% Update Count : 6677 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 194 194 195 195 The @choose@ statement provides an implicit @break@ after the @case@ clause for safety. 196 It is possible to @ fallthrough@ label in a @case@ clause to transfer to common code orthe @default@ clause.197 \begin{cquote} 198 \begin{tabular}{@{}l|l@{}} 199 \begin{ cfa}196 It is possible to @break default@ in a @case@ clause to transfer to common code in the @default@ clause. 197 \begin{cquote} 198 \begin{tabular}{@{}l|l@{}} 199 \begin{uC++} 200 200 switch ( i ) { 201 case 3: ... @fallthrough common@; 202 case 2: if ( ... ) @fallthrough@; 203 case 1: 204 common: ... ; // implicit fall through 201 case 1: ... @break@; // explicit break 202 case 2: ... @break@; // explicit break 205 203 default: ... ; 206 204 } 207 \end{ cfa}205 \end{uC++} 208 206 & 209 207 \begin{cfa} 210 208 choose ( i ) { 211 case 3: ... @fallthrough common@; // labelled explicit fallthrough 212 case 2: if ( ... ) @fallthrough@; // conditional explicit fallthrough 213 case 1: 214 common: ... ; // implicit break 209 case 1: ... ; // implicit break 210 case 2: ... ; // implicit break 215 211 default: ... ; 216 212 } … … 254 250 for ( i; @5@ ~ @15@ ~ @2@ ) { ... } // 5 to 14 by 2 255 251 for ( i; -2 ~@=@ 10 ~ 3 ) { ... } // -2 to 10 by 3 256 for ( i; -3 @-@~ 10 ) { ... } // 10 to -2 by -1, not 10 -~= -3257 for ( i; 0 @-@~@=@ 10 ) { ... } // 10 to 0 by -1, not 10 -~= 0252 for ( i; -3 @-@~ 10 ) { ... } // not 10 -~= -3, 10 to -2 by -1 253 for ( i; 0 @-@~@=@ 10 ) { ... } // not 10 -~= 0, 10 to 0 by -1 258 254 \end{cfa} 259 255 \end{tabular} … … 912 908 public: 913 909 }; 914 T t;915 uProcessor p[3];916 910 \end{uC++} 917 911 & … … 923 917 }; 924 918 void main( @T & t@ ) { 925 ... @resumeAt( partner, ExceptionInst( E, ... ) )@;919 ... @resumeAt( partner, ExceptionInst( E, ... )@ ); 926 920 ... @active_thread();@ ... 927 921 } 928 T t; // create thread object and start thread in main 929 processor p[3]; // 4 kernel threads including program main 930 \ end{cfa}922 \end{cfa} 923 \\ 924 \multicolumn{2}{@{}l@{}}{\lstinline{T t; // start thread in main routine}} 931 925 \end{tabular} 932 926 \end{cquote} … … 1015 1009 } 1016 1010 }; 1017 Barrier b{ 3 }; 1011 enum { N = 3 }; 1012 Barrier b{ N }; 1018 1013 \end{uC++} 1019 1014 & … … 1039 1034 } 1040 1035 } 1041 Barrier b{ 3 }; 1036 enum { N = 3 }; 1037 Barrier b{ N }; 1042 1038 \end{cfa} 1043 1039 \end{tabular} … … 1182 1178 1183 1179 1184 {\lstset{tabsize= 4}1180 {\lstset{tabsize=3} 1185 1181 \setlength{\tabcolsep}{5pt} 1186 1182 \begin{tabular}{@{}l|ll@{}} … … 1190 1186 @Future_ISM@<double> fd; 1191 1187 struct Msg { int i, j; }; @Future_ISM@<Msg> fm; 1188 struct Stop {}; @Future_ISM@<Stop> fs; 1192 1189 struct Cont {}; @Future_ISM@<Cont> fc; 1193 _Exception Stop {};1194 1190 1195 1191 _Task Worker { 1196 1192 void main() { 1197 try { 1198 for ( ;; ) {1199 _Select( fi ) { cout << fi() << endl; fi.reset(); }1200 and _Select( fd ) { cout << fd() << endl; fd.reset(); }1201 and _Select( fm ) {1202 cout << fm().i << " " << fm().j << endl; fm.reset();1203 }1204 fc( (Cont){} );// synchronize1205 }1206 } catch( Stop & ) { cout << "stop" << endl;}1207 } 1193 1194 for ( ;; ) { 1195 _Select( fi ) { cout << fi() << endl; fi.reset(); } 1196 and _Select( fd ) { cout << fd() << endl; fd.reset(); } 1197 and _Select( fm ) { 1198 cout << fm().i << " " << fm().j << endl; fm.reset(); 1199 } or _Select( fs ) { cout << "stop" << endl; break; } 1200 fc.delivery( (Cont){} ); // synchronize 1201 } 1202 } 1203 1208 1204 }; 1209 1205 int main() { 1210 1206 Worker worker; 1211 1207 for ( int i = 0; i < 10; i += 1 ) { 1212 fi( i ); fd( i + 2.5 ); fm( (Msg){ i, 2 } ); // fulfil1208 fi( i ); fd( i + 2.5 ); fm( (Msg){ i, 2 } ); // fulfil 1213 1209 fc(); fc.reset(); // synchronize 1214 1210 } 1215 f i( new Stop{} ); // trigger exception1211 fs( (Stop){} ); 1216 1212 } // wait for worker to terminate 1217 1213 \end{uC++} … … 1219 1215 \begin{cfa} 1220 1216 #include <future.hfa> 1221 @future_rc@( int) fi;1222 @future_rc@( double) fd;1223 struct Msg { int i, j; }; @future_rc@( Msg) fm;1224 struct Cont {}; @future_rc@( Cont ) fc;1225 ExceptionDecl( Stop );1226 1217 @future_rc@(int) fi; 1218 @future_rc@(double) fd; 1219 struct Msg { int i, j; }; @future_rc@(Msg) fm; 1220 struct Stop {}; @future_rc@(Stop) fs; 1221 struct Cont {}; @future_rc@(Cont) fc; 1222 ExceptionDecl( Break ); 1227 1223 thread Worker {}; 1228 1224 void main( Worker & ) { … … 1231 1227 waituntil( fi ) { sout | fi(); reset( fi ); } 1232 1228 and waituntil( fd ) { sout | fd(); reset( fd ); } 1233 and waituntil( fm ) { 1234 sout | fm().i | fm().j; reset( fm ); 1229 and waituntil( fm ) { sout | fm().i | fm().j; reset( fm ); } 1230 or waituntil( fs ) { sout | "stop"; 1231 throw ExceptionInst( Break ); 1235 1232 } 1236 1233 fc( (Cont){} ); // synchronize 1237 1234 } 1238 } catch( Stop * ) { sout | "stop"; } 1239 } 1240 1235 } catch( Break * ) {} 1236 } 1241 1237 int main() { 1242 1238 Worker worker; 1243 1239 for ( i; 10 ) { 1244 fi( i ); fd( i + 2.5 ); fm( (Msg){ i, 2 } ); // fulfil1240 fi( i ); fd( i + 2.5 ); fm( (Msg){ i, 2 } ); // fulfil 1245 1241 fc(); reset( fc ); // synchronize 1246 1242 } 1247 f i( ExceptionPtr( ExceptionInst( Stop ) ));1243 fs( (Stop){} ); 1248 1244 } // wait for worker to terminate 1249 1245 \end{cfa}
Note:
See TracChangeset
for help on using the changeset viewer.