//Implementacion del aspecto de sincronizacion en la estructura de cola circular
aspect ColaCirSincro{
private int eltosRellenos = 0; //Variable que contiene la cantidad de elementos actuales en la cola
//Captura el caso de que se produzca un llamado al metodo Insertar de la clase ColaCircular y
//se ejecuta el metodo insertar del aspecto
pointcut insertar(ColaCircular c):
instanceof (c
) && receptions
(void Insertar
(Object));
//Captura el caso de que se produzca un llamado al metodo Extraer de la clase ColaCircular y
//se ejecuta el metodo extraer del aspecto
pointcut extraer(ColaCircular c):
instanceof (c
) && receptions
(Object Extraer
());
//El advice se ejecuta antes de hacer el llamado a la funcion Insertar
before(ColaCircular c):insertar(c) {
antesInsertar(c);
}
//Implementa la sincronizacion en el metodo Insertar de la clase ColaCircular
protected synchronized void antesInsertar (ColaCircular c){
while (eltosRellenos == c.getCapacidad()) {
try {
wait();
}
}
//El advice se ejecuta despues de hacer el llamado a la funcion Insertar
after(ColaCircular c):insertar(c) {
despuesInsertar();
}
//Aumenta el tamaño de la cola y notifica a los demas hilos que terminó la funcion
protected synchronized void despuesInsertar (){
eltosRellenos++;
notifyAll();
}
//El advice se ejecuta antes de hacer el llamado a la funcion Extraer
before(ColaCircular c):extraer(c) {
antesExtraer();
}
//Implementa la sincronizacion en el metodo Extraer de la clase ColaCircular
protected synchronized void antesExtraer (){
while (eltosRellenos == 0) {
try {
wait();
}
}
//El advice se ejecuta despues de hacer el llamado a la funcion Extraer
after(ColaCircular c):extraer(c) {
despuesExtraer();
}
//Reduce el tamaño de la cola y notifica a los demas hilos que terminó la funcion
protected synchronized void despuesExtraer (){
eltosRellenos--;
notifyAll();
}
}