Revision 3 (by ahitrov@rambler.ru, 2010/03/24 15:19:32) The CORE
package PidFile::File;

use strict;
use warnings 'all';

use Fcntl qw(:flock);
use FindBin;


sub new {
	my ($class, $pid_dir, %opts) = @_;

	die "PID directory required\n" unless $pid_dir && -d $pid_dir;
	$pid_dir =~ s#/+$##;

	my $self = {
		file    => "$pid_dir/".($opts{pid_name}||"$FindBin::RealScript.pid"),
		host    => $opts{host},
		verbose => $opts{verbose},
	};

	bless $self, $class;
}

sub block {
	my ($self, $now) = @_;

	if (-f $self->{file}) {
		warn "Found existing PID file, check for alive process...\n" if $self->{verbose};
		open PID, "<$self->{file}" or die "Can't read existing PID file - $!\n";
		chomp(local $_ = <PID>);
		warn "Found previous PID: $_\n" if $self->{verbose};
		unless (flock PID, LOCK_EX|LOCK_NB) {
			if ($self->{verbose}) {
				die "Found alive process, exit\n";
			} else {
				print "Found alive process, exit\n";
				exit;
			}
		}
		close PID;
		warn "No alive process were found\n" if $self->{verbose};
	}

	open PID, ">$self->{file}" or die "Can't create PID file - $!\n";
	flock PID, LOCK_EX or die "Can't lock PID files - $!\n";
	select((select(PID), $|=1)[0]);
	print PID $$;
	$self->{handle} = *PID;

	print "Created PID file (PID: $$) at ".localtime($now)."\n" if $self->{verbose};
}

sub release {
	my ($self, $now) = @_;

	return unless $self->{handle};

	flock $self->{handle}, LOCK_UN;
	close $self->{handle};
	unlink $self->{file} or die "Can't unlink self PID file - $!\n";

	print "Removed PID file (PID: $$) at ".localtime($now)."\n" if $self->{verbose};

	return 0;
}

1;

Небольшая справка по веткам

cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.

koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.

utf8 – актуальная ветка, заточенная под UTF-8.

Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.