SynchronizedObject.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 2888 67cd09a723a0
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2888
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
Object subclass:#SynchronizedObject
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:'lock'
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:'AccessLock'
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	category:'Kernel-Processes'
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!SynchronizedObject class methodsFor:'documentation'!
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
documentation
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
    synchronized objects execute incoming messages in a serialized, synchronous manner,
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
    locking out other messages while executing any synchronized method.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    Synchronized methods are marked with a synchronized pragma; i.e. with '<synchronized>'.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
    Non-synchronized methods behave as usual.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
    Normally, I am subclassed, but see the example for an anonymous class example.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
    [Author:]
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
        Claus Gittinger
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
"
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
examples
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
"
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
  normally, one would subclass SynchronizedObject and put protocol into it;
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
  here, for the example, an anon Printer is defined. It is slow printing to the Transcript for a demo.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
  The interesting thing is the error handling which is demonstrated in printWithError:
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
  Any exception inside the worker object is returned back and raised in the active-object's client,
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
  not in the worker (take a look at the call-chain, when running the example below).
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
    |workerClass worker|
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
    workerClass := SynchronizedObject 
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
                        subclass:#Printer
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
                        instanceVariableNames:''
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
                        classVariableNames:''
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
                        poolDictionaries:''
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
                        category:nil
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
                        inEnvironment:nil.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    workerClass compile:'print:aLine
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    <synchronized>
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
    aLine do:[:ch |
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
        Transcript show:ch.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
        Delay waitForSeconds:0.2.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    ].
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    Transcript cr.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
'.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
    workerClass compile:'printWithError:aLine
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
    <synchronized>
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    aLine do:[:ch |
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
        Transcript show:ch.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
        ch == $l ifTrue:[ self foo ].
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
        Delay waitForSeconds:0.2.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
    ].
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    Transcript cr.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
'.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    worker := workerClass new.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
    'now ready for printing'.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    worker printWithError:'abcdef'.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    worker printWithError:'hello world'.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
"
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
! !
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
!SynchronizedObject class methodsFor:'initialization'!
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
initialize
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    AccessLock := Semaphore forMutualExclusion.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
! !
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
!SynchronizedObject class methodsFor:'instance creation'!
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
new
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    ^ self basicNew initializeLock initialize.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
! !
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
!SynchronizedObject class methodsFor:'utilities'!
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
addSelector: selector withMethod: aMethod
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    (aMethod hasAnnotation: #synchronized) ifTrue:[
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
        ^ super addSelector: selector withMethod: (self makeSynchronizedMethod: aMethod selector: selector)
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    ].
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
    ^ super addSelector: selector withMethod: aMethod
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
!
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
makeSynchronizedMethod: originalMethod selector:selector
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    |realMethod i|
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
    realMethod := Compiler 
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
                    compile: ('%1 |args|  args := thisContext args. lock critical:[ #placeHolder valueWithReceiver:self arguments:args selector:#''%2'' search: nil sender: nil ]. ^  self' 
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
                                bindWith:(Compiler methodSpecificationForSelector: selector)
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
                                with: selector)
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
                    forClass: self
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
                    install: false.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
    realMethod category:(originalMethod category).
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    realMethod source:(originalMethod source).
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    i := realMethod literals indexOf: #placeHolder.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    realMethod literalAt:i put: originalMethod.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
    ^ realMethod
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
! !
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
!SynchronizedObject methodsFor:'initialization'!
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
initializeLock
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    lock := RecursionLock new.
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
! !
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
!SynchronizedObject class methodsFor:'documentation'!
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
version
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    ^ '$Header: /cvs/stx/stx/libbasic2/SynchronizedObject.st,v 1.1 2013-01-24 15:52:14 cg Exp $'
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
!
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
version_CVS
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    ^ '$Header: /cvs/stx/stx/libbasic2/SynchronizedObject.st,v 1.1 2013-01-24 15:52:14 cg Exp $'
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
! !
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
67cd09a723a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
SynchronizedObject initialize!