[M3devel] RC merge
Tony Hosking
hosking at cs.purdue.edu
Sun Sep 13 20:34:36 CEST 2009
I'm happy with what you have done (small safe ThreadF, internal unsafe
ThreadInternal).
Thanks.
On 13 Sep 2009, at 14:02, Jay K wrote:
> > The Id type and MyId function is simply a convenience
>
> But what do we do about it?
> It is out there and being used.
> It ought not have been, but it was and is.
>
> The safety hole SetCurrentHandlers(WhateverState()) was also out
> there as I understand.
>
> Should break the existing users?
> And/or move MyId to Thread.i3?
> Or ThreadFSafe.i3?
>
> I really don't think the way it was is the best choice.
> At the very least, ThreadF should either be interface instead of
> Interface and/or UNSAFE.
> But those options have the collateral damage of breaking users of
> ThreadF.MyId.
> I chose a route that doesn't have that damage and contains any churn
> to within m3core.
>
> - Jay
>
> From: hosking at cs.purdue.edu
> To: jay.krell at cornell.edu
> Date: Sun, 13 Sep 2009 13:43:48 -0400
> CC: mika at async.async.caltech.edu; m3devel at elegosoft.com
> Subject: Re: [M3devel] RC merge
>
> Safe code can't do anything with a value of type ADDRESS except pass
> it around. It must use unsafe operations (NARROW) to turn it into
> something usable.
>
> I think you misunderstood ThreadF in the first place. It has always
> been logically unsafe, if not UNSAFE. I don't want ThreadF ever to
> come to be something that people outside the runtime system rely
> on. The Id type and MyId function is simply a convenience, but not
> and never has been part of the standard interfaces.
>
> Can we please just revert back to the way it has always been?
>
> On 13 Sep 2009, at 09:51, Jay K wrote:
>
> The functions are meant to be unsafe either way.
> ThreadF.i3 clearly had a safety hole before, but not due to the
> functions "in question".
>
> Good point about passing in ADDRESSes..but I'm not entirely sure I
> understand/agree.
> Can safe code ("directly") generate any ADDRESSes at all? Or only
> get them from
> unsafe code in the first place?
> ADDRESS only comes from ADR, right? And ADR isn't allowed in safe?
> I'll check.
>
> IF safe code CAN generate ADDRESSes, then this was a hole:
> PROCEDURE SetCurrentHandlers(h: ADDRESS);
>
> and perhaps these:
> PROCEDURE SuspendOthers ();
> (* Suspend all threads except the caller's *)
>
> PROCEDURE ResumeOthers ();
>
> Though probably not the second, since safe code can trivially hang/
> deadlock on its own.
>
> The public safe ThreadF.i3 now just:
>
> (*-------------------------------------------------- showthreads
> support ---*)
>
> TYPE
> State = {
> alive (* can run *),
> waiting (* waiting for a condition via Wait *),
> locking (* waiting for a mutex to be unlocked *),
> pausing (* waiting until some time is arrived *),
> blocking (* waiting for some IO *),
> dying (* done, but not yet joined *),
> dead (* done and joined *)
> };
>
> (*--------------------------------------------------------------
> identity ---*)
>
> TYPE
> Id = INTEGER;
>
> PROCEDURE MyId(): Id RAISES {};
> (* return Id of caller *)
>
>
> Everything else I moved to the non-public ThreadInternal.i3.
>
>
> > But in Modula-3 whether an interface is unsafe or not *is* a
> boolean.
>
> Understood, but I still think even in unsafe code, LOOPHOLE should
> be minimized.
> C and C++ programmers are often taught to minimize casts, esp.
> reinterpret_cast.
> I think that guidance carries over to Modula's LOOPHOLE, even if you
> are already unsafe
> for other reasons.
>
> - Jay
>
>
> > To: jay.krell at cornell.edu
> > CC: m3devel at elegosoft.com
> > Subject: Re: [M3devel] RC merge
> > Date: Sun, 13 Sep 2009 02:44:50 -0700
> > From: mika at async.async.caltech.edu
> >
> > Jay K writes:
> > ...
> > >
> > >Imagine you are a somewhat prolific fairly happy C or C++
> programmer. The w=
> > >hole world is unsafe=2C but recieves a fair amount of static
> checking and i=
> > >s therefore largely correct and perhaps doesn't even suffer much
> from the l=
> > >ack of safety.
> > >
> > >=20
> > >
> > > void* GetFoo(void)=3B=20
> > >
> > > void* GetBar(void)=3B=20
> > >
> > >=20
> > >
> > >or
> > >
> > >=20
> > >
> > > Foo_t* GetFoo(void)=3B=20
> > >
> > > Bar_t* GetBar(void)=3B=20
> > >
> > >=20
> > >
> > >?
> > >
> > >=20
> > >
> > >Definitely the second.
> > >
> > >=20
> > >
> > >Perhaps perhaps perhaps perhaps a function should be able to be
> declared to=
> > > return an UNTRACED REF Foo.Something=2C without actually
> importing Foo or =
> > >defining Something?
> > >
> > >=20
> > >
> > >Clearly the safety of an /interface/ is more subtle than a boolean.
> > >
> > >Some functions may be safe and others unsafe.
> > >
> > >Even some uses of functions.
> > >
> > >Imagine for example:
> > >
> > >=20
> > >
> > >PROCEDURE GetFoo(): UNTRACED REF Foo.Something=3B
> > >
> > >=20
> > >
> > >Perhas a safe function could call this function=2C as long as it
> only compa=
> > >res the return value to NIL?
> > >
> > >Actually storing it in a variable would require IMPORT Foo=2C and
> if FOO is=
> > > declared UNSAFE=2C then that would
> > >
> > >pollute the caller. Or maybe merely declaring a variable of
> UNTRACED is eno=
> > >ugh to wreck safety?
> >
> > But in Modula-3 whether an interface is unsafe or not *is* a
> boolean.
> > It's very clearly defined what it means in the Green Book.
> >
> > If you don't declare your GetFoo as UNSAFE you can write
> >
> > VAR x := GetFoo; BEGIN (* manipulate fields of x *) END
> >
> > in safe code.
> >
> > Declaring GetFoo to return ADDRESS won't let you do that. Hence,
> > it's safer, if there's a safety problem with manipulating the
> fields.
> >
> > An interface can hardly assume that it is the only one injecting
> objects
> > of type ADDRESS into the "safe world" so if you're allowing the
> safe world
> > to pass these objects back in your interface you have to sanity-
> check
> > them anyhow. You do not, however, need to worry about the fields
> having
> > been changed by the safe code.
> >
> > If you need some more subtle properties than that you probably ought
> > to be writing UNSAFE code in the first place. Or is there some
> trickery
> > you can do along the lines of what we came up with for small
> integers
> > in pointers?
> >
> > Mika
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20090913/a5eee77f/attachment-0002.html>
More information about the M3devel
mailing list