File-Lock
view release on metacpan or search on metacpan
{PUSHs(sv_2mortal(newSVpv("uwrl" + (result&Lock_modemask),1)));fprintf(stderr,"Returning '%c'\n","uwrl"[result&Lock_modemask]);}\
else \
{PUSHs(sv_mortalcopy(&sv_yes));fprintf(stderr,"Returning 'yes'\n");}\
MACRO_END
#else
#define PUSHResult(result,mode) \
MACRO_BEGIN \
if(result==-1) \
PUSHs(&sv_undef);\
else \
if(mode==Lock_test) \
PUSHs(sv_2mortal(newSVpv("uwrl" + (result&Lock_modemask),1)));\
else \
PUSHs(&sv_yes);\
MACRO_END
#endif
#define ReturnResult(result,mode) \
MACRO_BEGIN \
EXTEND(sp,1); \
PUSHResult(result,mode); \
MACRO_END
#define wantarray (GIMME == G_ARRAY)
MODULE = File::Lock PACKAGE = File::Lock
double
constant(name,arg)
char * name
int arg
int
lockfile(filename, mode=Lock_exclusive|Lock_nonblock,shared=0,shortnames=0)
char * filename
mode_int mode
int shared
int shortnames
CODE:
{
# ifdef FDEBUG
fprintf(stderr,"Entering lockfilef(%s,%s,shared=%d,shortnames=%d)\n",filename,mode_name[mode],shared,shortnames);
# endif
RETVAL = _base_lockfile(filename,mode,shared,shortnames);
}
OUTPUT:
RETVAL
void
fcntl(file, mode=Lock_exclusive|Lock_nonblock, offset=0, whence=SEEK_SET, length=0)
FILE * file
mode_int mode
int offset
int whence
int length
PPCODE:
{
# ifdef FDEBUG
fprintf(stderr,"Entering fcntl(%d,%s,%d,%d,%d)\n",fileno(file),mode_name[mode],offset,whence,length);
# endif
# if defined(HAS_FCNTL)
#define YES_FCNTL
{
struct flock retflk;
int retval;
retval = _base_fcntl(fileno(file),mode,offset,whence,length, &retflk);
if(((mode & Lock_modemask) == Lock_test) && (retval!=-1)) {
if(wantarray) {
# ifdef HAS_SYSID_IN_FCNTL
EXTEND(sp, 6);
# else
EXTEND(sp, 5);
# endif
# ifdef FDEBUG
fprintf(stderr,"Returning (%s,%d,%d,%d,%d",mode_name[retflk.l_type],
retflk.l_start,retflk.l_whence,retflk.l_len,retflk.l_pid);
# endif
PUSHResult(retflk.l_type,mode);
PUSHs(sv_2mortal(newSViv(retflk.l_start)));
PUSHs(sv_2mortal(newSViv(retflk.l_whence)));
PUSHs(sv_2mortal(newSViv(retflk.l_len)));
PUSHs(sv_2mortal(newSViv(retflk.l_pid)));
# ifdef HAS_SYSID_IN_FCNTL
PUSHs(sv_2mortal(newSViv(retflk.l_sysid)));
# ifdef FDEBUG
fprintf(stderr,",%d",retflk.l_sysid);
# endif
# endif
# ifdef FDEBUG
fprintf(stderr,") from fcntl()\n");
# endif
} else {
EXTEND(sp,1);
PUSHResult(retflk.l_type,mode);
}
} else {
EXTEND(sp,1);
PUSHResult(retval,mode);
}
}
# endif
# if !defined(HAS_FCNTL) && defined(HAS_LOCKF)
#define EMU_FCNTL
if(((mode & Lock_modemask) == Lock_test) && wantarray) {
croak("fcntl is emulated on this architecture, and does "
"not support testing a lock in an array context\n");
} else {
int retval = _base_lockf(fileno(file),mode,offset,whence,length);
ReturnResult(retval,mode);
}
# endif
# if !defined(HAS_FCNTL) && !defined(HAS_LOCKF)
#define NO_FCNTL
croak("fcntl is not supported on this architecture\n");
# endif
}
void
flock(file, mode=Lock_exclusive|Lock_nonblock)
FILE * file
mode_int mode
PPCODE:
{
# ifdef FDEBUG
fprintf(stderr,"Entering flock(%d,%s)\n",fileno(file),mode_name[mode]);
# endif
# if defined(HAS_FLOCK)
#define YES_FLOCK
ReturnResult(_base_flock(fileno(file),mode),mode);
# endif
# if !defined(HAS_FLOCK) && defined(HAS_FCNTL)
#define EMU_FLOCK
ReturnResult(_base_fcntl(fileno(file),mode,0,SEEK_SET,0,0),mode);
# endif
# if !defined(HAS_FLOCK) && !defined(HAS_FCNTL) && defined(HAS_LOCKF)
#define EMU_FLOCK
ReturnResult(_base_lockf(fileno(file),mode,0,SEEK_SET,0),mode);
# endif
# if !defined(HAS_FLOCK) && !defined(HAS_FCNTL) && !defined(HAS_LOCKF)
#define NO_FLOCK
croak("flock is not supported on this architecture\n");
# endif
}
void
lockf(file, mode=Lock_exclusive|Lock_nonblock, offset=0, whence=SEEK_SET, length=0)
FILE * file
mode_int mode
int offset
int whence
int length
PPCODE:
{
# ifdef FDEBUG
fprintf(stderr,"Entering lockf(%d,%s,%d,%d,%d)\n",fileno(file),mode_name[mode],offset,whence,length);
# endif
# if defined(HAS_LOCKF)
#define YES_LOCKF
ReturnResult(_base_lockf(fileno(file),mode,offset,whence,length),mode);
# endif
# if !defined(HAS_LOCKF) && defined(HAS_FCNTL)
#define EMU_LOCKF
ReturnResult(_base_fcntl(fileno(file),mode,offset,whence,length,0),mode);
# endif
# if !defined(HAS_LOCKF) && !defined(HAS_FCNTL)
#define NO_LOCKF
croak("lockf is not supported on this architecture\n");
# endif
}
char *
has_flock()
CODE:
{
# ifdef YES_FLOCK
RETVAL = "yes";
# endif
# ifdef EMU_FLOCK
RETVAL = "emulated";
# endif
# ifdef NO_FLOCK
RETVAL = "";
# endif
# ifdef FDEBUG
fprintf(stderr,"Returning `%s' from has_flock()\n",RETVAL);
# endif
}
OUTPUT:
RETVAL
char *
has_lockf()
CODE:
{
# ifdef YES_LOCKF
RETVAL = "yes";
# endif
# ifdef EMU_LOCKF
RETVAL = "emulated";
# endif
# ifdef NO_LOCKF
RETVAL = "";
# endif
# ifdef FDEBUG
fprintf(stderr,"Returning `%s' from has_lockf()\n",RETVAL);
# endif
}
OUTPUT:
RETVAL
char *
has_fcntl()
CODE:
{
# ifdef YES_FCNTL
RETVAL = "yes";
# endif
# ifdef EMU_FCNTL
RETVAL = "emulated";
# endif
# ifdef NO_FCNTL
RETVAL = "";
# endif
# ifdef FDEBUG
fprintf(stderr,"Returning `%s' from has_fcntl()\n",RETVAL);
# endif
}
OUTPUT:
RETVAL
char *
has_lockfile()
CODE:
{
RETVAL = "yes";
# ifdef FDEBUG
fprintf(stderr,"Returning `%s' from has_lockfile()\n",RETVAL);
# endif
}
OUTPUT:
RETVAL
void
_mode(mode)
mode_int mode
PPCODE:
{
ReturnResult(mode & Lock_modemask,Lock_test);
}
void
new(class, file, mode=Lock_shared, offset=0, whence=SEEK_SET, length=0)
SV * class
FILE * file
mode_int mode
int offset
int whence
int length
PPCODE:
{
# ifdef FDEBUG
fprintf(stderr,"Entering new File::Lock(%d,%s,%d,%d,%d)\n",fileno(file),mode_name[mode],offset,whence,length);
# endif
if(((mode & Lock_modemask)== Lock_test) || ((mode & Lock_modemask)==Lock_unlock)) {
croak("Only exclusive or shared locking modes may be used with new File::Lock.\n");
}
{
# if defined(HAS_FCNTL)
struct flock retflk;
int retval;
retval = _base_fcntl(fileno(file),mode,offset,whence,length, 0);
# endif
# if !defined(HAS_FCNTL) && defined(HAS_LOCKF)
int retval = _base_lockf(fileno(file),mode,offset,whence,length);
# endif
# if !defined(HAS_FCNTL) && !defined(HAS_LOCKF)
croak("fcntl is not supported on this architecture\n");
# else
if(retval==0) {
AV * ary = newAV();
SV * ref;
av_push(ary,newRV((SV*)sv_2io(ST(1))));
av_push(ary,newSViv(offset));
av_push(ary,newSViv(whence));
av_push(ary,newSViv(length));
ref = newRV((SV*)ary);
sv_bless(ref,gv_stashpv("File::Lock",0));
EXTEND(sp,1);
PUSHs(sv_2mortal(ref));
} else {
EXTEND(sp,1);
PUSHs(&sv_undef);
}
# endif
}
}
( run in 0.976 second using v1.01-cache-2.11-cpan-5511b514fd6 )