Author: amintos
Branch: 
Changeset: r758:d053e5d75087
Date: 2014-01-16 23:11 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/d053e5d75087/

Log:    Implemented BlockClosure >> atomic. Usage: [sum := sum + 1] atomic
        value.

diff --git a/images/Squeak4.5-12568.changes b/images/Squeak4.5-12568.changes
--- a/images/Squeak4.5-12568.changes
+++ b/images/Squeak4.5-12568.changes
@@ -1,2 +1,2 @@
 
-

----STARTUP----{15 January 2014 . 2:16:33 pm} as 
/home/bot/lang-smalltalk/images/Squeak4.5-12568.image!

!Integer methodsFor: 'benchmarks' stamp: 'toma 1/15/2014 14:33' prior: 42646392!
benchStm
        [(1 to: 1000)
                do: [:t1 | SPyVM print: 'Thread 1 reporting!!']] parallelFork.
        [(1 to: 1000)
                do: [:t1 | SPyVM print: 'Thread 2 reporting!!']] parallelFork.
        [(1 to: 1000)
                do: [:t1 | SPyVM print: 'Thread 3 reporting!!']] parallelFork.
        [(1 to: 1000)
                do: [:t1 | SPyVM print: 'Thread 4 reporting!!']] parallelFork.
        (1 to: 1000)
                do: [:x | SPyVM print: '* spinlock *'].
        ^ 42 printString! !

