added moo_deregallfinalizables()

removed some unused code
This commit is contained in:
hyunghwan.chung 2018-05-16 08:03:34 +00:00
parent f260c04b4e
commit ca12fc082f
6 changed files with 61 additions and 79 deletions

View File

@ -350,7 +350,7 @@ class MyObject(Object)
} }
method(#class) another_proc method(#class) another_proc: base_port
{ {
| httpd | | httpd |
@ -360,8 +360,8 @@ class MyObject(Object)
[ [
| ss | | ss |
httpd start: %( httpd start: %(
SocketAddress fromString: '[::]:8666', SocketAddress fromString: ('[::]:' & base_port asString),
SocketAddress fromString: '0.0.0.0:8665' SocketAddress fromString: ('0.0.0.0:' & (base_port + 1) asString)
). ).
while (true) while (true)
@ -382,8 +382,9 @@ class MyObject(Object)
{ {
| httpd | | httpd |
[ self another_proc ] fork. [ self another_proc: 5000 ] fork.
###[ self another_proc ] fork. [ self another_proc: 5100 ] fork.
[ self another_proc: 5200 ] fork.
[ [
thisProcess initAsync. thisProcess initAsync.
@ -406,6 +407,7 @@ class MyObject(Object)
] on: Exception do: [:ex | ('Exception - ' & ex messageText) dump]. ] on: Exception do: [:ex | ('Exception - ' & ex messageText) dump].
'----- END OF MAIN ------' dump. '----- END OF MAIN ------' dump.
} }
} }

View File

@ -225,20 +225,12 @@ class(#byte) SocketAddress(Object) from 'sck.addr'
} }
} }
class SocketCore(Object) from 'sck'
class Socket(Object) from 'sck'
{ {
## the handle must be the first field in this object to match ## the handle must be the first field in this object to match
## the internal representation used by various modules. (e.g. sck) ## the internal representation used by various modules. (e.g. sck)
var(#get) handle := -1. var(#get) handle := -1.
var(#get) closedEventAction.
var(#get) dataInEventAction.
var(#get) dataOutEventAction.
var pending_bytes, pending_offset, pending_length.
var outreadysem, outdonesem, inreadysem.
method(#primitive) open(family, type, proto). method(#primitive) open(family, type, proto).
## map the open primitive again with a different name for strict internal use only. ## map the open primitive again with a different name for strict internal use only.
## this method is supposed to be used to handle an accepted socket in server sockets. ## this method is supposed to be used to handle an accepted socket in server sockets.
@ -257,6 +249,12 @@ class Socket(Object) from 'sck'
method(#primitive) _writeBytes: bytes offset: offset length: length. method(#primitive) _writeBytes: bytes offset: offset length: length.
} }
class Socket(SocketCore)
{
var pending_bytes, pending_offset, pending_length.
var outreadysem, outdonesem, inreadysem.
}
(* TODO: generate these family and type from the C header *) (* TODO: generate these family and type from the C header *)
pooldic Socket.Family pooldic Socket.Family
{ {
@ -277,24 +275,27 @@ extend Socket
method(#class) __with: handle method(#class) __with: handle
{ {
###self addToBeFinalized.
^(self _basicNew initialize) __open(handle) ^(self _basicNew initialize) __open(handle)
} }
method(#class) family: family type: type method(#class) family: family type: type
{ {
###self addToBeFinalized.
## new is prohibited. so use _basicNew with initialize. ## new is prohibited. so use _basicNew with initialize.
##^(self new) open(family, type, 0) ##^(self new) open(family, type, 0)
^(self _basicNew initialize) open(family, type, 0) ^(self _basicNew initialize) open(family, type, 0)
} }
(* ------------------- (* -------------------
socketClosing socket call-back methods
socketClosed socketClosing
socketDataIn socketClosed
socketDataOut socketDataIn
socketAccepted:from: socketDataOut
socketConnected: socketAccepted:from:
-------------------- *) socketConnected:
-------------------- *)
method initialize method initialize
{ {
@ -305,10 +306,6 @@ socketConnected:
self.inreadysem := Semaphore new. self.inreadysem := Semaphore new.
self.outdonesem signalAction: [ :sem | self.outdonesem signalAction: [ :sem |
##if (self.dataOutEventAction notNil)
##{
## self.dataOutEventAction value: self.
##}.
self onSocketDataOut. self onSocketDataOut.
System unsignal: self.outreadysem. System unsignal: self.outreadysem.
]. ].
@ -337,16 +334,18 @@ socketConnected:
]. ].
self.inreadysem signalAction: [ :sem | self.inreadysem signalAction: [ :sem |
###self.dataInEventAction value: self.
self onSocketDataIn. self onSocketDataIn.
]. ].
} }
(*
method finalize method finalize
{ {
'SOCKET FINALIZED...............' dump. 'SOCKET FINALIZED...............' dump.
self close. self close.
} }
*)
method close method close
{ {
@ -375,35 +374,10 @@ socketConnected:
{ {
self _close. self _close.
self.handle := -1. self.handle := -1.
##if (self.closedEventAction notNil)
##{
## self.closedEventAction value: self.
##}.
self onSocketClosed. self onSocketClosed.
}. }.
} }
method onEvent: event_type do: action_block
{
if (event_type == #closed)
{
self.closedEventAction := action_block.
}
elsif (event_type == #data_in)
{
self.dataInEventAction := action_block.
}
elsif (event_type == #data_out)
{
self.dataOutEventAction := action_block.
}
else
{
Exception signal: 'unknown event type ' & event_type asString.
}
}
method beWatched method beWatched
{ {
thisProcess addAsyncSemaphore: self.inreadysem. thisProcess addAsyncSemaphore: self.inreadysem.
@ -488,7 +462,6 @@ class ClientSocket(Socket)
System unsignal: sem. System unsignal: sem.
thisProcess removeAsyncSemaphore: sem. thisProcess removeAsyncSemaphore: sem.
##self.connectedEventAction value: self value: (soerr == 0).
self onSocketConnected: (soerr == 0). self onSocketConnected: (soerr == 0).
if (soerr == 0) { self beWatched }. if (soerr == 0) { self beWatched }.
}. }.
@ -507,16 +480,6 @@ class ClientSocket(Socket)
^super close ^super close
} }
method onEvent: event_type do: action_block
{
if (event_type == #connected)
{
self.connectedEventAction := action_block.
^self.
}.
^super onEvent: event_type do: action_block
}
method connect: target method connect: target
{ {
| sem | | sem |
@ -529,7 +492,6 @@ class ClientSocket(Socket)
{ {
## connected immediately ## connected immediately
'IMMEDIATELY CONNECTED.....' dump. 'IMMEDIATELY CONNECTED.....' dump.
###self.connectedEventAction value: self value: true.
self onSocketConnected: true. self onSocketConnected: true.
thisProcess addAsyncSemaphore: self.inreadysem. thisProcess addAsyncSemaphore: self.inreadysem.
@ -540,6 +502,7 @@ class ClientSocket(Socket)
method onSocketConnected method onSocketConnected
{ {
## do nothing special. the subclass may override this method.
} }
} }
@ -556,7 +519,6 @@ class ServerSocket(Socket)
| cliaddr clisck cliact fd | | cliaddr clisck cliact fd |
cliaddr := SocketAddress new. cliaddr := SocketAddress new.
'IN READYSEM action performing.........' dump.
fd := self _accept: cliaddr. fd := self _accept: cliaddr.
##if (fd >= 0) ##if (fd >= 0)
if (fd notNil) if (fd notNil)
@ -581,17 +543,6 @@ class ServerSocket(Socket)
^super close. ^super close.
} }
method onEvent: event_type do: action_block
{
if (event_type == #accepted)
{
self.acceptedEventAction := action_block.
^self.
}.
^super onEvent: event_type do: action_block
}
method listen: backlog method listen: backlog
{ {
| n | | n |
@ -600,9 +551,10 @@ class ServerSocket(Socket)
## added to the multiplexer, a spurious hangup event might ## added to the multiplexer, a spurious hangup event might
## be generated. At least, such behavior was observed ## be generated. At least, such behavior was observed
## in linux with epoll in the level trigger mode. ## in linux with epoll in the level trigger mode.
### System signal: self.inreadysem onInput: self.handle. ## System signal: self.inreadysem onInput: self.handle.
### thisProcess addAsyncSemaphore: self.inreadysem. ## thisProcess addAsyncSemaphore: self.inreadysem.
### n := self _listen: backlog. ## self _listen: backlog.
n := self _listen: backlog. n := self _listen: backlog.
System signal: self.inreadysem onInput: self.handle. System signal: self.inreadysem onInput: self.handle.
thisProcess addAsyncSemaphore: self.inreadysem. thisProcess addAsyncSemaphore: self.inreadysem.

View File

@ -193,6 +193,11 @@ static MOO_INLINE void vm_cleanup (moo_t* moo)
moo->sem_gcfin = (moo_oop_semaphore_t)moo->_nil; moo->sem_gcfin = (moo_oop_semaphore_t)moo->_nil;
moo->sem_gcfin_sigreq = 0; moo->sem_gcfin_sigreq = 0;
/* deregister all pending finalizable objects pending just in case these
* have not been removed for various reasons. (e.g. sudden VM abortion)
*/
moo_deregallfinalizables (moo);
MOO_DEBUG0 (moo, "VM cleaned up\n"); MOO_DEBUG0 (moo, "VM cleaned up\n");
} }

View File

@ -1088,14 +1088,34 @@ int moo_deregfinalizable (moo_t* moo, moo_oop_t oop)
{ {
MOO_OBJ_SET_FLAGS_GCFIN(oop, (MOO_OBJ_GET_FLAGS_GCFIN(oop) & ~MOO_GCFIN_FINALIZABLE)); MOO_OBJ_SET_FLAGS_GCFIN(oop, (MOO_OBJ_GET_FLAGS_GCFIN(oop) & ~MOO_GCFIN_FINALIZABLE));
MOO_DELETE_FROM_LIST (&moo->finalizable, x); MOO_DELETE_FROM_LIST (&moo->finalizable, x);
moo_freemem (moo, x);
return 0; return 0;
} }
x = x->next;
} }
moo_seterrnum (moo, MOO_ENOENT); moo_seterrnum (moo, MOO_ENOENT);
return -1; return -1;
} }
void moo_deregallfinalizables (moo_t* moo)
{
moo_finalizable_t* x, * nx;
x = moo->finalizable.first;
while (x)
{
nx = x->next;
MOO_OBJ_SET_FLAGS_GCFIN(x->oop, (MOO_OBJ_GET_FLAGS_GCFIN(x->oop) & ~MOO_GCFIN_FINALIZABLE));
MOO_DELETE_FROM_LIST (&moo->finalizable, x);
moo_freemem (moo, x);
x = nx;
}
MOO_ASSERT (moo, moo->finalizable.first == MOO_NULL);
MOO_ASSERT (moo, moo->finalizable.last == MOO_NULL);
}
static moo_oow_t move_finalizable_objects (moo_t* moo) static moo_oow_t move_finalizable_objects (moo_t* moo)
{ {
moo_finalizable_t* x, * y; moo_finalizable_t* x, * y;

View File

@ -1194,6 +1194,7 @@ moo_oop_nsdic_t moo_makensdic (
/* ========================================================================= */ /* ========================================================================= */
int moo_regfinalizable (moo_t* moo, moo_oop_t oop); int moo_regfinalizable (moo_t* moo, moo_oop_t oop);
int moo_deregfinalizable (moo_t* moo, moo_oop_t oop); int moo_deregfinalizable (moo_t* moo, moo_oop_t oop);
void moo_deregallfinalizables (moo_t* moo);
/* ========================================================================= */ /* ========================================================================= */
/* proc.c */ /* proc.c */

View File

@ -631,6 +631,7 @@ static void gc_mod_sck (moo_t* moo, moo_mod_t* mod)
int moo_mod_sck (moo_t* moo, moo_mod_t* mod) int moo_mod_sck (moo_t* moo, moo_mod_t* mod)
{ {
/*
if (mod->hints & MOO_MOD_LOAD_FOR_IMPORT) if (mod->hints & MOO_MOD_LOAD_FOR_IMPORT)
{ {
mod->gc = MOO_NULL; mod->gc = MOO_NULL;
@ -656,6 +657,7 @@ int moo_mod_sck (moo_t* moo, moo_mod_t* mod)
mod->gc = gc_mod_sck; mod->gc = gc_mod_sck;
mod->ctx = ctx; mod->ctx = ctx;
} }
*/
mod->import = import; mod->import = import;
mod->query = query; mod->query = query;