touched up user-defined signal handling
This commit is contained in:
parent
3db6820932
commit
e1e577ec22
@ -31,7 +31,7 @@ class System(Apex)
|
|||||||
|
|
||||||
method(#class) _initialize
|
method(#class) _initialize
|
||||||
{
|
{
|
||||||
self.shr := Set new.
|
self.shr := OrderedCollection new.
|
||||||
self.asyncsg := SemaphoreGroup new.
|
self.asyncsg := SemaphoreGroup new.
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ class System(Apex)
|
|||||||
|
|
||||||
method(#class) installSignalHandler: block
|
method(#class) installSignalHandler: block
|
||||||
{
|
{
|
||||||
self.shr add: block.
|
self.shr addLast: block.
|
||||||
}
|
}
|
||||||
|
|
||||||
method(#class) uninstallSignalHandler: block
|
method(#class) uninstallSignalHandler: block
|
||||||
@ -168,7 +168,7 @@ class System(Apex)
|
|||||||
|
|
||||||
ifnot (self.shr isEmpty)
|
ifnot (self.shr isEmpty)
|
||||||
{
|
{
|
||||||
self.shr do: [ :handler | handler value: signo ]
|
self.shr do: [ :handler | handler value: signo ].
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -277,9 +277,9 @@ widget windowHandle dump.
|
|||||||
{
|
{
|
||||||
if (self.gcHandle notNil)
|
if (self.gcHandle notNil)
|
||||||
{
|
{
|
||||||
self.widget displayServer _destroy_gc (self).
|
self.widget displayServer _destroy_gc(self).
|
||||||
self.gcHandle := nil
|
self.gcHandle := nil.
|
||||||
}
|
}.
|
||||||
}
|
}
|
||||||
|
|
||||||
method apply
|
method apply
|
||||||
@ -466,6 +466,8 @@ class X11.Composite(X11.Widget)
|
|||||||
method remove: widget
|
method remove: widget
|
||||||
{
|
{
|
||||||
| link |
|
| link |
|
||||||
|
if (widget parent notNil) // TODO: DEBUG. check if this widget is being disposed multiple times. I see this method called with 'widget parent' of nil.
|
||||||
|
{
|
||||||
if (widget parent ~~ self)
|
if (widget parent ~~ self)
|
||||||
{
|
{
|
||||||
selfns.Exception signal: "Cannot remove an unknown widget"
|
selfns.Exception signal: "Cannot remove an unknown widget"
|
||||||
@ -474,6 +476,7 @@ class X11.Composite(X11.Widget)
|
|||||||
link := self.children findIdenticalLink: widget.
|
link := self.children findIdenticalLink: widget.
|
||||||
self.children removeLink: link.
|
self.children removeLink: link.
|
||||||
widget parent: nil.
|
widget parent: nil.
|
||||||
|
}.
|
||||||
}
|
}
|
||||||
|
|
||||||
method childrenCount
|
method childrenCount
|
||||||
@ -499,7 +502,10 @@ class X11.Composite(X11.Widget)
|
|||||||
child dispose.
|
child dispose.
|
||||||
self remove: child.
|
self remove: child.
|
||||||
].
|
].
|
||||||
super dispose
|
'Composite dispose DONE XXXXXXXXXXXXXX' dump.
|
||||||
|
'SUPER SUPER SUPER dispose' dump.
|
||||||
|
super dispose.
|
||||||
|
'SUPER SUPER SUPER dispose DONE' dump.
|
||||||
}
|
}
|
||||||
|
|
||||||
method onPaintEvent: event
|
method onPaintEvent: event
|
||||||
@ -655,24 +661,20 @@ extend X11
|
|||||||
{
|
{
|
||||||
if (self.event_loop_sem isNil)
|
if (self.event_loop_sem isNil)
|
||||||
{
|
{
|
||||||
|
|
||||||
self.event_loop_sem := Semaphore new.
|
self.event_loop_sem := Semaphore new.
|
||||||
self.event_loop_sem signalOnInput: (self _get_fd).
|
self.event_loop_sem signalOnInput: (self _get_fd).
|
||||||
self.event_loop_proc := [
|
self.event_loop_proc := [
|
||||||
|
|
||||||
[
|
[
|
||||||
| llevtbuf llevent ongoing |
|
| llevtbuf llevent |
|
||||||
|
|
||||||
self.event_loop_exit_req := false.
|
self.event_loop_exit_req := false.
|
||||||
llevtbuf := X11.LLEvent new.
|
llevtbuf := X11.LLEvent new.
|
||||||
ongoing := true.
|
|
||||||
while (self.shell_container childrenCount > 0)
|
while (self.shell_container childrenCount > 0)
|
||||||
{
|
{
|
||||||
'Waiting for X11 event...' dump.
|
'Waiting for X11 event...' dump.
|
||||||
if (self.event_loop_exit_req) { break }.
|
if (self.event_loop_exit_req) { break }.
|
||||||
self.event_loop_sem wait.
|
self.event_loop_sem wait.
|
||||||
if (self.event_loop_exit_req) { break }.
|
if (self.event_loop_exit_req) { break }.
|
||||||
ifnot (ongoing) { break }.
|
|
||||||
|
|
||||||
while ((llevent := self _get_llevent(llevtbuf)) notNil)
|
while ((llevent := self _get_llevent(llevtbuf)) notNil)
|
||||||
{
|
{
|
||||||
@ -680,7 +682,6 @@ extend X11
|
|||||||
{
|
{
|
||||||
//System logNl: ('Error while getting a event from server ' & self.cid asString).
|
//System logNl: ('Error while getting a event from server ' & self.cid asString).
|
||||||
self.event_loop_exit_req := true.
|
self.event_loop_exit_req := true.
|
||||||
ongoing := false.
|
|
||||||
break.
|
break.
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -690,9 +691,7 @@ extend X11
|
|||||||
}.
|
}.
|
||||||
}.
|
}.
|
||||||
] ensure: [
|
] ensure: [
|
||||||
|
|
||||||
'CLOSING X11 EVENT LOOP' dump.
|
'CLOSING X11 EVENT LOOP' dump.
|
||||||
|
|
||||||
//self.event_loop_sem signal. // in case the process is suspended in self.event_loop_sem wait.
|
//self.event_loop_sem signal. // in case the process is suspended in self.event_loop_sem wait.
|
||||||
self.event_loop_sem unsignal.
|
self.event_loop_sem unsignal.
|
||||||
// TODO: LOOK HERE FOR RACE CONDITION with exitEventLoop.
|
// TODO: LOOK HERE FOR RACE CONDITION with exitEventLoop.
|
||||||
@ -701,10 +700,16 @@ extend X11
|
|||||||
|
|
||||||
[ self dispose ] on: Exception do: [:ex | ("WARNING: dispose failure...." & ex messageText) dump ].
|
[ self dispose ] on: Exception do: [:ex | ("WARNING: dispose failure...." & ex messageText) dump ].
|
||||||
]
|
]
|
||||||
] fork.
|
] newProcess.
|
||||||
|
|
||||||
|
self.event_loop_proc resume.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////
|
||||||
|
// TOOD: exitEventLoop to terminate the whole process by force or
|
||||||
|
// requestToExit to signal process after having set a flag?
|
||||||
|
// what is better?
|
||||||
method exitEventLoop
|
method exitEventLoop
|
||||||
{
|
{
|
||||||
if (self.event_loop_sem notNil)
|
if (self.event_loop_sem notNil)
|
||||||
@ -716,16 +721,12 @@ extend X11
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
method signal_event_loop_semaphore
|
|
||||||
{
|
|
||||||
self.event_loop_sem signal.
|
|
||||||
}
|
|
||||||
|
|
||||||
method requestToExit
|
method requestToExit
|
||||||
{
|
{
|
||||||
self.event_loop_exit_req := true.
|
self.event_loop_exit_req := true.
|
||||||
self.event_loop_sem signal.
|
self.event_loop_sem signal.
|
||||||
}
|
}
|
||||||
|
/////////////////////////////////////////
|
||||||
|
|
||||||
method __dispatch_llevent: llevent
|
method __dispatch_llevent: llevent
|
||||||
{
|
{
|
||||||
@ -810,7 +811,6 @@ class MyObject(Object)
|
|||||||
method initialize
|
method initialize
|
||||||
{
|
{
|
||||||
self.on_sig := [:sig |
|
self.on_sig := [:sig |
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx' dump.
|
|
||||||
self.disp1 requestToExit.
|
self.disp1 requestToExit.
|
||||||
self.disp2 requestToExit.
|
self.disp2 requestToExit.
|
||||||
].
|
].
|
||||||
|
@ -613,7 +613,7 @@ static void dump_process_info (moo_t* moo, moo_bitmask_t log_mask)
|
|||||||
{
|
{
|
||||||
moo_ooi_t io_handle;
|
moo_ooi_t io_handle;
|
||||||
|
|
||||||
MOO_LOG0 (moo, log_mask, "> IO Semaphores:");
|
MOO_LOG0 (moo, log_mask, "> IO semaphores:");
|
||||||
for (io_handle = 0; io_handle < moo->sem_io_map_capa; io_handle++)
|
for (io_handle = 0; io_handle < moo->sem_io_map_capa; io_handle++)
|
||||||
{
|
{
|
||||||
moo_ooi_t index;
|
moo_ooi_t index;
|
||||||
|
Loading…
Reference in New Issue
Block a user