Serial port, unix calls, some thoughts
Daniel Vainsencher
danielv at netvision.net.il
Tue May 27 09:59:47 UTC 2003
Sounds like a good direction to me. You raise the downside of not having
a constant interface. But it would be easy maintain a Smalltalk side
facade that represents the same kind of minimal interface we have today.
Only issue I see is that it would tempt people to make applications
platform specific to get that extra parameter, instead of finding a more
general hack.
That would reduce sharability in the community, which is bad.
Daniel
John M McIntosh <johnmci at smalltalkconsulting.com> wrote:
> Dan asked me to add a better degree of serial support to the mac os-x
> VM, and it seems one just uses the Unix calls for this, versus apple
> specific stuff.
>
> Now in looking at this I was thinking here I've all these calls like
> cfgetispeed, cfgetospeed, cfmakeraw, cfsetispeed, cfsetospeed, open,
> close, read, write, ioctl
> tcdrain, tcFlow,t cFlush, tcgetattr, tcsetattr, tcsendbreak
>
> So I was thinking, why not make the actual primitives really sparse to
> avoid C code that would require
> support and VM changes, and then produce implementation specific
> subclasses like so?
>
> SerialPortExtended
> SerialPortExtendedUnix
> SerialPortExtendedUnixOSX
>
> Which deal with implementation issues. Usually in the past we would
> code up a generic plugin routine, which calls
> a platform specific routine, which then requires maintenance usually
> done by only a few VM maintainers hidden in the
> sourceforge source tree, versus an easily accessible chunk of Smalltalk
> code.
>
> So for example
> SerialPortExtendedUnix >>cancel
> "tcflush does a cancel and zaps the pending inbound and outbound bytes"
> | error |
> error _ self primitiveSerialPortUnixTcflush: fd action: self tcioflush.
> error isZero ifFalse: [SerialPortExtendedError signal: error asString]
>
> SerialPlugin>>primitiveSerialPortUnixTcflush: fd action: aNumber
> | error |
> self primitive: 'primitiveSerialPortUnixTcflush'
> parameters: #(SmallInteger SmallInteger).
> self cCode: 'error = tcflush(fd,aNumber); if (error == -1) error =
> errno' inSmalltalk: [error _ 1].
> ^ error asSmallIntegerObj
>
> Mmm in the past this might have been just a call to a generic flush,
> which calls the unix serial port code, which does
> the tcflush(fd,TCIOFLUSH). Now if some squeaker really wanted to do a
> tcflush(fd,TCOFLUSH) instead then well it's
> easy to add that method call and primitive hookup, even to make it an
> enhancement and lobby to get it into
> the base image. However past thinking would require a VM change, by the
> powers that be, or by managing your own personal VM.
>
> {I'll note that I do capture errno in the C code, versus looking for it
> in the smalltalk, however my concern is that
> going to get errno after the fact might return zero because someother
> unix call(s) could be made before our
> process thread could retrieve it.}
>
> On the downside, if for example your termios structure is different
> that the OSX one why then you need a
> different subclass of the basetermios class which allows you to
> put/extract bytes/ints from the structure.
> Normally that problem would be hidden away in the C code and your
> platform specific vm would deal with the issues, so all is not happy.
>
> Another example would be CTS/DTR control by exposing SerHShake for os9,
> and ioctl for os-x/unix.
> which then exposes all sorts of other support so if someone really
> wants to see TIOCM_CAR then they
> can without having someone build a new vm.
>
> In some respects this begs the question about using FFI more since once
> could do a lot more with FFI.
>
> For the open,close,read,write,ioctl calls, any thoughts on where they
> should go? They aren't serial port
> specific, do we have a lightweight unix plugin we can hide them in?
>
>
> PS as another example consider <primitive: 'primitiveFileRead' module:
> 'FilePlugin'>
> it really resolves after some time into a call to fread. But doesn't
> return or check ferror(). So on an I/O
> error by the time things migrate up to smalltalk objects one can't
> discover why the error occurred. If that was a sparse
> method call, someone might have gotten motivated and posted a changeset
> to call ferror()? in the non-existent
> StandardFileStreamUnix class when they discovered fread returned zero.
>
> So thoughts?
>
> --
> ========================================================================
> ===
> John M. McIntosh <johnmci at smalltalkconsulting.com> 1-800-477-2659
> Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com
> ========================================================================
> ===
More information about the Squeak-dev
mailing list
|