SmallLintBrowser Beta1

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

SmallLintBrowser Beta1

Steve Alan Waring
Hi,

With Donald MacQueen's permission, I have ported his SmallLint UI to D5.

The attached zip contains two packages.

The "RBSmallLint Changes" package contains loose methods additions and fixes
to the base system. Blair has told me that these changes will be folded into
the next D5 release. Notes about the loose methods are in the package
comment and appended to this message.

The "RBSmallLintBrowser" package contains the Beta v1 of SmallLintBrowser.
You need to manually install the "RBSmallLint Changes" package first as
there are no dependencies.

Appended to this message is a message from Blair discussing the issues
involved in running a check in a background process while modifying the
system.

Please send any UI suggestions or bug reports to me. Please post any
LintRule suggestions or bug reports to the newsgroup.

Thanks to everyone involved with Smalllint; Don Roberts, John Brant, Blair
McGlashan, Andy Bower and Donald MacQueen. With Donald's D4 UI and the new
D5 selection presenter goodies, I didnt have much to do!

Thanks,
Steve Waring

=======================
Noted Defects:
#1 ProblemClass listView should have a context menu to browse problem
methods for that class/rule

=======================

"Blair McGlashan" <[hidden email]> wrote:

> ... I suspect both actually have race conditions, but that the VA ones are
> more obvious in practice. It may be because VW's multi-tasking model is
> particularly "co-operative" that one just gets away with it more. In
Dolphin
> and VW (I don't know about VA) access to the sources files is _not_ done
in

> an atomic fashion, so if more than one process were attempting to access
> them, then there is potential for them both trying to move the stream
> pointer and read (or worse write) a chunk at the same time.
>
> Imagine the situation where SmallLint is running, and attempts to pull the
> source of a method from the change log. At the same time one is saving a
> method. There is a race for access to the change log. If SmallLint loses,
> then it ends up reading invalid source code from the change log (i.e. it
> moves the stream pointer, but before it can read the chunk, or while it is
> doing so, it gets pre-empted). If the active UI process (which is saving
> down a method on the users instruction) loses, then it could overwrite
> previous entries in the change log, corrupting it.
>
> I think the second scenario is either unlikely, or if the perhaps
> impossible, if the SmallLint checking process is running at a background
> priority. If may itself get pre-empted when attempting to read source (and
> therefore read the wrong source), but it could not pre-empty the higher
> priority process writing to the change log.
>
> Other potential race conditions exist where the Smalllint process ends up
> with "dirty reads", e.g. it starts processing a method which has been
> overwritten, or a class which is deleted. I think one could code
defensively
> around these. The first example probably doesn't matter, and in the second
> case one just needs to be prepared for the class having been deleted when
> presenting results. Perhaps there is already code in place to handle this.
>
> Personally I would have thought the most sensible action would be to make
a
> cup of tea (or tea and cake when necessary) :-).


=======================
Bug Fixes (RBSmallLint Changes)
===
CompositeLintRule(class)>>ruleFor:protocol:
Bug Fix, overwrite, #rbDMM
===
VariableEnvironment>>allClassesDo:
Bug Fix, overwrite, #rbSW
===
VariableEnvironment>>includesClass:
Bug Fix, overwrite, #rbSW
===
SmalllintContext>>protocol
Bug Fix, overwrite, #rbDMM
===
Behavior>>fullBindingFor:
Bug Fix, Addition, #rbDMM
===
Behavior>>protectedBindingFor:
Bug Fix, Addition, #rbDMM
===
UndefinedObject>>protectedBindingFor:
Bug Fix, Addition, #rbDMM
===
BlockLintRule(class)>>undeclaredVariables
Bug Fix, Addition, #rbDMM
===
CompiledMethod>>withAllBlockMethodsDo:
Bug Fix, Addition, #rbDMM


=======================
Cometic Fixes
===
BlockLintRule(class)>>tempsUnused
Cosmetic Fix, Addition,  #rbDMM
===
ParseTreeLintRule(class)>>contains:
Cosmetic Fix, overwrite, #rbSW
===
BlockLintRule(class)>>overridesSpecialMessage
Cosmetic Fix, overwrite, #rbSW
===
BlockLintRule(class)>>superMessages
Cosmetic Fix, overwrite, #rbDMM
===
BlockLintRule(class)>>fullBlocks
Cosmetic Fix, overwrite, #rbSW
===
BlockLintRule(class)>>utilityProtocols
Cosmetic Fix, overwrite, #rbSW
===
CompiledMethod>>equivalentTo:
Cosmetic Fix, overwrite, #rbSW


begin 666 RBSmallLintBrowserB1.zip
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
M]BNL>ZWK$O0)9*4($]JO^@8[M='PUT9J.<#:@$9 3U!?_J(PRF4]A0DY$1I
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
MPQE!K6D(MDJD4'M!U?=%Y5GX@);4$VA=WM)#*XD09?7Z;(_R-*P8C -;)%)
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
MEM?)RA@PO7F SP,2E85,9;']Y'SH4&:AZ8C?2XEH")>^R ]0^WU&\RG76L*
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
M7&:9H%X;'6^<)X_@UF&ZC]Y0:$BM/8%'T+\*X'RKZ<5X,-D$+HI*5<^"N2Z
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
L0E-M86QL3&EN="!#:&%N9V5S+G!A8U!+!08``````@`"`(D```!Q*@``````
`
end