[M3devel] unix - unknown qualification

Jay K jay.krell at cornell.edu
Fri Jul 13 11:33:16 CEST 2012


Hey, how about I just provide copying wrappers here, like we do for stat?Where we define an idealized portable struct flock and copy it back and forth in C to the real struct flock? It is a little strange -- the wrapper is fnctl.It must check the first parameter, and know/assume its meaning.   - Jay
 From: jay.krell at cornell.edu
To: pgoltzsch at gmail.com; m3devel at elegosoft.com
Date: Thu, 12 Jul 2012 22:12:49 +0000
Subject: Re: [M3devel] unix - unknown qualification





Unix.i3 has always been a maintenance and portability problem.As such, it has been dramatically reduced.This stuff was probably removed, esp. struct_flock.The constants can exposed easily enough, portably, but aren't useful without the struct, prpbably.

You REALLY REALLY REALLY want to write this in C.Writing it in Modula-3 has many downsides. You lose safety. You lose static checking. You lose portability.You gain infinitely small efficiency.Something like:

jbook2:libm3 jay$ pwd/dev2/cm3/m3-libs/libm3jbook2:libm3 jay$ find . | xargs grep flock./src/os/POSIX/FilePosixC.c:saves us from having to declare struct flock, which is gnarled up in #ifdefs../src/os/POSIX/FilePosixC.c:    struct flock lock;./src/os/POSIX/FilePosixC.c:    struct flock lock;./tests/os/src/locktest.c:  struct flock param;

./src/os/POSIX/FilePosixC.c:
/* Copyright (C) 1993, Digital Equipment Corporation           *//* All rights reserved.                                        *//* See the file COPYRIGHT for a full description.              */
/*Writing part of libm3/os/POSIX/FilePosix.m3/RegularFileLock, RegularFileUnlock in Csaves us from having to declare struct flock, which is gnarled up in #ifdefs.
see http://www.opengroup.org/onlinepubs/009695399/functions/fcntl.html*/
#include "m3core.h"#include <string.h>
#ifdef __cplusplusextern "C" {#endif
#define FALSE 0#define TRUE 1
INTEGER FilePosixC__RegularFileLock(int fd){    struct flock lock;    int err;
    ZeroMemory(&lock, sizeof(lock));    lock.l_type = F_WRLCK;    lock.l_whence = SEEK_SET;
    if (fcntl(fd, F_SETLK, &lock) < 0)    {        err = errno;        if (err == EACCES || err == EAGAIN)            return FALSE;        return -1;    }    return TRUE;}
INTEGER FilePosixC__RegularFileUnlock(int fd){    struct flock lock;
    ZeroMemory(&lock, sizeof(lock));    lock.l_type = F_UNLCK;    lock.l_whence = SEEK_SET;
    return fcntl(fd, F_SETLK, &lock);}
#ifdef __cplusplus} /* extern "C" */#endif


We can add this to libm3 probably.

 - Jay

> Date: Thu, 12 Jul 2012 14:58:11 +0200
> From: pgoltzsch at gmail.com
> To: m3devel at elegosoft.com
> Subject: Re: [M3devel] unix - unknown qualification
> 
> >>>>> Rodney M. Bates wrote:
> 
> > I think we need to see some source code for ClsShare.m3.
> > particularly to see what is before the dot on these lines.  I
> > don't see any of the failing qualifications in Unix.i3 in my
> > cm3 directory.
> 
> The first errors are caused by the following procedure,
> which seems to copied from old DEC example code as I found
> out while looking for a solution:
> 
>   PROCEDURE FilePartLock( h : INTEGER; start, len : INTEGER ) : BOOLEAN RAISES {OSError.E} =
>   VAR flock := Unix.struct_flock {
>     l_type := Unix.F_WRLCK,
>     l_whence := Unix.L_SET,
>     l_start := 0,
>     l_len := 0, (* i.e., whole file *)
>     l_pid := 0 }; (* don't care *)
>   BEGIN
>     flock.l_start := start;
>     flock.l_len := len;
>     IF Unix.fcntl( h, Unix.F_SETLK, LOOPHOLE( ADR( flock ), Ctypes.long ) ) < 0
>     THEN
>       IF Uerror.errno = Uerror.EACCES OR
>          Uerror.errno = Uerror.EAGAIN THEN 
>         RETURN FALSE 
>       END;
>       OSErrorPosix.Raise()
>     END;
>     RETURN TRUE
>   END FilePartLock;
> 
> 
> 
> Regards,
> 
> 		  Patrick
 		 	   		   		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20120713/de1e3e24/attachment-0002.html>


More information about the M3devel mailing list