JavaMonitor.st
changeset 3780 57bbc3e4d650
parent 3779 973f2396c750
child 3783 f7c384698e7f
--- a/JavaMonitor.st	Sat Aug 12 22:11:28 2017 +0100
+++ b/JavaMonitor.st	Fri Aug 25 12:31:16 2017 +0100
@@ -170,6 +170,10 @@
 !JavaMonitor methodsFor:'public'!
 
 acquire
+    "Acquire (enter) the monitor and return `true`.
+
+     See JVM spec, section 4.5, MONITORENTER.
+    "
     | thisProcess wasBlocked hasAcquired |
     hasAcquired := nil.
     thisProcess := Processor activeProcess.
@@ -208,73 +212,96 @@
 
     "Created: / 20-11-2011 / 13:21:46 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Modified: / 11-08-2017 / 22:08:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 14-08-2017 / 09:34:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 enter
-    self acquire.
+    <resource: #obsolete>
+    self obsoleteMethodWarning: 'Use #acquire instead'.     
+    ^ self acquire.
 
     "Created: / 20-11-2011 / 13:21:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 03-06-2017 / 23:11:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 14-08-2017 / 10:20:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 exit
-    | thisProcess |
-
-    "JV@2017-06-03: Question: Is it legal (i.e., is the good reason to) call #exit 
-     on a monitor by a process that does not own it? Shouldn't we rather throw an 
-     error"
-    thisProcess := Processor activeProcess.
-    owningProcess == thisProcess ifTrue: [ self release. ].
+    <resource: #obsolete>
+    self obsoleteMethodWarning: 'Use #release instead'.     
+    ^ self release.
 
     "Created: / 20-11-2011 / 13:21:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 12-08-2017 / 21:27:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 14-08-2017 / 10:20:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 notify
-    "wakeup one waiting process"
+    <resource: #obsolete>
+    self obsoleteMethodWarning: 'Use `notify: false` instead'.
+    ^ self notify: false.
+
+    "Created: / 22-11-2011 / 12:14:23 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-08-2017 / 10:19:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+notify: all
+    "
+    An implementation of java.lang.Object#notify() and #notifyAll(). If `all` is
+    `true` then all waiting threads are notified (see #norifyAll()) otherwise only
+    one thread is notified (see #notify()). Returns `true` after when threads have 
+    been notified or `false` if calling thread does not own the monitor.
+
+    See Java API documentation for java.lang.Object#notify() and #notifyAll().
+        https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify()
+        https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notifyAll()
+    "
     
     | thisProcess |
     thisProcess := Processor activeProcess.
-    self assert: owningProcess == thisProcess.
+    owningProcess == thisProcess ifFalse:[ 
+        "/ Oops,  calling thread does not own the monitor. return false
+        "/ immediately. The caller is responsible for throwing
+        "/ IllegalMonitorStateException...
+        ^ false.
+    ].
     JavaVM monitorTrace ifTrue:[
         Logger 
-            log: ('%1: notifying %2 processes' bindWith: thisProcess printString
+            log: ('%1: notifying %1%2 processes' bindWith: thisProcess printString
+                    with: (all ifTrue:[ 'all ' ] ifFalse:[ '' ])
                     with: waitingSema waitingProcesses size)
             severity: Logger severityDEBUG
             facility: #JVM.
     ].
-    waitingSema signal.
+    all ifTrue:[ waitingSema signalForAll ] ifFalse:[ waitingSema signal ].
     Processor yield.
+    ^ true
 
-    "Created: / 22-11-2011 / 12:14:23 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 11-08-2017 / 22:25:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 14-08-2017 / 10:17:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 notifyAll
-    "wakeup one waiting process"
-    
-    | thisProcess |
-    thisProcess := Processor activeProcess.
-    self assert: owningProcess == thisProcess.
-    JavaVM monitorTrace ifTrue:[
-        Logger 
-            log: ('%1: notifying all %2 processes' bindWith: thisProcess printString
-                    with: waitingSema waitingProcesses size)
-            severity: Logger severityDEBUG
-            facility: #JVM.
-    ].
-    waitingSema signalForAll.
-    Processor yield.
+    <resource: #obsolete>
+    self obsoleteMethodWarning: 'Use `notify: true` instead'.
+    ^ self notify: true.
 
     "Created: / 22-11-2011 / 12:14:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 11-08-2017 / 22:26:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 14-08-2017 / 10:19:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 release
+    "Release (leave) the monitor and return `true` if
+     monitor was release, `false` if monitor has not
+     been released (because calling thread does not own it).
+
+     See JVM spec, section 4.5, MONITOREXIT.       
+    "
     | thisProcess wasBlocked |
 
     thisProcess := Processor activeProcess.
-    self assert: owningProcess == thisProcess.
+    owningProcess == thisProcess ifFalse:[ 
+        "/ Oops,  calling thread does not own the monitor. return false
+        "/ immediately. The caller is responsible for throwing
+        "/ IllegalMonitorStateException...
+        ^ false.
+    ].
     wasBlocked := OperatingSystem blockInterrupts.
     count == 1 ifTrue:[ 
         owningProcess := nil.
@@ -284,25 +311,40 @@
         count := count - 1.
     ].
     wasBlocked ifFalse:[ OperatingSystem unblockInterrupts ].
+    ^ true
 
     "Created: / 20-11-2011 / 13:21:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Modified: / 12-08-2017 / 21:28:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 14-08-2017 / 09:35:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 wait
-    "make owning process to go to wait"
-    
-    self waitForMilliseconds: nil.
+    <resource: #obsolete>    
+    self obsoleteFeatureWarning: 'Use `waitForMilliseconds: nil` insteead'.        
+    ^ self waitForMilliseconds: nil.
 
     "Created: / 22-11-2011 / 11:57:56 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-08-2017 / 09:37:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 waitForMilliseconds: timeOut 
-    "make owning process to go to wait, but not longer than timeout"
+    "
+    An implementation of java.lang.Object#wait(long). Returns `true`
+    after waiting or `false` immediately (i.e., won't block) if calling
+    thread does not own the monitor.
+
+    See Java API documentation for java.lang.Object#wait(long):
+        https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait(long)
+    "
     
     | thisProcess countBeforeWait |
     thisProcess := Processor activeProcess.
-    self assert: owningProcess == thisProcess.
+    owningProcess == thisProcess ifFalse:[ 
+        "/ Oops,  calling thread does not own the monitor. return false
+        "/ immediately. The caller is responsible for throwing
+        "/ IllegalMonitorStateException...
+        ^ false.
+    ].
     self waitEnabled ifFalse: [
         JavaVM monitorTrace ifTrue:[
             Logger 
@@ -312,7 +354,7 @@
                 severity: Logger severityDEBUG
                 facility: #JVM.
         ].
-        ^ self.
+        ^ true.
     ].
     JavaVM monitorTrace ifTrue:[
         Logger 
@@ -343,11 +385,12 @@
     ].
     "/ We have been notified, re-acquire the monitor
     self acquire.
-    count := countBeforeWait. "/ note that at this point we already own the monitor
+    count := countBeforeWait. "/ note that at this point we already own the monitor.
+    ^ true.
 
     "Created: / 22-11-2011 / 12:52:45 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Modified: / 01-12-2011 / 10:57:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 11-08-2017 / 23:04:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 14-08-2017 / 09:52:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaMonitor methodsFor:'queries'!