DDLock-Server

 view release on metacpan or  search on metacpan

ddlockd  view on Meta::CPAN

use Carp;
use POSIX ();

use DDLock::Server;

my %args;

Getopt::Long::GetOptions(
    'd|daemon'       => \(my $daemonize),
    'p|port=i'       => sub { $args{port} = $_[1] },
    'n|no-keepalive' => sub { $args{nokeepalive}++ },
    'e|engine=s'     => sub { $args{engine} = $_[1] },
    'h|hostname=s'   => sub { $args{hostname} = $_[1] },
    'T|table=s'      => sub { $args{table} = $_[1] },
   );

daemonize() if $daemonize;

$SIG{'PIPE'} = "IGNORE";  # handled manually

my $ddlock = DDLock::Server->new(%args);

lib/DDLock/Server.pm  view on Meta::CPAN


use strict;
use warnings;

use Danga::Socket;
use IO::Socket::INET;
use Socket qw(IPPROTO_TCP SO_KEEPALIVE TCP_NODELAY SOL_SOCKET);

# Linux-specific:
use constant TCP_KEEPIDLE  => 4; # Start keeplives after this period
use constant TCP_KEEPINTVL => 5; # Interval between keepalives
use constant TCP_KEEPCNT   => 6; # Number of keepalives before death


sub new {
    my $class = shift;
    my %args = @_;

    $args{port} = 7002
        unless defined $args{port};

    $args{lock_type} = "internal"

lib/DDLock/Server.pm  view on Meta::CPAN

    # obviously sets it from watching strace.
    IO::Handle::blocking($server, 0);

    my $accept_handler = sub {
        my $csock = $server->accept();
        return unless $csock;

        IO::Handle::blocking($csock, 0);
        setsockopt($csock, IPPROTO_TCP, TCP_NODELAY, pack("l", 1)) or die;

        # Enable keep alive
        unless ( $args{nokeepalive} ) {
            (setsockopt($csock, SOL_SOCKET, SO_KEEPALIVE,  pack("l", 1)) &&
             setsockopt($csock, IPPROTO_TCP, TCP_KEEPIDLE,  pack("l", 30)) &&
             setsockopt($csock, IPPROTO_TCP, TCP_KEEPCNT,   pack("l", 10)) &&
             setsockopt($csock, IPPROTO_TCP, TCP_KEEPINTVL, pack("l", 30)) &&
             1
            ) || die "Couldn't set keep-alive settings on socket (Not on Linux?)";
        }

        my $client = $client_class->new($csock);
        $client->watch_read(1);
    };

    DDLock::Server::Client->OtherFds(fileno($server) => $accept_handler);

    return $client_class;
}



( run in 0.589 second using v1.01-cache-2.11-cpan-39bf76dae61 )