<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">Hi all:<br>indeed but I'm afraid that using C API level specification programming doesn't make the bulk sense of the language, the core is about machine programming, that so many believe is better in C. But UNSAFE in my way of think is just better than C because you still have some check not bullet proof, but with appropriate module isolation you can control it doesn't propagate by using Modula-3 keen Modules in RTMachinery stopped appropriately and where the machine allows safety manageable execution you can recover from that (trapped error, like arithmetic overflow e.g to dump it in disk) or update your data and finish with an expectancy of following rules to stop execution, this is my point Jay. Now quality of current machines is going more bad than before, so who cares if we use DEC stuff.<br>I wanted to say, that here the language designers tried hard to
 make easier to optimize itself the language and for this purpose in mind, with that objective makes sense to believe that the application itself must be compiled with Modula-3, so at some degree I'm being hypocritical about Gcc use, but sometimes using Gcc gives more time to develop the rest of the system.<br>Thanks in advance<br><br>--- El <b>vie, 13/7/12, Rodney M. Bates <i><rodney_bates@lcwb.coop></i></b> escribió:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>De: Rodney M. Bates <rodney_bates@lcwb.coop><br>Asunto: Re: [M3devel] unix - unknown qualification<br>Para: m3devel@elegosoft.com<br>Fecha: viernes, 13 de julio, 2012 07:54<br><br><div class="plainMail">Sounds like a good idea to me.  IT moves the M3/C boundary back just<br>enough to pick up all the #ifdef stuff, etc.<br>but not the application-specific code.<br><br>On 07/13/2012 04:33 AM, Jay K wrote:<br>> Hey, how
 about I just provide copying wrappers here, like we do for stat?<br>> Where we define an idealized portable struct flock and copy it back and forth in C to the real struct flock?<br>><br>> It is a little strange -- the wrapper is fnctl.<br>> It must check the first parameter, and know/assume its meaning.<br>><br>><br>>   - Jay<br>><br>>
 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------<br> --<br>> From: <a ymailto="mailto:jay.krell@cornell.edu" href="/mc/compose?to=jay.krell@cornell.edu">jay.krell@cornell.edu</a><br>> To: <a ymailto="mailto:pgoltzsch@gmail.com" href="/mc/compose?to=pgoltzsch@gmail.com">pgoltzsch@gmail.com</a>; <a ymailto="mailto:m3devel@elegosoft.com" href="/mc/compose?to=m3devel@elegosoft.com">m3devel@elegosoft.com</a><br>> Date: Thu, 12 Jul 2012 22:12:49 +0000<br>> Subject: Re: [M3devel] unix - unknown qualification<br>><br>> Unix.i3 has always been a maintenance and portability problem.<br>> As such, it has been dramatically reduced.<br>> This stuff was probably removed, esp. struct_flock.<br>> The constants can exposed easily enough, portably, but aren't useful without the struct, prpbably.<br>><br>><br>> You REALLY REALLY REALLY want to write this in C.<br>> Writing it in Modula-3 has many downsides. You lose safety. You losestatic checking. You
 loseportability.<br>> You gain infinitely small efficiency.<br>> Something like:<br>><br>><br>> jbook2:libm3 jay$ pwd<br>> /dev2/cm3/m3-libs/libm3<br>> jbook2:libm3 jay$ find . | xargs grep flock<br>> ./src/os/POSIX/FilePosixC.c:saves us from having to declare struct flock, which is gnarled up in #ifdefs.<br>> ./src/os/POSIX/FilePosixC.c:    struct flock lock;<br>> ./src/os/POSIX/FilePosixC.c:    struct flock lock;<br>> ./tests/os/src/locktest.c:  struct flock param;<br>><br>><br>> ./src/os/POSIX/FilePosixC.c:<br>><br>> /* Copyright (C) 1993, Digital Equipment Corporation           */<br>> /* All rights reserved.                                        */<br>> /* See the file COPYRIGHT for a full description.         
     */<br>><br>> /*<br>> Writing part of libm3/os/POSIX/FilePosix.m3/RegularFileLock, RegularFileUnlock in C<br>> saves us from having to declare struct flock, which is gnarled up in #ifdefs.<br>><br>> see <a href="http://www.opengroup.org/onlinepubs/009695399/functions/fcntl.html" target="_blank">http://www.opengroup.org/onlinepubs/009695399/functions/fcntl.html</a><br>> */<br>><br>> #include "m3core.h"<br>> #include <string.h><br>><br>> #ifdef __cplusplus<br>> extern "C" {<br>> #endif<br>><br>> #define FALSE 0<br>> #define TRUE 1<br>><br>> INTEGER FilePosixC__RegularFileLock(int fd)<br>> {<br>>      struct flock lock;<br>>      int err;<br>><br>>      ZeroMemory(&lock, sizeof(lock));<br>>      lock.l_type = F_WRLCK;<br>>      lock.l_whence = SEEK_SET;<br>><br>>   
   if (fcntl(fd, F_SETLK, &lock) < 0)<br>>      {<br>>          err = errno;<br>>          if (err == EACCES || err == EAGAIN)<br>>              return FALSE;<br>>          return -1;<br>>      }<br>>      return TRUE;<br>> }<br>><br>> INTEGER FilePosixC__RegularFileUnlock(int fd)<br>> {<br>>      struct flock lock;<br>><br>>      ZeroMemory(&lock, sizeof(lock));<br>>      lock.l_type = F_UNLCK;<br>>      lock.l_whence = SEEK_SET;<br>><br>>      return fcntl(fd, F_SETLK, &lock);<br>> }<br>><br>> #ifdef __cplusplus<br>> } /* extern "C" */<br>> #endif<br>><br>><br>><br>> We can add this to libm3
 probably.<br>><br>><br>>   - Jay<br>><br>><br>>  > Date: Thu, 12 Jul 2012 14:58:11 +0200<br>>  > From: <a ymailto="mailto:pgoltzsch@gmail.com" href="/mc/compose?to=pgoltzsch@gmail.com">pgoltzsch@gmail.com</a><br>>  > To: <a ymailto="mailto:m3devel@elegosoft.com" href="/mc/compose?to=m3devel@elegosoft.com">m3devel@elegosoft.com</a><br>>  > Subject: Re: [M3devel] unix - unknown qualification<br>>  ><br>>  > >>>>> Rodney M. Bates wrote:<br>>  ><br>>  > > I think we need to see some source code for ClsShare.m3.<br>>  > > particularly to see what is before the dot on these lines. I<br>>  > > don't see any of the failing qualifications in Unix.i3 in my<br>>  > > cm3 directory.<br>>  ><br>>  > The first errors are caused by the following procedure,<br>> 
 > which seems to copied from old DEC example code as I found<br>>  > out while looking for a solution:<br>>  ><br>>  > PROCEDURE FilePartLock( h : INTEGER; start, len : INTEGER ) : BOOLEAN RAISES {OSError.E} =<br>>  > VAR flock := Unix.struct_flock {<br>>  > l_type := Unix.F_WRLCK,<br>>  > l_whence := Unix.L_SET,<br>>  > l_start := 0,<br>>  > l_len := 0, (* i.e., whole file *)<br>>  > l_pid := 0 }; (* don't care *)<br>>  > BEGIN<br>>  > flock.l_start := start;<br>>  > flock.l_len := len;<br>>  > IF Unix.fcntl( h, Unix.F_SETLK, LOOPHOLE( ADR( flock ), Ctypes.long ) ) < 0<br>>  > THEN<br>>  > IF Uerror.errno = Uerror.EACCES OR<br>>  > Uerror.errno = Uerror.EAGAIN THEN<br>>  > RETURN FALSE<br>>  > END;<br>>  > OSErrorPosix.Raise()<br>> 
 > END;<br>>  > RETURN TRUE<br>>  > END FilePartLock;<br>>  ><br>>  ><br>>  ><br>>  > Regards,<br>>  ><br>>  > Patrick<br><br></div></blockquote></td></tr></table>