Package abstrasy.pcfx

Source Code of abstrasy.pcfx.PCFx_mutex

package abstrasy.pcfx;

import abstrasy.Interpreter;
import abstrasy.InterpreterSemaphore;
import abstrasy.Node;
import abstrasy.StaticHeap;

/**
* Abstrasy Interpreter
*
* Copyright : Copyright (c) 2006-2012, Luc Bruninx.
*
* Concédée sous licence EUPL, version 1.1 uniquement (la «Licence»).
*
* Vous ne pouvez utiliser la présente oeuvre que conformément à la Licence.
* Vous pouvez obtenir une copie de la Licence à l’adresse suivante:
*
*   http://www.osor.eu/eupl
*
* Sauf obligation légale ou contractuelle écrite, le logiciel distribué sous
* la Licence est distribué "en l’état", SANS GARANTIES OU CONDITIONS QUELLES
* QU’ELLES SOIENT, expresses ou implicites.
*
* Consultez la Licence pour les autorisations et les restrictions
* linguistiques spécifiques relevant de la Licence.
*
*
* @author Luc Bruninx
* @version 1.0
*/

public class PCFx_mutex extends PCFx {

    public PCFx_mutex() {
    }

    /**
     * eval
     *
     * @param startAt Node
     * @return Node
     * @throws Exception
     * @todo Implémenter cette méthode abstrasy.PCFx
     */
    public Node eval(Node startAt) throws Exception {
        /*
         * (mutex {...}) : La section délimitée par mutex est la seule qui puisse s'exécutée dans cet
         *                 état. Le principe de l'exclusion mutuelle s'applique à tous les acteurs
         *                 qui utilise mutex. Si nécessaire, l'acteur est bloqué jusqu'à ce qu'il
         *                 n'y ai plus aucun autre acteur exécutant une section mutex. Il s'agit donc
         *                 d'un verrouillage fort.
         */
        startAt.isGoodArgsCnt(2);

        Node xnode = startAt.getSubNode(1, Node.TYPE_LAZY);


        Node res = null;
        Interpreter myself = Interpreter.mySelf();
        StaticHeap global = myself.getGLOBAL();
        InterpreterSemaphore sema = Interpreter.getSemaphore();

        Exception reportExcep = null;


        /*
         * l'acteur est-il déjà verrouillé ?
         */
        boolean dejaLock = myself.actor_ISMUTEX();

        /*
         * Adapter en fonction du verrouillage...
         */
        if (dejaLock) {
            // sema déjà verrouillé
            myself.actor_LOCKMUTEX();
        }
        else {
            sema.lockMutex();
            // inclu actor_LOCK();
        }


        /*
         * Nouveau contexte...
         */
        global.push();
       
        try {
            res = xnode.exec(true);
        }
        catch (Exception e) {
            reportExcep = e;
        }

        /*
         * restaurer le contexte
         */
        global.pull();
       
       
        /*
         * adapter en fonction du verrouillage...
         */
        if (dejaLock) {
            // sema de doit pas encore être déverrouillé...
            myself.actor_UNLOCKMUTEX();
        }
        else {
            sema.unlockMutex();
            // inclu actor_UNLOCK();
        }


        /*
         * reporter l'exception s'il y en a une...
         */
        if (reportExcep != null) {
            throw reportExcep;
        }

        return res;
    }

}
TOP

Related Classes of abstrasy.pcfx.PCFx_mutex

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.