added some experimental code to support object finalization
This commit is contained in:
@ -130,6 +130,12 @@ extend Apex
|
||||
else { self primitiveFailed }
|
||||
}
|
||||
|
||||
(* ------------------------------------------------------------------
|
||||
* FINALIZATION SUPPORT
|
||||
* ------------------------------------------------------------------ *)
|
||||
method(#dual,#primitive) addToBeFinalized.
|
||||
##method(#dual,#primitive) removeToBeFinalized.
|
||||
|
||||
(* ------------------------------------------------------------------
|
||||
* HASHING
|
||||
* ------------------------------------------------------------------ *)
|
||||
|
@ -10,6 +10,45 @@
|
||||
|
||||
class System(Apex)
|
||||
{
|
||||
method(#class) startup(class_name, method_name)
|
||||
{
|
||||
| class ret |
|
||||
|
||||
class := System at: class_name.
|
||||
if (class isError)
|
||||
{
|
||||
System error: ('Cannot find the class - ' & class_name).
|
||||
}.
|
||||
|
||||
## start the gc finalizer process
|
||||
[ self __gc_finalizer ] fork.
|
||||
|
||||
## TODO: change the method signature to variadic and pass extra arguments to perform???
|
||||
ret := class perform: method_name.
|
||||
|
||||
#### System logNl: '======= END of startup ==============='.
|
||||
^ret.
|
||||
}
|
||||
|
||||
method(#class) __gc_finalizer
|
||||
{
|
||||
| tmp |
|
||||
|
||||
while (true)
|
||||
{
|
||||
## TODO: exit from this loop when there are no other processes running.
|
||||
while ((tmp := self _popCollectable) notError)
|
||||
{
|
||||
## TODO: Do i have to protected this in an exception handler???
|
||||
tmp finalize.
|
||||
}.
|
||||
|
||||
System logNl: 'gc_waiting....'.
|
||||
Processor sleepFor: 1. ## TODO: wait on semaphore instead..
|
||||
}
|
||||
}
|
||||
|
||||
method(#class,#primitive) _popCollectable.
|
||||
}
|
||||
|
||||
pooldic System.Log
|
||||
|
@ -300,10 +300,13 @@ class X11.Widget(Object)
|
||||
|
||||
method onPaintEvent: paint_event
|
||||
{
|
||||
System logNl: 'Widget...... onPaintEvent YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY.'.
|
||||
}
|
||||
|
||||
method onButtonEvent: event
|
||||
method onMouseButtonEvent: event
|
||||
{
|
||||
}
|
||||
|
||||
method onKeyEvent: event
|
||||
{
|
||||
}
|
||||
|
||||
@ -337,23 +340,45 @@ class X11.Label(X11.Widget)
|
||||
method onPaintEvent: paint_event
|
||||
{
|
||||
| gc |
|
||||
System logNl: 'LABEL GC...... onPaintEvent YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY.'.
|
||||
|
||||
gc := selfns.GC new: self.
|
||||
[
|
||||
gc foreground: self.fgcolor;
|
||||
gc foreground: self.bgcolor;
|
||||
fontName: '-misc-fixed-medium-r-normal-ko-18-120-100-100-c-180-iso10646-1';
|
||||
apply.
|
||||
gc fillRectangle (0, 0, self.width, self.height).
|
||||
|
||||
gc foreground: self.fgcolor; apply.
|
||||
gc drawRectangle (0, 0, self.width - 1, self.height - 1).
|
||||
##gc fillRectangle (0, 0, self.width, self.height).
|
||||
##gc drawLine (0, y, CTRLWIDE, y).
|
||||
##gc drawLine (0, y + CHIGH + 4, CTRLWIDE, Y+CHIGH+4).
|
||||
|
||||
gc drawString(10, 10, self.text).
|
||||
] ensure: [ gc dispose ]
|
||||
}
|
||||
}
|
||||
|
||||
class X11.Button(X11.Label)
|
||||
{
|
||||
method onMouseButtonEvent: llevent
|
||||
{
|
||||
| type x |
|
||||
type := llevent type.
|
||||
if (type == X11.LLEventType.BUTTON_PRESS)
|
||||
{
|
||||
x := self.fgcolor.
|
||||
self.fgcolor := self.bgcolor.
|
||||
self.bgcolor := x.
|
||||
self onPaintEvent: llevent.
|
||||
}
|
||||
elsif (type == X11.LLEventType.BUTTON_RELEASE)
|
||||
{
|
||||
x := self.fgcolor.
|
||||
self.fgcolor := self.bgcolor.
|
||||
self.bgcolor := x.
|
||||
self onPaintEvent: llevent.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class X11.Composite(X11.Widget)
|
||||
{
|
||||
var children.
|
||||
@ -646,8 +671,9 @@ extend X11
|
||||
widget onPaintEvent: llevent
|
||||
}
|
||||
|
||||
method __handle_button_event: event on: widget
|
||||
method __handle_button_event: llevent on: widget
|
||||
{
|
||||
widget onMouseButtonEvent: llevent
|
||||
}
|
||||
|
||||
method __handle_destroy_notify: event on: widget
|
||||
@ -664,8 +690,9 @@ extend X11
|
||||
widget close: event.
|
||||
}
|
||||
|
||||
method __handle_key_event: event on: widget
|
||||
method __handle_key_event: llevent on: widget
|
||||
{
|
||||
widget onKeyEvent: llevent
|
||||
}
|
||||
|
||||
method __handle_shell_close: llevent on: widget
|
||||
@ -675,7 +702,18 @@ extend X11
|
||||
}
|
||||
|
||||
|
||||
class Fx(Object)
|
||||
{
|
||||
method initialize
|
||||
{
|
||||
self addToBeFinalized.
|
||||
}
|
||||
|
||||
method finalize
|
||||
{
|
||||
System logNl: 'Greate... FX instance finalized'.
|
||||
}
|
||||
}
|
||||
|
||||
class MyObject(Object)
|
||||
{
|
||||
@ -706,16 +744,23 @@ class MyObject(Object)
|
||||
comp1 add: (X11.Label new text: '간다'; width: 100; height: 100).
|
||||
comp1 add: (X11.Label new text: 'crayon'; x: 90; y: 90; width: 100; height: 100).
|
||||
## self.shell1 add: (X11.Label new text: 'xxxxxxxx'; width: 100; height: 100).
|
||||
self.shell1 add: (X11.Label new text: 'crayon'; x: 90; y: 90; width: 100; height: 100).
|
||||
self.shell1 add: (X11.Button new text: '크레용crayon'; x: 90; y: 90; width: 100; height: 100).
|
||||
|
||||
self.shell2 add: (X11.Label new text: 'crayon'; x: 90; y: 90; width: 100; height: 100).
|
||||
self.shell3 add: (X11.Label new text: 'crayon'; x: 90; y: 90; width: 100; height: 100).
|
||||
self.shell2 add: (X11.Button new text: 'crayon'; x: 90; y: 90; width: 100; height: 100).
|
||||
self.shell3 add: (X11.Button new text: 'crayon'; x: 90; y: 90; width: 100; height: 100).
|
||||
self.shell1 realize.
|
||||
self.shell2 realize.
|
||||
self.shell3 realize.
|
||||
|
||||
self.disp1 enterEventLoop. ## this is not a blocking call. it spawns another process.
|
||||
self.disp2 enterEventLoop.
|
||||
|
||||
|
||||
|
||||
comp1 := Fx new.
|
||||
Fx new.
|
||||
Fx new.
|
||||
Fx new.
|
||||
}
|
||||
|
||||
method(#class) main
|
||||
|
Reference in New Issue
Block a user