Changeset 135a2d8


Ignore:
Timestamp:
Nov 8, 2024, 5:12:48 PM (2 weeks ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
62595b31
Parents:
83a581a
Message:

updates to uC++toCFA document

File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/uC++toCFA/uC++toCFA.tex

    r83a581a r135a2d8  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Tue Oct 22 17:45:48 2024
    14 %% Update Count     : 6068
     13%% Last Modified On : Fri Nov  8 08:22:25 2024
     14%% Update Count     : 6107
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    394394struct S {
    395395        int i, j;
    396         S( int i, int j ) { S::i = i; S::j = j; }
    397         ~S() {}
     396        @S@( int i, int j ) { S::i = i; S::j = j; }
     397        @~S@() {}
    398398};
    399399S s = { 1, 2 }, s2{ 1, 2 };
     
    407407        int i, j;
    408408};
    409 void ?{}( S & s, int i, int j ) { s.[i, j] = [i, j]; }
    410 void ^?{}( S & s ) {}
     409void @?{}( S & s@, int i, int j ) { s.[i, j] = [i, j]; }
     410void @^?{}( S & s@ ) {}
    411411S s = { 1, 2 }, s2{ 1, 2 };
    412412S * s3 = &(*malloc()){ 1, 2 };
     
    504504\begin{uC++}
    505505
    506 _Coroutine C {
     506@_Coroutine@ C {
    507507        // private coroutine fields
    508508        void main() {
    509                 ... suspend(); ...
    510                 ... _Resume E( ... ) _At partner;
    511                 ... uThisCoroutine(); ...
     509                ... @suspend();@ ...
     510                ... @_Resume E( ... ) _At partner;@
     511                ... @uThisCoroutine();@ ...
    512512
    513513        }
    514514  public:
    515515        void mem( ... ) {
    516                 ... resume() ...
     516                ... @resume();@ ...
    517517        }
    518518};
     
    521521\begin{cfa}
    522522#include <$coroutine$.hfa>
    523 coroutine C {
     523@coroutine@ C {
    524524        // private coroutine fields
    525525
    526526};
    527527void main( C & c ) {
    528         ... suspend; ... // keyword not routine
    529         ... resumeAt( partner, ExceptionInst( E, ... ) );
    530         ... active_coroutine(); ...
     528        ... @suspend;@ ... // keyword not routine
     529        ... @resumeAt( partner, ExceptionInst( E, ... ) );@
     530        ... @active_coroutine();@ ...
    531531}
    532532void mem( C & c, ... ) {
    533         ... resume( c ); ...
     533        ... @resume( c );@ ...
    534534}
    535535\end{cfa}
     
    548548#include <uCobegin.h>
    549549int main() {
    550         COBEGIN
     550        @COBEGIN@
    551551                BEGIN osacquire( cout ) << "A" << endl; END
    552552                BEGIN osacquire( cout ) << "B" << endl; END
     
    554554                BEGIN osacquire( cout ) << "D" << endl; END
    555555                BEGIN osacquire( cout ) << "E" << endl; END
    556         COEND
    557         COFOR( i, 1, 10,
     556        @COEND@
     557        @COFOR@( i, 1, 10,
    558558                osacquire( cout ) << i << endl;
    559559        )
     
    566566int main() {
    567567        {
    568                 corun { mutex( sout ) sout | "A"; }
     568                @corun@ { mutex( sout ) sout | "A"; }
    569569                corun { mutex( sout ) sout | "B"; }
    570570                corun { mutex( sout ) sout | "C"; }
     
    572572                corun { mutex( sout ) sout | "E"; }
    573573        }
    574         cofor( i; 10 ) {
     574        @cofor@( i; 10 ) {
    575575                mutex( sout ) sout | i;
    576576    }
     
    712712\section{Monitors}
    713713
     714Internal Scheduling
    714715\begin{cquote}
    715716\begin{tabular}{@{}l|ll@{}}
    716717\begin{uC++}
    717718
    718 @_Monitor@ M {
    719         @uCondition@ c;
    720         bool avail = true;
     719@_Monitor@ BoundedBufferI {
     720        @uCondition@ full, empty;
     721        int front = 0, back = 0, count = 0;
     722        int elements[20];
    721723  public:
    722724
    723         void rtn() {
    724                 if ( ! avail ) c.wait();
    725                 else avail = false;
     725
     726
     727        @_Nomutex@ int query() const { return count; }
     728
     729        void insert( int elem ) {
     730                if ( count == 20 ) @empty.wait();@
     731                elements[back] = elem;
     732                back = ( back + 1 ) % 20;
     733                count += 1;
     734                @full.signal();@
     735        }
     736        int remove() {
     737                if ( count == 0 ) @full.wait();@
     738                int elem = elements[front];
     739                front = ( front + 1 ) % 20;
     740                count -= 1;
     741                @empty.signal();@
     742                return elem;
    726743        }
    727744};
     
    730747\begin{cfa}
    731748#include <$monitor$.hfa>
    732 @monitor@ M {
    733         @condition@ c;
    734         bool avail;
    735 };
    736 void ?{}( M & m ) { m.avail = true; }
    737 void rtn( M & m ) with( m ) {
    738         if ( ! avail ) wait( c );
    739         else avail = false;
    740 }
    741 
    742 \end{cfa}
    743 \\
    744 \multicolumn{2}{@{}l@{}}{\lstinline{M m;}}
     749@monitor@ BoundedBufferI {
     750        @condition@ full, empty;
     751        int front, back, count;
     752        int elements[20];
     753};
     754void ?{}( BoundedBufferI & buf ) with( buf ) {
     755        front = back = count = 0;
     756}
     757int query( BoundedBufferI & buf ) { return buf.count; }
     758int remove( BoundedBufferI & @mutex@ buf ); // forward
     759void insert( BoundedBufferI & @mutex@ buf, int elem ) with( buf ) {
     760        if ( count == 20 ) @wait( empty );@
     761        elements[back] = elem;
     762        back = ( back + 1 ) % 20;
     763        count += 1
     764        @signal( full );@
     765}
     766int remove( BoundedBufferI & @mutex@ buf ) with( buf ) {
     767        if ( count == 0 ) @wait( full );@
     768        int elem = elements[front];
     769        front = ( front + 1 ) % 20;
     770        count -= 1;
     771        @signal( empty );@
     772        return elem;
     773}
     774
     775\end{cfa}
     776\end{tabular}
     777\end{cquote}
     778\enlargethispage{1000pt}
     779External Scheduling
     780\begin{cquote}
     781\begin{tabular}{@{}l|ll@{}}
     782\begin{uC++}
     783
     784_Monitor BoundedBuffer {
     785        int front = 0, back = 0, count = 0;
     786        int elements[20];
     787  public:
     788        _Nomutex int query() const { return count; }
     789        void insert( int elem );
     790        int remove();
     791};
     792
     793void BoundedBuffer::insert( int elem ) {
     794        if ( count == 20 ) @_Accept( remove );@
     795        elements[back] = elem;
     796        back = ( back + 1 ) % 20;
     797        count += 1;
     798}
     799int BoundedBuffer::remove() {
     800        if ( count == 0 ) @_Accept( insert );@
     801        int elem = elements[front];
     802        front = ( front + 1 ) % 20;
     803        count -= 1;
     804        return elem;
     805}
     806\end{uC++}
     807&
     808\begin{cfa}
     809#include <$monitor$.hfa>
     810monitor BoundedBuffer {
     811        int front, back, count;
     812        int elements[20];
     813};
     814void ?{}( BoundedBuffer & buf ) with( buf ) {
     815        front = back = count = 0;
     816}
     817int query( BoundedBuffer & buf ) { return buf.count; }
     818int remove( BoundedBuffer & @mutex@ buf ); // forward
     819void insert( BoundedBuffer & @mutex@ buf, int elem ) with( buf ) {
     820        if ( count == 20 ) @waitfor( remove : buf );@
     821        elements[back] = elem;
     822        back = ( back + 1 ) % 20;
     823        count += 1;
     824}
     825int remove( BoundedBuffer & @mutex@ buf ) with( buf ) {
     826        if ( count == 0 ) @waitfor( insert : buf );@
     827        int elem = elements[front];
     828        front = ( front + 1 ) % 20;
     829        count -= 1;
     830        return elem;
     831}
     832\end{cfa}
    745833\end{tabular}
    746834\end{cquote}
Note: See TracChangeset for help on using the changeset viewer.