/* Implantation tampon N elements */
/* Compilation : m2sr -sw tampon_sc.m */

_monitor(tampon_sc)
    op deposer(valeur:int), retirer() returns valeur:int
_body(tampon_sc)
    const N := 4
    var element[0:N-1]: int
    var tete := 0, fin := 0, nb_elem := 0
    
    _condvar(pas_plein); _condvar(pas_vide)

    _proc( deposer(valeur) )
        do nb_elem = N -> 
             /*_print(pas_plein); _print(pas_vide)*/
            _wait(pas_plein)
        od
        /*_print(pas_plein); _print(pas_vide)*/
        element[fin] := valeur
        fin := (fin+1) % N
        nb_elem := nb_elem+1
        _signal(pas_vide)
    _proc_end
    
    _proc( retirer() returns valeur )
        do nb_elem = 0 -> 
            /* _print(pas_plein); _print(pas_vide)*/
            _wait(pas_vide)
        od
        /*_print(pas_plein); _print(pas_vide)*/
        valeur := element[tete]
        tete := (tete+1) % N
        nb_elem := nb_elem-1
        _signal(pas_plein)
    _proc_end
_monitor_end
