Node res = null;
Interpreter myself = Interpreter.mySelf();
StaticHeap global = myself.getGLOBAL();
InterpreterSemaphore sema = Interpreter.getSemaphore();
Exception reportExcep = null;
/*
* Si les nodes sont déjà verrrouillés par moi-même, on ignore le verrouillage...
*/
for(int i=0;i<vnodes.length;i++){
vnodes[i].lockLock();
}
/*
* Nouveau contexte...
*/
global.push();
// Entrée dans la section verrouillée réussie...
myself.actor_LOCKSECTION();
try {
res = xnode.exec(true);
}
catch (Exception e) {
reportExcep = e;
}
//Sortie de la section verroui
myself.actor_UNLOCKSECTION();
/*
* restaurer le contexte
*/
global.pull();
/*
* Si les nodes étaient déjà verrouillés par moi-même avant, je ne déverrouille
* pas ici...
*
* S'il y a une exception et/ou que j'avais verrouillé ici, je déverrouille
* maintenant... Equivalent de fin
*
* Remarque:
* --------
* Si on déverrouille dans le même ordre qu'on à verrouillé, on obtient
* une libération dans un ordre permettant le re-verrouillage dans
* l'ordre chronologique des déverrouillage:
*
* T1: x <----------------->
* y <----------------->
*
* T2 x <---------------->
* y <---------------->
*
* Verrouillages et déverrouillage peuvent ainsi se chevaucher.
*
*/
for(int i=0;i<vnodes.length;i++){
sema.unlockNode(vnodes[i]);
}
/*
* reporter l'exception s'il y en a une...
*/