----SNAPSHOT----{15 January 2014 . 2:33:47 pm} Squeak4.5-12568.image 
priorSource: 9103122!
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/15/2014 14:35' prior: 42656801!
benchStm3
        | t1 t2 |
        t1 := [(1 to: 100)
                                do: [:t3 | SPyVM print: 'Thread 1 
reporting!!']] parallelFork.
        t2 := [(1 to: 100)
                                do: [:t3 | SPyVM print: 'Thread 2 
reporting!!']] parallelFork.
        SPyVM print: 'Waiting for Task 1'.
        t1 wait.
        SPyVM print: 'Waiting for Task 2'.
        t2 wait.
        SPyVM print: 'Finished waiting.'! !

----SNAPSHOT----{15 January 2014 . 2:36:01 pm} Squeak4.5-12568.image 
priorSource: 594!
!STMProcess methodsFor: 'as yet unclassified' stamp: 'toma 1/15/2014 14:37' 
prior: 42653846!
wait
        <primitive: 789>
        SPyVM print: ' Failed to wait for process!! '! !

----SNAPSHOT----{15 January 2014 . 2:37:09 pm} Squeak4.5-12568.image 
priorSource: 1091!

----STARTUP----{16 January 2014 . 9:13:20 pm} as 
/home/bot/lang-smalltalk/images/Squeak4.5-12568.image!

!BlockClosure methodsFor: 'scheduling' stamp: 'toma 1/16/2014 21:13' prior: 
42654183!
parallelFork
        ^ (self newSTMProcess) fork; yourself! !

----SNAPSHOT----{16 January 2014 . 9:14:01 pm} Squeak4.5-12568.image 
priorSource: 1345!
!STMProcess methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 21:14'!
primWait
        <primitive: 789>
        SPyVM print: ' Failed to wait for process!! '! !
!STMProcess methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 21:15' 
prior: 33555705!
wait
        
        SPyVM print: '[squeak] wait'
        self primWait! !
!STMProcess methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 21:15' 
prior: 33556450!
wait
        
        SPyVM print: '[squeak] wait'.
        self primWait! !

----SNAPSHOT----{16 January 2014 . 9:15:29 pm} Squeak4.5-12568.image 
priorSource: 1681!
\ No newline at end of file
+

----STARTUP----{15 January 2014 . 2:16:33 pm} as 
/home/bot/lang-smalltalk/images/Squeak4.5-12568.image!

!Integer methodsFor: 'benchmarks' stamp: 'toma 1/15/2014 14:33' prior: 42646392!
benchStm
        [(1 to: 1000)
                do: [:t1 | SPyVM print: 'Thread 1 reporting!!']] parallelFork.
        [(1 to: 1000)
                do: [:t1 | SPyVM print: 'Thread 2 reporting!!']] parallelFork.
        [(1 to: 1000)
                do: [:t1 | SPyVM print: 'Thread 3 reporting!!']] parallelFork.
        [(1 to: 1000)
                do: [:t1 | SPyVM print: 'Thread 4 reporting!!']] parallelFork.
        (1 to: 1000)
                do: [:x | SPyVM print: '* spinlock *'].
        ^ 42 printString! !

----SNAPSHOT----{15 January 2014 . 2:33:47 pm} Squeak4.5-12568.image 
priorSource: 9103122!
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/15/2014 14:35' prior: 42656801!
benchStm3
        | t1 t2 |
        t1 := [(1 to: 100)
                                do: [:t3 | SPyVM print: 'Thread 1 
reporting!!']] parallelFork.
        t2 := [(1 to: 100)
                                do: [:t3 | SPyVM print: 'Thread 2 
reporting!!']] parallelFork.
        SPyVM print: 'Waiting for Task 1'.
        t1 wait.
        SPyVM print: 'Waiting for Task 2'.
        t2 wait.
        SPyVM print: 'Finished waiting.'! !

----SNAPSHOT----{15 January 2014 . 2:36:01 pm} Squeak4.5-12568.image 
priorSource: 594!
!STMProcess methodsFor: 'as yet unclassified' stamp: 'toma 1/15/2014 14:37' 
prior: 42653846!
wait
        <primitive: 789>
        SPyVM print: ' Failed to wait for process!! '! !

----SNAPSHOT----{15 January 2014 . 2:37:09 pm} Squeak4.5-12568.image 
priorSource: 1091!

----STARTUP----{16 January 2014 . 9:13:20 pm} as 
/home/bot/lang-smalltalk/images/Squeak4.5-12568.image!

!BlockClosure methodsFor: 'scheduling' stamp: 'toma 1/16/2014 21:13' prior: 
42654183!
parallelFork
        ^ (self newSTMProcess) fork; yourself! !

----SNAPSHOT----{16 January 2014 . 9:14:01 pm} Squeak4.5-12568.image 
priorSource: 1345!
!STMProcess methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 21:14'!
primWait
        <primitive: 789>
        SPyVM print: ' Failed to wait for process!! '! !
!STMProcess methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 21:15' 
prior: 33555705!
wait
        
        SPyVM print: '[squeak] wait'
        self primWait! !
!STMProcess methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 21:15' 
prior: 33556450!
wait
        
        SPyVM print: '[squeak] wait'.
        self primWait! !

----SNAPSHOT----{16 January 2014 . 9:15:29 pm} Squeak4.5-12568.image 
priorSource: 1681!
!BasicClassOrganizer methodsFor: 'accessing' stamp: 'toma 1/16/2014 22:18' 
prior: 17298983!
classComment
        classComment
                ifNil: [^ ''].
        ^ [classComment text ifNil: ['']] on: Error do: [^ ''].! !

Object subclass: #SPySTM
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: 'SPy-Benchmarks'!

Object subclass: #SPySTM
        instanceVariableNames: ''
        classVariableNames: 'Shared'
        poolDictionaries: ''
        category: 'SPy-Benchmarks'!
!SPySTM class methodsFor: 'nil' stamp: 'toma 1/16/2014 22:22'!
shared
        
        ^self Shared! !
!SPySTM class methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:23' 
prior: 33557264!
shared
        
        ^Shared! !
!SPySTM class methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:23'!
shared: aValue
        
        Shared := aValue! !

----SNAPSHOT----{16 January 2014 . 10:24:08 pm} Squeak4.5-12568.image 
priorSource: 2221!

Object subclass: #STMAtomic
        instanceVariableNames: 'lock'
        classVariableNames: ''
        poolDictionaries: ''
        category: 'Kernel-Processes'!
!STMAtomic methodsFor: 'nil' stamp: 'toma 1/16/2014 22:28'!
primEnter
        <primitive: 790>! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:28' 
prior: 33557810!
primEnter
        <primitive: 790>
        SPyVM print: 'primEnter failed'.! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:28' 
prior: 33557933!
primEnter
        <primitive: 790>
        
        SPyVM print: 'primEnter failed'.! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:29'!
primLeave
        <primitive: 791>
        
        SPyVM print: 'primLeave failed'.! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:29'!
value
        
        self primEnter.
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:29' 
prior: 33558376!
value
        
        | result |
        
        self primEnter.
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:30' 
prior: 33558498!
value
        
        | result |
        
        self primEnter.
        result := self.
        self primLeave
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:30' 
prior: 33558634!
value
        
        | result |
        
        self primEnter.
        result := self.
        self primLeave.
        ! !

Object subclass: #STMAtomic
        instanceVariableNames: 'block'
        classVariableNames: ''
        poolDictionaries: ''
        category: 'Kernel-Processes'!
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:31' 
prior: 33558803!
value
        
        | result |
        
        self primEnter.
        result := self block value.
        self primLeave.
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:31' 
prior: 33559111!
value
        
        | result error |
        
        self primEnter.
        result := self block value.
        self primLeave.
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:32' 
prior: 33559293!
value
        
        | result error |
        
        self primEnter.
        [result := self block value.] on: Error do: [:err | error := err]
        self primLeave.
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:32' 
prior: 33559481!
value
        
        | result error |
        
        self primEnter.
        error := nil.
        
        [result := self block value.] on: Error do: [:err | error := err]
        self primLeave.
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:32' 
prior: 33559707!
value
        
        | result error |
        
        self primEnter.
        error := nil.
        result := nil.
        [result := self block value.] on: Error do: [:err | error := err]
        self primLeave.
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:32' 
prior: 33559950!
value
        
        | result error |
        
        self primEnter.
        error := nil.
        result := nil.
        [result := self block value.] on: Error do: [:err | error := err].
        self primLeave.
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:33' 
prior: 33560207!
value
        
        | result error |
        
        self primEnter.
        error := nil.
        result := nil.
        [result := self block value.] on: Error do: [:err | error := err].
        self primLeave.
        error ifNotNil: [error raise]
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:33' 
prior: 33560465!
value
        
        | result error |
        
        self primEnter.
        error := nil.
        result := nil.
        [result := self block value.] on: Exception do: [:err | error := err].
        self primLeave.
        error ifNotNil: [error raise]
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:35' 
prior: 33560754!
value
        
        | result error |
        
        self primEnter.
        error := nil.
        result := nil.
        [result := self block value.] on: Exception do: [:err | error := err].
        self primLeave.
        error ifNotNil: [error pass]
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:35' 
prior: 33561047!
value
        
        | result error |
        
        self primEnter.
        error := nil.
        result := nil.
        [result := self block value.] on: Exception do: [:err | error := err].
        self primLeave.
        error ifNotNil: [error pass]
        
        ! !
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 22:35' 
prior: 33561339!
value
        
        | result error |
        
        self primEnter.
        error := nil.
        result := nil.
        [result := self block value.] on: Exception do: [:err | error := err].
        self primLeave.
        error ifNotNil: [error pass].
        ^result
        ! !
!STMAtomic class methodsFor: 'nil' stamp: 'toma 1/16/2014 22:36'!
from: aBlock
        
        ^ (STMAtomic new)
                block: aBlock;
                yourself.! !
!STMAtomic class methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 
22:36' prior: 33561909!
from: aBlock
        
        ^ (STMAtomic new)
                block: aBlock;
                yourself! !
!BlockClosure methodsFor: 'nil' stamp: 'toma 1/16/2014 22:37'!
atomic
        
        ^STMAtomic from: self! !

SystemOrganization addCategory: #'Kernel-STM'!

SystemOrganization classify: #STMAtomic under: #'Kernel-STM'!

SystemOrganization classify: #STMProcess under: #'Kernel-STM'!
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:40'!
benchStmAtomic
        ! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:40' prior: 33562476!
benchStmAtomic
        
        | sum |
        sum := 0.
        ! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:40' prior: 33562577!
benchStmAtomic
        
        | sum |
        sum := 0.
        
! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:40' prior: 33562700!
benchStmAtomic
        
        | sum |
        sum := 0.
        
        ! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:41'!
benchStmParallel
        
        | sum |
        sum := 0.
        
        ! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:41' prior: 33562933!
benchStmParallel
        
        | sum |
        sum := 0.
        
        (1 to: self) do: [ :i |
                [(1 to: 100) do: [ :k | sum := sum + k ]]
                ]! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:42' prior: 33563060!
benchStmParallel
        
        | sum |
        sum := 0.
        
        (1 to: 8) do: [ :i |
                [(1 to: 100) do: [ :k | sum := sum + k ]]
                ]! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:42' prior: 33563258!
benchStmParallel
        
        | sum |
        sum := 0.
        
        (1 to: 8) do: [ :i |
                [(i to: (i + 1000)) do: [ :k | sum := sum + k ]]
                ]! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:42' prior: 33563453!
benchStmParallel
        
        | sum |
        sum := 0.
        
        (1 to: 8) do: [ :i |
                [((i * 1000) to: ((i + 1) * 1000)) do: [ :k | sum := sum + k ]]
                ]! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:43' prior: 33563655!
benchStmParallel
        
        | sum |
        sum := 0.
        
        (1 to: 8) do: [ :i |
                [((i * 1000) to: ((i + 1) * 1000)) do: [ :k | sum := sum + k ]] 
parallelFork
                ]! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:43' prior: 33563872!
benchStmParallel
        
        | sum |
        sum := 0.
        
        (1 to: 8) do: [ :i |
                [((i * 1000) to: ((i + 1) * 1000)) do: [ :k | sum := sum + k. 
]] parallelFork.
                ]! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:43' prior: 33564102!
benchStmParallel
        
        | sum |
        sum := 0.
        
        (0 to: 7) do: [ :i |
                [((i * 1000) to: ((i + 1) * 1000)) do: [ :k | sum := sum + k. 
]] parallelFork.
                ]! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:43' prior: 33564334!
benchStmParallel
        
        | sum |
        sum := 0.
        
        (0 to: 7) do: [ :i |
                [((i * 1000) to: ((i + 1) * 1000)) do: [ :k | sum := sum + k. 
]] parallelFork.
                ]
        ! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:46' prior: 33564566!
benchStmParallel
        
        | sum t |
        sum := 0.
        
        (0 to: 7) collect: [ :i | 
                 [((i * 1000) to: ((i + 1) * 1000)) do: [ :k | 
                                sum := sum + k. ]
                        ] parallelFork
                ]
        ! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:46' prior: 33564800!
benchStmParallel
        
        | sum threads |
        sum := 0.
        
        threads := (0 to: 7) collect: [ :i | 
                 [((i * 1000) to: ((i + 1) * 1000)) do: [ :k | 
                                sum := sum + k. ]
                        ] parallelFork
                ]
        ! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:46' prior: 33565051!
benchStmParallel
        
        | sum threads |
        sum := 0.
        
        threads := (0 to: 7) collect: [ :i | 
                 [((i * 1000) to: ((i + 1) * 1000)) do: [ :k | 
                                sum := sum + k. ]
                        ] parallelFork
                ].
        threads do: [:t | t wait.]! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:46' prior: 33565319!
benchStmParallel
        
        | sum threads |
        sum := 0.
        
        threads := (0 to: 7) collect: [ :i | 
                 [((i * 1000) to: ((i + 1) * 1000)) do: [ :k | 
                                sum := sum + k. ]
                        ] parallelFork
                ].
        threads do: [:t | t wait].
        ^ sum printString! !

----SNAPSHOT----{16 January 2014 . 10:47:04 pm} Squeak4.5-12568.image 
priorSource: 3090!
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:56' prior: 33562824!
benchStmAtomic

        | sum threads |
        
        sum := 0.
        
        threads := (0 to: 7) collect: [ :i | 
                 [((i * 1000) to: ((i + 1) * 1000)) do: [ :k | 
                                [sum := sum + k. ] atomic value]
                        ] parallelFork
                ].
        threads do: [:t | t wait].
        ^ sum printString! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:57' prior: 33566018!
benchStmAtomic

        | sum threads |
        
        sum := 0.
        
        threads := (0 to: 7) collect: [ :i | 
                 [((i * 1000) to: ((i + 1) * 1000 - 1)) do: [ :k | 
                                [sum := sum + k. ] atomic value]
                        ] parallelFork
                ].
        threads do: [:t | t wait].
        ^ sum printString! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:57' prior: 33565614!
benchStmParallel
        
        | sum threads |
        sum := 0.
        
        threads := (0 to: 7) collect: [ :i | 
                 [((i * 1000) to: ((i + 1) * 1000 - 1)) do: [ :k | 
                                sum := sum + k. ]
                        ] parallelFork
                ].
        threads do: [:t | t wait].
        ^ sum printString! !
!Integer methodsFor: 'benchmarks' stamp: 'toma 1/16/2014 22:57' prior: 33566678!
benchStmParallel
        
        | sum threads |
        
        sum := 0.
        
        threads := (0 to: 7) collect: [ :i | 
                 [((i * 1000) to: ((i + 1) * 1000 - 1)) do: [ :k | 
                                sum := sum + k. ]
                        ] parallelFork
                ].
        threads do: [:t | t wait].
        ^ sum printString! !

----SNAPSHOT----{16 January 2014 . 10:58:17 pm} Squeak4.5-12568.image 
priorSource: 11414!
!STMAtomic methodsFor: 'as yet unclassified' stamp: 'toma 1/16/2014 23:01' 
prior: 33561633!
value
        
        | result  |
        
        self primEnter.
        result := self block value.
        self primLeave.
        ^result
        ! !
!STMAtomic methodsFor: 'accessing' stamp: 'toma 1/16/2014 23:02'!
block

        ^ block! !
!STMAtomic methodsFor: 'accessing' stamp: 'toma 1/16/2014 23:02'!
block: anObject

        block := anObject! !

[ 1 + 1 ] atomic value!

[ 1 + 1 ] atomic value!

----SNAPSHOT----{16 January 2014 . 11:03:21 pm} Squeak4.5-12568.image 
priorSource: 12802!

----SNAPSHOT----{16 January 2014 . 11:03:41 pm} Squeak4.5-12568.image 
priorSource: 13325!

----SNAPSHOT----{16 January 2014 . 11:03:45 pm} Squeak4.5-12568.image 
priorSource: 13416!
\ No newline at end of file
diff --git a/images/Squeak4.5-12568.image b/images/Squeak4.5-12568.image
index 
dc45966a305272c20be414ebb0d82b0468d38509..52d50d90e1a3266b6a85440b56a284a4acc08984
GIT binary patch

[cut]

diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -1235,6 +1235,8 @@
 STM_FORK = 1299  # 787 (+ 512) # resume in native thread
 STM_SIGNAL = 1300  # 788
 STM_WAIT = 1301  # 789
+STM_ATOMIC_ENTER = 1302  # 790
+STM_ATOMIC_LEAVE = 1303  # 791
 
 SUSPEND = 88
 FLUSH_CACHE = 89
@@ -1418,6 +1420,20 @@
     print "STM Rendezvous"
     print "Should break: %s" % rstm.should_break_transaction()
 
+@expose_primitive(STM_ATOMIC_ENTER, unwrap_spec=[object], no_result=True)
+def func(interp, s_frame, w_rcvr):
+    from rpython.rlib import rstm
+
+    print "STM_ATOMIC_ENTER primitive called"
+    rstm.increment_atomic()
+
+@expose_primitive(STM_ATOMIC_LEAVE, unwrap_spec=[object], no_result=True)
+def func(interp, s_frame, w_rcvr):
+    from rpython.rlib import rstm
+
+    print "STM_ATOMIC_LEAVE primitive called"
+    rstm.decrement_atomic()
+
 
 @expose_primitive(SUSPEND, unwrap_spec=[object], result_is_new_frame=True, 
clean_stack=False)
 def func(interp, s_frame, w_rcvr):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to