#
# This license differs from the rest of public-inbox
#
-# This is a fork of the (for now) unmaintained Danga::Socket 1.61.
-# Unused features will be removed, and updates will be made to take
-# advantage of newer kernels.
+# This is a fork of the unmaintained Danga::Socket (1.61) with
+# significant changes. See Documentation/technical/ds.txt in our
+# source for details.
#
-# API changes to diverge from Danga::Socket will happen to better
-# accomodate new features and improve scalability. Do not expect
-# this to be a stable API like Danga::Socket.
-# Bugs encountered (and likely fixed) are reported to
-# bug-Danga-Socket@rt.cpan.org and visible at:
+# Do not expect this to be a stable API like Danga::Socket,
+# but it will evolve to suite our needs and to take advantage of
+# newer Linux and *BSD features.
+# Bugs encountered were reported to bug-Danga-Socket@rt.cpan.org,
+# fixed in Danga::Socket 1.62 and visible at:
# https://rt.cpan.org/Public/Dist/Display.html?Name=Danga-Socket
package PublicInbox::DS;
use strict;
'wbuf_off', # offset into first element of wbuf to start writing at
);
-use Errno qw(EAGAIN EINVAL);
-use Carp qw(croak confess carp);
-require File::Spec;
+use Errno qw(EAGAIN EINVAL);
+use Carp qw(confess carp);
my $nextq; # queue for next_tick
my $WaitPids; # list of [ pid, callback, callback_arg ]
sub msg_more ($$) {
my $self = $_[0];
my $sock = $self->{sock} or return 1;
+ my $wbuf = $self->{wbuf};
- if (MSG_MORE && !$self->{wbuf} && ref($sock) ne 'IO::Socket::SSL') {
+ if (MSG_MORE && (!defined($wbuf) || !scalar(@$wbuf)) &&
+ ref($sock) ne 'IO::Socket::SSL') {
my $n = send($sock, $_[1], MSG_MORE);
if (defined $n) {
my $nlen = bytes::length($_[1]) - $n;
return 1 if $nlen == 0; # all done!
# queue up the unwritten substring:
my $tmpio = tmpio($self, \($_[1]), $n) or return 0;
- $self->{wbuf} = [ $tmpio ];
+ $self->{wbuf} //= $wbuf //= [];
+ push @$wbuf, $tmpio;
epwait($sock, EPOLLOUT|EPOLLONESHOT);
return 0;
}