projects
/
spider.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
removed the memory leakage a bit better on connects
[spider.git]
/
perl
/
Msg.pm
diff --git
a/perl/Msg.pm
b/perl/Msg.pm
index 449f1790ca8dcb1b0156e06c31d402784264320a..c730773aff702f9c1cbb4d79cad00932dd2f5036 100644
(file)
--- a/
perl/Msg.pm
+++ b/
perl/Msg.pm
@@
-62,6
+62,13
@@
sub set_error
set_event_handler($conn->{sock}, error => $callback) if exists $conn->{sock};
}
set_event_handler($conn->{sock}, error => $callback) if exists $conn->{sock};
}
+sub set_rproc
+{
+ my $conn = shift;
+ my $callback = shift;
+ $conn->{rproc} = $callback;
+}
+
sub blocking
{
my $flags = fcntl ($_[0], F_GETFL, 0);
sub blocking
{
my $flags = fcntl ($_[0], F_GETFL, 0);
@@
-136,8
+143,8
@@
sub connect {
$conn->{sock} = $sock;
if ($conn->{rproc}) {
$conn->{sock} = $sock;
if ($conn->{rproc}) {
- my $callback = sub {
_rcv($conn)
};
- set_event_handler ($sock,
"read"
=> $callback);
+ my $callback = sub {
$conn->_rcv
};
+ set_event_handler ($sock,
read
=> $callback);
}
return $conn;
}
}
return $conn;
}
@@
-149,9
+156,6
@@
sub disconnect {
$conn->{disconnecting} = 1;
my $sock = delete $conn->{sock};
$conn->{state} = 'E';
$conn->{disconnecting} = 1;
my $sock = delete $conn->{sock};
$conn->{state} = 'E';
- delete $conn->{cmd};
- delete $conn->{eproc};
- delete $conn->{rproc};
$conn->{timeout}->del if $conn->{timeout};
# be careful to delete the correct one
$conn->{timeout}->del if $conn->{timeout};
# be careful to delete the correct one
@@
-164,9
+168,18
@@
sub disconnect {
dbg('connll', "Connection $call disconnected");
set_event_handler ($sock, read => undef, write => undef, error => undef);
dbg('connll', "Connection $call disconnected");
set_event_handler ($sock, read => undef, write => undef, error => undef);
+
unless ($^O =~ /^MS/i) {
kill 'TERM', $conn->{pid} if exists $conn->{pid};
}
unless ($^O =~ /^MS/i) {
kill 'TERM', $conn->{pid} if exists $conn->{pid};
}
+
+ # get rid of any references
+ for (keys %$conn) {
+ if (ref($conn->{$_})) {
+ delete $conn->{$_};
+ }
+ }
+
return unless defined($sock);
shutdown($sock, 3);
close($sock);
return unless defined($sock);
shutdown($sock, 3);
close($sock);
@@
-183,7
+196,7
@@
sub send_later {
$conn->enqueue($msg);
my $sock = $conn->{sock};
return unless defined($sock);
$conn->enqueue($msg);
my $sock = $conn->{sock};
return unless defined($sock);
- set_event_handler ($sock,
"write"
=> sub {$conn->_send(0)});
+ set_event_handler ($sock,
write
=> sub {$conn->_send(0)});
}
sub enqueue {
}
sub enqueue {
@@
-240,9
+253,9
@@
sub _send {
}
# Call me back if queue has not been drained.
if (@$rq) {
}
# Call me back if queue has not been drained.
if (@$rq) {
- set_event_handler ($sock,
"write"
=> sub {$conn->_send(0)});
+ set_event_handler ($sock,
write
=> sub {$conn->_send(0)});
} else {
} else {
- set_event_handler ($sock,
"write"
=> undef);
+ set_event_handler ($sock,
write
=> undef);
if (exists $conn->{close_on_empty}) {
&{$conn->{eproc}}($conn, undef) if exists $conn->{eproc};
$conn->disconnect;
if (exists $conn->{close_on_empty}) {
&{$conn->{eproc}}($conn, undef) if exists $conn->{eproc};
$conn->disconnect;
@@
-276,7
+289,7
@@
sub new_server {
Proto => 'tcp',
Reuse => 1);
die "Could not create socket: $! \n" unless $self->{sock};
Proto => 'tcp',
Reuse => 1);
die "Could not create socket: $! \n" unless $self->{sock};
- set_event_handler ($self->{sock},
"read"
=> sub { $self->new_client } );
+ set_event_handler ($self->{sock},
read
=> sub { $self->new_client } );
return $self;
}
return $self;
}
@@
-321,8
+334,8
@@
sub _rcv { # Complement to _send
FINISH:
if (defined $bytes_read && $bytes_read == 0) {
FINISH:
if (defined $bytes_read && $bytes_read == 0) {
- &{$conn->{eproc}}($conn,
undef
) if exists $conn->{eproc};
- $conn->disconnect
()
;
+ &{$conn->{eproc}}($conn,
$!
) if exists $conn->{eproc};
+ $conn->disconnect;
} else {
$conn->dequeue if exists $conn->{msg};
}
} else {
$conn->dequeue if exists $conn->{msg};
}
@@
-337,12
+350,12
@@
sub new_client {
$conn->{sort} = 'Incoming';
if ($eproc) {
$conn->{eproc} = $eproc;
$conn->{sort} = 'Incoming';
if ($eproc) {
$conn->{eproc} = $eproc;
- set_event_handler ($sock,
"error"
=> $eproc);
+ set_event_handler ($sock,
error
=> $eproc);
}
if ($rproc) {
$conn->{rproc} = $rproc;
}
if ($rproc) {
$conn->{rproc} = $rproc;
- my $callback = sub {
_rcv($conn)
};
- set_event_handler ($sock,
"read"
=> $callback);
+ my $callback = sub {
$conn->_rcv
};
+ set_event_handler ($sock,
read
=> $callback);
} else { # Login failed
&{$conn->{eproc}}($conn, undef) if exists $conn->{eproc};
$conn->disconnect();
} else { # Login failed
&{$conn->{eproc}}($conn, undef) if exists $conn->{eproc};
$conn->disconnect();
@@
-352,7
+365,7
@@
sub new_client {
sub close_server
{
my $conn = shift;
sub close_server
{
my $conn = shift;
- set_event_handler ($conn->{sock},
"read" => undef
);
+ set_event_handler ($conn->{sock},
read => undef, write => undef, error => undef
);
$conn->{sock}->close;
}
$conn->{sock}->close;
}