added experimental code that implements singal callback in semaphore

This commit is contained in:
hyunghwan.chung
2017-10-05 17:14:38 +00:00
parent a54c2e21f2
commit 1fd9ce285c
5 changed files with 65 additions and 41 deletions

View File

@ -60,12 +60,21 @@ class Semaphore(Object)
ioHandle := nil,
ioMask := 0.
var (#get,#set) signalAction := nil.
var(#get,#set) _group := nil.
## ==================================================================
method(#primitive) signal.
method(#primitive) wait.
method(#primitive) _wait.
method wait
{
| k |
k := self _wait.
if (self.signalAction notNil) { self.signalAction value: self }.
^k
}
## ==================================================================
@ -246,7 +255,15 @@ method(#class,#abstract) xxx. => method(#class) xxx { self subclassResponsibilit
}
}
method(#primitive) wait.
method(#primitive) _wait.
method wait
{
| r |
r := self wait.
if (r signalAction notNil) { r signalAction value: r }.
^r
}
method waitWithTimeout: seconds
{
@ -267,7 +284,8 @@ method(#class,#abstract) xxx. => method(#class) xxx { self subclassResponsibilit
## if the internal semaphore has been signaled,
## arrange to return nil to indicate timeout.
if (r == s) { r := nil }.
if (r == s) { r := nil }
elsif (r signalAction notNil) { r signalAction value: r }.
## nullify the membership
s _group: nil.