On 09/21/2013 01:58 AM, Mandy Chung wrote:
On 9/20/2013 2:46 PM, Jochen Theodorou wrote:
Exposing a StackStream API means that you need to eagerly walk the stack and copy the stack frames to it before it returns. I agree it is a much
more flexible API.  On the other hand, stack walking is sequential and
ordered and a stack stream will be traversed as in an iterator.
to underline it: Stream does not require you to eagerly read all values


Yes. What I was trying to explain is that if we want to return a Stream instance to the caller and traverse later, it means that it has to take a snapshot of the stack trace of the current thread. The stack trace data has to be stored in whatever data structure like how Throwable is currently implemented.

I think referring this as a "stream" cause the confusion - will revisit this.

Mandy

What you can do is to call a function that will take the stream as argument and close the stream after its use and before returning.

<R> R processStackStream(Function<StackStream, R> fun) {
StackStream stackStream = new StackStream(Thread.currentThread()); // bias the stack stream on the current thread
// the current thread is checked before doing something on the stream.
    try {
return fun.apply(stackStream); // the stack stream is visible by the user, but it can not use it in another thread
    } finally {
stackStream.close(); // set a flag saying that you can't access to the underlying stack stream anymore // the flag doesn't need to be volatile if the current thread is checked first
    }
 }

cheers,
Rémi

Reply via email to