migrated semaphore signal/unsignal methods from System to Semaphore

This commit is contained in:
hyunghwan.chung
2018-05-18 08:10:16 +00:00
parent faef93e7d7
commit 4da0731312
7 changed files with 277 additions and 309 deletions

View File

@ -104,6 +104,15 @@ class Semaphore(Object)
## ==================================================================
method(#primitive) signalAfterSecs: secs.
method(#primitive) signalAfterSecs: secs nanosecs: nanosecs.
method(#primitive) signalOnInput: io_handle.
method(#primitive) signalOnOutput: io_handle.
method(#primitive) signalOnGCFin.
method(#primitive) unsignal.
## ==================================================================
method heapIndex: index
{
self.heapIndex := index.
@ -214,7 +223,7 @@ method(#class,#abstract) xxx. => method(#class) xxx { self subclassResponsibilit
[
## arrange the processor to notify upon timeout.
System signal: s afterSecs: seconds.
s signalAfterSecs: seconds.
## wait on the semaphore group.
r := self wait.
@ -227,9 +236,9 @@ method(#class,#abstract) xxx. => method(#class) xxx { self subclassResponsibilit
## System<<unsignal: doesn't thrown an exception even if the semaphore s is not
## register with System<<signal:afterXXX:. otherwise, i would do like this line
## commented out.
## [ System unsignal: s ] ensure: [ self removeSemaphore: s ].
## [ s unsignal ] ensure: [ self removeSemaphore: s ].
System unsignal: s.
s unsignal.
self removeSemaphore: s
].

View File

@ -302,8 +302,6 @@ class SyncSocket(CoreSocket)
self.sg addSemaphore: self.tmoutsem.
}
method beWatched
{
## do nothing. i don't want to be watched.
@ -315,20 +313,36 @@ class SyncSocket(CoreSocket)
self.tmoutnsecs := 0.
}
method __wait_for_input
{
| s |
if (self.tmoutsecs notNil) { self.tmoutsem signalAfterSecs: self.tmoutsecs nanosecs: self.tmoutnsecs }.
self.iosem signalOnInput: self.handle.
s := self.sg wait.
self.iosem unsignal.
if (self.tmoutsecs notNil) { self.tmoutsem unsignal }.
if (s == self.tmoutsem) { Exception signal: 'timed out' }.
}
method __wait_for_output
{
| s |
if (self.tmoutsecs notNil) { self.tmoutsem signalAfterSecs: self.tmoutsecs nanosecs: self.tmoutnsecs }.
self.iosem signalOnOutput: self.handle.
s := self.sg wait.
self.iosem unsignal.
if (self.tmoutsecs notNil) { self.tmoutsem unsignal }.
if (s == self.tmoutsem) { Exception signal: 'timed out' }.
}
method readBytes: bytes
{
| n s |
| n |
while (true)
{
n := super readBytes: bytes.
if (n >= 0) { ^n }.
if (self.tmoutsecs notNil) { System signal: self.tmoutsem afterSecs: self.tmoutsecs nanosecs: self.tmoutnsecs }.
System signal: self.iosem onInput: self.handle.
s := self.sg wait.
System unsignal: self.iosem.
if (self.tmoutsecs notNil) { System unsignal: self.tmoutsem }.
if (s == self.tmoutsem) { Exception signal: 'timed out' }.
self __wait_for_input.
}
}
@ -339,10 +353,7 @@ class SyncSocket(CoreSocket)
{
n := super readBytes: bytes offset: offset length: length.
if (n >= 0) { ^n }.
System signal: self.iosem onInput: self.handle.
self.sg wait.
System unsignal: self.iosem.
self __wait_for_input.
}
}
@ -353,10 +364,7 @@ class SyncSocket(CoreSocket)
{
n := super _writeBytes: bytes.
if (n >= 0) { ^n }.
System signal: self.iosem onOutput: self.handle.
self.sg wait.
System unsignal: self.iosem.
self __wait_for_output.
}
}
@ -367,10 +375,7 @@ class SyncSocket(CoreSocket)
{
n := super _writeBytes: bytes offset: offset length: length.
if (n >= 0) { ^n }.
System signal: self.iosem onOutput: self.handle.
self.sg wait.
System unsignal: self.iosem.
self __wait_for_output.
}
}
}
@ -434,7 +439,7 @@ extend Socket
self.outdonesem signalAction: [ :sem |
self onSocketDataOut.
System unsignal: self.outreadysem.
self.outreadysem unsignal.
].
self.outreadysem signalAction: [ :sem |
@ -478,21 +483,21 @@ extend Socket
{
if (self.outdonesem notNil)
{
System unsignal: self.outdonesem.
self.outdonesem unsignal.
if (self.outdonesem _group notNil) { thisProcess removeAsyncSemaphore: self.outdonesem }.
self.outdonesem := nil.
}.
if (self.outreadysem notNil)
{
System unsignal: self.outreadysem.
self.outreadysem unsignal.
if (self.outreadysem _group notNil) { thisProcess removeAsyncSemaphore: self.outreadysem }.
self.outreadysem := nil.
}.
if (self.inreadysem notNil)
{
System unsignal: self.inreadysem.
self.inreadysem unsignal.
if (self.inreadysem _group notNil) { thisProcess removeAsyncSemaphore: self.inreadysem }.
self.inreadysem := nil.
}.
@ -503,7 +508,7 @@ extend Socket
method beWatched
{
thisProcess addAsyncSemaphore: self.inreadysem.
System signal: self.inreadysem onInput: self.handle.
self.inreadysem signalOnInput: self.handle.
thisProcess addAsyncSemaphore: self.outdonesem.
}
@ -542,7 +547,7 @@ extend Socket
self.pending_length := rem.
thisProcess addAsyncSemaphore: self.outreadysem.
System signal: self.outreadysem onOutput: self.handle.
self.outreadysem signalOnOutput: self.handle.
}
method writeBytes: bytes
@ -581,7 +586,7 @@ class ClientSocket(Socket)
if (soerr >= 0)
{
## finalize connection if not in progress
System unsignal: sem.
sem unsignal.
thisProcess removeAsyncSemaphore: sem.
self onSocketConnected: (soerr == 0).
@ -595,7 +600,7 @@ class ClientSocket(Socket)
{
if (self.connsem notNil)
{
System unsignal: self.connsem.
self.connsem unsignal.
if (self.connsem _group notNil) { thisProcess removeAsyncSemaphore: self.connsem }.
self.connsem := nil.
}.
@ -608,7 +613,7 @@ class ClientSocket(Socket)
if ((self _connect: target) <= -1)
{
thisProcess addAsyncSemaphore: self.connsem.
System signal: self.connsem onOutput: self.handle.
self.connsem signalOnOutput: self.handle.
}
else
{
@ -617,7 +622,7 @@ class ClientSocket(Socket)
self onSocketConnected: true.
thisProcess addAsyncSemaphore: self.inreadysem.
System signal: self.inreadysem onInput: self.handle.
self.inreadysem signalOnInput: self.handle.
thisProcess addAsyncSemaphore: self.outdonesem.
}
}
@ -655,7 +660,7 @@ class ServerSocket(Socket)
'CLOSING SERVER SOCEKT.... ' dump.
if (self.inreadysem notNil)
{
System unsignal: self.inreadysem.
self.inreadysem unsignal.
if (self.inreadysem _group notNil) { thisProcess removeAsyncSemaphore: self.inreadysem }.
self.inreadysem := nil.
}.
@ -671,12 +676,12 @@ class ServerSocket(Socket)
## added to the multiplexer, a spurious hangup event might
## be generated. At least, such behavior was observed
## in linux with epoll in the level trigger mode.
## System signal: self.inreadysem onInput: self.handle.
## self.inreadysem signalOnInput: self.handle.
## thisProcess addAsyncSemaphore: self.inreadysem.
## self _listen: backlog.
n := self _listen: backlog.
System signal: self.inreadysem onInput: self.handle.
self.inreadysem signalOnInput: self.handle.
thisProcess addAsyncSemaphore: self.inreadysem.
^n.
}

View File

@ -51,12 +51,13 @@ class System(Apex)
method(#class) __gc_finalizer
{
| tmp gc fin_sem |
| tmp gc gcfin_sem |
gc := false.
fin_sem := Semaphore new.
gcfin_sem := Semaphore new.
gcfin_sem signalOnGCFin.
self signalOnGCFin: fin_sem.
[
while (true)
{
@ -87,11 +88,11 @@ class System(Apex)
##System logNl: '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^gc_waiting....'.
##System sleepForSecs: 1. ## TODO: wait on semaphore instead..
fin_sem wait.
gcfin_sem wait.
##System logNl: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gc_waitED....'.
}
] ensure: [
System unsignal: fin_sem.
gcfin_sem unsignal.
System logNl: 'End of GC finalization process ' & (thisProcess id) asString.
].
}
@ -101,15 +102,6 @@ class System(Apex)
method(#class,#primitive) gc.
method(#class,#primitive) return: object to: context.
## =======================================================================================
method(#class,#primitive) signal: semaphore afterSecs: secs.
method(#class,#primitive) signal: semaphore afterSecs: secs nanosecs: nanosecs.
method(#class,#primitive) signal: semaphore onInput: file.
method(#class,#primitive) signal: semaphore onOutput: file.
method(#class,#primitive) signalOnGCFin: semaphore.
method(#class,#primitive) unsignal: semaphore.
## =======================================================================================
method(#class) sleepForSecs: secs
{

View File

@ -589,7 +589,7 @@ extend X11
if (self.event_loop_sem isNil)
{
self.event_loop_sem := Semaphore new.
System signal: self.event_loop_sem onInput: (self _get_fd).
self.event_loop_sem signalOnInput: (self _get_fd).
self.event_loop_proc := [
| llevtbuf llevent ongoing |
@ -618,7 +618,7 @@ extend X11
'CLOSING X11 EVENT LOOP' dump.
System unsignal: self.event_loop_sem.
self.event_loop_sem unsignal.
## TODO: LOOK HERE FOR RACE CONDITION
self.event_loop_sem := nil.
self.event_loop_proc := nil.

View File

@ -38,9 +38,9 @@ class MyObject(Object)
sg addSemaphore: s2.
sg addSemaphore: s3.
System signal: s1 onInput: 0.
##System signal: s2 onInput: 0. ## this should raise an exception.
##System signal: s3 onInput: 0.
s1 signalOnInput: 0.
s2 signalOnInput: 0. ## this should raise an exception.
s3 signalOnInput: 0.
[ sg wait. ] fork.
[ sg wait. ] fork.