Le 14/01/2016 19:33, Mariano Martinez Peck a écrit :
> Dear all, 
> 
> I am happy to tell you I have a first prototype of the tool for
> executing OS processes:
> 
> https://github.com/marianopeck/OSSubprocess
> 
>  As I said many times, the main idea was to be as much as possible
> FFI-based, only for executing OS commands and, from my point of view, a
> better end-user API. Also, as for the first step, I had to focus on
> Linux/OSX. 
> 
> I would like to thank Pharo Consortium for the sponsor of this
> development effort. Here is the first milestone!
> 
> There are many things on my to-do but I think the code is ready for some
> usage, testing, code review and feedback!  
> 
> All classes and all methods have comments and I have quite some unit
> tests. All tests are green in my OSX and a CentOS box. 
> 
> *Important: you CANNOT have OSProcess installed in the same image as
> OSSubprocess. This is because I am reusing his SIGCHLD handler and for
> the time being both cannot coexist.  *
> 
> Keep in mind that the tool may be unstable and that MAY mean a VM crash.
> So use with care, mostly the first time. If all tests passes, then there
> are much less chances of something going bad. 
> 
> Important disclaimer: my tool (OSSubproccess from now onward) is HIGHLY
> influenced by a subset of the OSProcess project. There are parts which I
> even simply copied and adapted them (OSSPipe, OSSAttachableStream,
> OSSUnixProcessExitStatus). Other parts, I took them as inspiration (the
> idea of ThisOSProcess representing the VM process, the child watcher,
> and many others). In addition, I AM STILL USING (maybe as a first step?)
> some of the OSProcess PLUGIN (not OSProcess image side), such as the
> SIGCHLD handler or the creation of pipes.
> 
> In github url you have all the documentation of the project, included
> how to install it and use it. 
> 
> *Finally, if you test it in a OS different than OSX and CentOS please
> share with me the results (about the tests).* Tomorrow the
> ConfigurationOf should also appear in the Catalog of Pharo 5.0. 
> 
> Any feedback is appreciated. 
> 
> Best, 
> 
> -- 
> Mariano
> http://marianopeck.wordpress.com

Hi,

Thank you for your work!

In Windows seven I got an error on loading.

Executed code in Pharo 5:

Metacello new
    configuration: 'OSSubprocess';
    repository: 'github://marianopeck/OSSubprocess:master/repository';
    version: #stable;
    load.

Stack:

ExternalLibraryFunction(Object)>>error:
ExternalLibraryFunction(Object)>>externalCallFailed
ExternalLibraryFunction(ExternalFunction)>>invokeWithArguments:
OSSUnixSystemAccessor>>primitiveGetpid
FFICalloutAPI>>function:module:
OSSUnixSystemAccessor(Object)>>ffiCall:
OSSUnixSystemAccessor>>primitiveGetpid
OSSUnixSystemAccessor>>getPid
OSSVMProcess>>initialize
OSSVMProcess class>>initializeVMProcessInstance
OSSVMProcess class>>initialize
MCMethodDefinition>>postloadOver:
[ :each | each postloadOver: (self obsoletionFor: each) ] in
MCPackageLoader>>basicLoadDefinitions in Block: [ :each | each
postloadOver: (self obsoletionFor: ...etc...
[ :each |
| newLabel |
"Special handling for first and last element"
(count = 0
        or:
                [ count + 1 = size
                        or: [ (Time millisecondsSince: lastUpdate) >= msecs ] ])
        ifTrue:
                [ bar current: count.
                oldLabel = (newLabel := (labelBlock cull: each) ifNil: [ 
oldLabel ])
                        ifFalse: [ bar label: newLabel.
                                oldLabel := newLabel ].
                lastUpdate := Time millisecondClockValue ].
aBlock value: each.
count := count + 1 ] in [ :bar |
labelBlock := aStringOrBlock isString
        ifTrue: [ bar label: aStringOrBlock.
                [ :dummyItem | aStringOrBlock ] ]
        ifFalse: [ aStringOrBlock ].
self
        do:
                [ :each |
                | newLabel |
                "Special handling for first and last element"
                (count = 0
                        or:
                                [ count + 1 = size
                                        or: [ (Time millisecondsSince: 
lastUpdate) >= msecs ] ])
                        ifTrue:
                                [ bar current: count.
                                oldLabel
                                        = (newLabel := (labelBlock cull: each) 
ifNil: [ oldLabel ])
                                        ifFalse: [ bar label: newLabel.
                                                oldLabel := newLabel ].
                                lastUpdate := Time millisecondClockValue ].
                aBlock value: each.
                count := count + 1 ] ] in
OrderedCollection(Collection)>>do:displayingProgress:every: in Block: [
:each | ...
OrderedCollection>>do:
[ :bar |
labelBlock := aStringOrBlock isString
        ifTrue: [ bar label: aStringOrBlock.
                [ :dummyItem | aStringOrBlock ] ]
        ifFalse: [ aStringOrBlock ].
self
        do:
                [ :each |
                | newLabel |
                "Special handling for first and last element"
                (count = 0
                        or:
                                [ count + 1 = size
                                        or: [ (Time millisecondsSince: 
lastUpdate) >= msecs ] ])
                        ifTrue:
                                [ bar current: count.
                                oldLabel
                                        = (newLabel := (labelBlock cull: each) 
ifNil: [ oldLabel ])
                                        ifFalse: [ bar label: newLabel.
                                                oldLabel := newLabel ].
                                lastUpdate := Time millisecondClockValue ].
                aBlock value: each.
                count := count + 1 ] ] in
OrderedCollection(Collection)>>do:displayingProgress:every: in Block: [
:bar | ...
BlockClosure>>cull:
[ ^ block cull: self ] in [ self prepareForRunning.
CurrentJob value: self during: [ ^ block cull: self ] ] in Job>>run in
Block: [ ^ block cull: self ]
[ p psValueAt: index put: anObject.
aBlock value ] in CurrentJob(DynamicVariable)>>value:during: in Block: [
p psValueAt: index put: anObject....
BlockClosure>>ensure:
CurrentJob(DynamicVariable)>>value:during:
CurrentJob class(DynamicVariable class)>>value:during:
[ self prepareForRunning.
CurrentJob value: self during: [ ^ block cull: self ] ] in Job>>run in
Block: [ self prepareForRunning....
BlockClosure>>ensure:
Job>>run
MorphicUIManager(UIManager)>>displayProgress:from:to:during:
ByteString(String)>>displayProgressFrom:to:during:
OrderedCollection(Collection)>>do:displayingProgress:every:
OrderedCollection(Collection)>>do:displayingProgress:
MCPackageLoader>>basicLoadDefinitions



-- 
Cyril Ferlicot

http://www.synectique.eu

165 Avenue Bretagne
Lille 59000 France

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to