org.apache.derby.iapi.util
Class InterruptStatus

java.lang.Object
  extended by org.apache.derby.iapi.util.InterruptStatus

public class InterruptStatus
extends java.lang.Object

Static methods to save and retrieve information about a (session) thread's interrupt status flag. If during operation we notice an interrupt, Derby will either:

Normally, the information is saved away in the session's LanguageConnectionContext, if available. If not, we save it in a thread local variable.


Field Summary
private static java.lang.ThreadLocal exception
          Use thread local variable to store interrupt status flag *only* if we don't have lcc, e.g. during database creation, shutdown etc.
static int INTERRUPT_RETRY_SLEEP
           
static int MAX_INTERRUPT_RETRIES
          Constants used by code that retries file operations after seeing the NIO file channel closed due to interrupts.
 
Constructor Summary
InterruptStatus()
           
 
Method Summary
static boolean noteAndClearInterrupt(java.lang.String s, int threadsInPageIO, int hashCode)
          Checks if the thread has been interrupted in NIO, presumably because we saw an exception indicating this.
static void restoreIntrFlagIfSeen()
          Check if the we ever noticed and reset the thread's interrupt status flag to allow safe operation during execution.
static void restoreIntrFlagIfSeen(LanguageConnectionContext lcc)
          Same purpose as restoreIntrFlagIfSeen().
static void saveInfoFromLcc(LanguageConnectionContext lcc)
          Use when lcc is dying to save info in thread local instead.
static void setInterrupted()
          Make a note that this thread saw an interrupt.
static void throwIf(LanguageConnectionContext lcc)
          Check if the we ever noticed and reset the thread's interrupt status flag to allow safe operation during execution, or if the interrupt status flag is set now.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

MAX_INTERRUPT_RETRIES

public static final int MAX_INTERRUPT_RETRIES
Constants used by code that retries file operations after seeing the NIO file channel closed due to interrupts.

See Also:
Constant Field Values

INTERRUPT_RETRY_SLEEP

public static final int INTERRUPT_RETRY_SLEEP
See Also:
Constant Field Values

exception

private static final java.lang.ThreadLocal exception
Use thread local variable to store interrupt status flag *only* if we don't have lcc, e.g. during database creation, shutdown etc.

Constructor Detail

InterruptStatus

public InterruptStatus()
Method Detail

setInterrupted

public static void setInterrupted()
Make a note that this thread saw an interrupt. Thread's intr status flag is presumably off already, but we reset it here also. Use lcc if available, else thread local variable.


saveInfoFromLcc

public static void saveInfoFromLcc(LanguageConnectionContext lcc)
Use when lcc is dying to save info in thread local instead. Useful under shutdown.


noteAndClearInterrupt

public static boolean noteAndClearInterrupt(java.lang.String s,
                                            int threadsInPageIO,
                                            int hashCode)
Checks if the thread has been interrupted in NIO, presumably because we saw an exception indicating this. Make a note of this and clear the thread's interrupt status flag (NIO doesn't clear it when throwing) so we can retry whatever we are doing. It will be set back ON before control is transferred back to the application, cf. restoreIntrFlagIfSeen.

The note that we saw an interrupt is stored in the lcc if available, if not, in thread local exception.

Parameters:
s - (debug info) whence
threadsInPageIO - (debug info) number of threads inside the NIO code concurrently
hashCode - (debug info) container id
Returns:
true if the thread's interrupt status flag was set

restoreIntrFlagIfSeen

public static void restoreIntrFlagIfSeen()
Check if the we ever noticed and reset the thread's interrupt status flag to allow safe operation during execution. Called from JDBC API methods before returning control to user application. Typically, this happens just prior to return in methods that catch Throwable and invoke handleException (directly or indirectly) on it, e.g.
       :
       InterruptStatus.restoreIntrFlagIfSeen();
       return ...;
    } catch (Throwable t) {
       throw handleException(t);
    }
 
handleException does its own calls to restoreIntrFlagIfSeen. If setupContextStack has been called consider using the overloaded variant of restoreIntrFlagIfSeen with an lcc argument.

If an interrupt status flag was seen, we set it back on here.


restoreIntrFlagIfSeen

public static void restoreIntrFlagIfSeen(LanguageConnectionContext lcc)
Same purpose as restoreIntrFlagIfSeen(). This variant presumes we are sure we have a lcc != null, i.e. setupContextStack has been called and not yet restored. Note that we cannot merge this code with restoreContextStack, since that is typically called in a finally block, at which point in time, the lcc may be gone due to errors of severity SESSION_SEVERITY or DATABASE_SEVERITY.

If no lcc is available, use the zero-arg variant. We only need this variant for performance reasons.

Parameters:
lcc - the language connection context for this session

throwIf

public static void throwIf(LanguageConnectionContext lcc)
                    throws StandardException
Check if the we ever noticed and reset the thread's interrupt status flag to allow safe operation during execution, or if the interrupt status flag is set now. Called when operations want to be prematurely terminated due to interrupt.

If an interrupt status flag was seen, but temporarily switched off, we set it back ON here.

Parameters:
lcc - the language connection context for this session
Throws:
StandardException - (session level SQLState.CONN_INTERRUPT) if interrupt seen

Built on Wed 2013-06-12 15:21:56+0000, from revision ???

Apache Derby V10.10 Internals - Copyright © 2004,2013 The Apache Software Foundation. All Rights Reserved.