InstrumentationContext.st
author Claus Gittinger <cg@exept.de>
Mon, 08 Aug 2011 20:08:29 +0200
changeset 2629 d3561a472a75
child 2657 158e4e722319
permissions -rw-r--r--
initial checkin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2629
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 2010 by eXept Software AG
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libcomp' }"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
Object variableSubclass:#InstrumentationContext
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
	instanceVariableNames:'inInstrumentedCode enabled'
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
	classVariableNames:''
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	poolDictionaries:''
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	category:'System-Compiler-Instrumentation'
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!InstrumentationContext class methodsFor:'documentation'!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
copyright
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
 COPYRIGHT (c) 2010 by eXept Software AG
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
              All Rights Reserved
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
 This software is furnished under a license and may be used
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
 only in accordance with the terms of that license and with the
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
 inclusion of the above copyright notice.   This software may not
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
 be provided or otherwise made available to, or used by, any
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 other person.  No title to or ownership of the software is
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 hereby transferred.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
documentation
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
    installed as a thread-local variable (instrumentationContext) by the
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    beActiveIn:aProcess method, instances of me keep some meta state while
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    instrumentation is ongoing. 
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    Especially, only in processes with a context are instrumentationInfo objects
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    updated. This has two advantages:
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    - it blocks recursive calls, while inside instrumentation code
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    - it blocks instrumentation from other processes (so only test-code is instrumented)
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
! !
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
!InstrumentationContext class methodsFor:'instance creation'!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
new
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    "return an initialized instance"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    ^ self basicNew initialize.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
! !
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
!InstrumentationContext class methodsFor:'instance access'!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
current
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
    "the current context for this running thread."
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
    |p context|
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    p := Processor activeProcess.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    [p notNil] whileTrue:[
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
        context := p environmentAt:#instrumentationContext ifAbsent:nil.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
        context notNil ifTrue:[^ context ].
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
        p := p parentProcess
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    ].
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    ^ nil
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
    "
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
     InstrumentationContext current
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    "
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
    "Created: / 08-08-2011 / 14:44:11 / cg"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
! !
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
!InstrumentationContext class methodsFor:'running'!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
run:aBlock
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    "run aBlock with instrumentation enabled"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
    |context|
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    context := self new.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    [
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
        context beActiveIn:(Processor activeProcess).
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
        aBlock value
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    ] ensure:[
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
        Processor activeProcess environmentAt:#instrumentationContext put:nil
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
    ].
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
    "
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
     Smalltalk loadPackage:'exept:regression'.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
     BTree withAllPrivateClasses 
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
        do:[:cls | cls recompileUsingCompilerClass:InstrumentingCompiler].
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
     InstrumentationContext
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
        run:[ RegressionTests::BinaryTreeTester suite run ].
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
     (Tools::NewSystemBrowser open)
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
        switchToClass:BTree;
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
        showCoverageInformation value:true
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    "
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    "Created: / 08-08-2011 / 15:47:10 / cg"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
! !
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
!InstrumentationContext methodsFor:'accessing'!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
enabled
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    ^ enabled
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
enabled:aBoolean
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    enabled := aBoolean.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    "Modified (format): / 08-08-2011 / 14:47:12 / cg"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
inInstrumentedCode
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
    ^ inInstrumentedCode ? false
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    "Modified: / 07-08-2011 / 16:57:15 / cg"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
inInstrumentedCode:aBoolean
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    inInstrumentedCode := aBoolean.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
    "Modified (format): / 08-08-2011 / 19:43:19 / cg"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
! !
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
!InstrumentationContext methodsFor:'initialization'!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
initialize
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
    "Invoked when a new instance is created."
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
    inInstrumentedCode := false.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
    enabled := true.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    "/ super initialize.   -- commented since inherited method does nothing
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    "Modified: / 08-08-2011 / 15:44:59 / cg"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
! !
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
!InstrumentationContext methodsFor:'installing'!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
beActiveIn:aProcess
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    "become the current instrumentaion context for a process."
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    aProcess environmentAt:#instrumentationContext put:self.
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
    "
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
     InstrumentationContext new beActiveIn:(Processor activeProcess)
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    "
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
    "Created: / 08-08-2011 / 14:46:09 / cg"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
! !
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
!InstrumentationContext methodsFor:'queries'!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
enabledAndNotInInstrumentedCode
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
    ^ enabled and:[ inInstrumentedCode not ]
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
    "Created: / 08-08-2011 / 15:44:30 / cg"
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
! !
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
!InstrumentationContext class methodsFor:'documentation'!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
version
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    ^ '$Header: /cvs/stx/stx/libcomp/InstrumentationContext.st,v 1.1 2011-08-08 18:08:29 cg Exp $'
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
!
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
version_CVS
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
    ^ '$Header: /cvs/stx/stx/libcomp/InstrumentationContext.st,v 1.1 2011-08-08 18:08:29 cg Exp $'
d3561a472a75 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
! !