[aspectc-user] Aspects advising aspects
Andreas Gal
gal at uci.edu
Fri Jan 6 07:42:58 CET 2006
Hi Mike,
I am not sure I understand why the second problem (tracking the stats of a
cache) is a cross-cutting concern that should be implemented as an aspect.
Implementing caching as an aspect makes sense because it cross-cuts many
functions all over the program code. Its hard to modularize without an
aspect.
The stat counting, however, only affects an already modular piece of code:
the caching aspect. Thus, simple inheritence should be sufficient to
implement it in a modular fashion (by deriving a CountingCacheAspect from
the original CacheAspect).
Maybe I am missing something.
Andreas
(Note: I am not claiming there is no application for aspects advising
aspect code. I just think this particular example does not require that.)
On Fri, 6 Jan 2006 mike-mortensen at comcast.net wrote:
> I'm exploring aspects that have multiple concerns in them...
>
> For example, Caching is a concern that can be implemented in an aspect.
> In addition, we could have a Caching aspect that not only uses around advice to 'intercept'
> calls and return precomputed values, but also keeps track of the number of 'hits' and 'misses' for
> each function that it is caching. Each separate function of course has a separate cache
> (e.g. static map <key,value>) and separate hit/miss stats. This can be useful, because
> caching a function that rarely recomputes the same value will not save run time...
>
> One could argue that tracking the stats of a cache is a separate concern of the cacher, in
> the same way that adding caching code directly to each method is adding an extra concern
> to the functions.
>
> I've created a Cache that tracks stats per join point, but one thing I am trying
> (not so successfully) is to use to two aspects -- one to implement Caching using
> around advice and a Cache class, and another to implement calls to the Cache class
> from the CachingAspect.
>
> So, in a nutshell, I want to create an aspect that captures calls from inside another aspect.
> This is kind of like AspectJ's adviceexecution, but I don't believe AspectC++ has that.
>
> What I have found from experimenting with a trivial case (not even caching) is that I
> can have:
> AspectA, which calls a function HELLO
> AspectB, which uses the execution pointcut of HELLO
>
> BUT, if AspectB tries to use call("% HELLO(...)") instead of execution (so that it's
> weaving inide of AspectA) or if AspectB tries to use something like
> JoinPoint::signature()
> even with the execution joinpoint, I get errors when the woven code is compiled.
>
> I'm guessing that trying to weave into another aspect's advice or access JoinPoint
> info there is not supported, but without doing this the second aspect doesn't have
> enough context to be able to do anything useful...
>
> Here's an example of the aspect file that works. It has an Advisor
> aspect that calls HELLO, and a Monitor aspect that weaves against
> the execution of HELLO but doesn't use JoinPoint information
> (since the joinpoint would occur when Advisor's advice calls HELLO).
>
> #include <iostream>
> #include <map>
> #include <string>
> void HELLO() { std::cerr << " IN HELLO" << std::endl; }
> aspect Advisor {
> pointcut CallCircleArea() = call("% CircleArea(...)");
> advice CallCircleArea() : around()
> {
> HELLO();
> tjp->proceed();
> std::cerr << " In Advisor aspect..." << std::endl;
> }
> };
> aspect Monitor {
> pointcut Hello() = execution("% HELLO(...)");
> advice Hello() : before() {
> std::cerr << " In Monitor, about to call HELLO ............." << std::endl;
> }
> };
>
>
> Is this aspects that weave into other aspects beyond the scope of what AspectC++ can currently do,
> or am I just missing something?
>
> Thanks!
> -Mike Mortensen
--
Andreas Gal, PhD Candidate Tel: (949) 350-7417
Computer Science Department Fax: (213) 232-0599
University of California, Irvine Office: CS/E 105
Irvine, CA 92697-3430 Email: gal at uci.edu
More information about the aspectc-user
mailing list