diff --git a/Parallel/IpcParallel/SlaveTask.vb b/Parallel/IpcParallel/SlaveTask.vb
index 5b95bbd..aeded22 100644
--- a/Parallel/IpcParallel/SlaveTask.vb
+++ b/Parallel/IpcParallel/SlaveTask.vb
@@ -168,28 +168,33 @@ RE0:
End If
Dim commandlineArgvs As String = builder(processor, host.HostPort)
+ Dim stdout As String
If Not debugPort Is Nothing Then
Console.WriteLine(commandlineArgvs)
- ' Pause()
+ Pause()
End If
If verbose Then
- Call Console.WriteLine($"[{hostIndex.ToHexString}] {processor} {commandlineArgvs}")
+ Call Console.WriteLine($"[{hostIndex.ToHexString}] [EXEC] {processor} {commandlineArgvs}")
End If
#If netcore5 = 0 Then
- Call CommandLine.Call(processor, commandlineArgvs)
+ stdout = CommandLine.Call(processor, commandlineArgvs)
#Else
- Call CommandLine.Call(processor, commandlineArgvs, dotnet:=True, debug:=Not debugPort Is Nothing)
+ stdout = CommandLine.Call(processor, commandlineArgvs, dotnet:=True, debug:=Not debugPort Is Nothing)
#End If
Call host.Stop()
If Not host.handleSetResult Then
- If verbose Then
- Call Console.WriteLine($"[{Me.GetHashCode}/{hostIndex.ToHexString}] socket have non-ZERO exit status, retry...")
+ If verbose AndAlso host.socketExitCode <> 0 Then
+ Call Console.WriteLine($"[{Me.GetHashCode}/{hostIndex.ToHexString}] socket have non-ZERO exit status({host.socketExitCode}), retry...")
Call Console.WriteLine($"[{Me.GetHashCode}/{hostIndex.ToHexString}] {host.GetLastError}")
+ ElseIf verbose Then
+ Call Console.WriteLine($"[{Me.GetHashCode}] slave process echo:")
+ Call Console.WriteLine(stdout)
+ Call Console.WriteLine("--------- end echo ----------")
End If
GoTo RE0
diff --git a/Parallel/IpcParallel/Stream/ObjectStream.vb b/Parallel/IpcParallel/Stream/ObjectStream.vb
index d5f0d61..acd30ae 100644
--- a/Parallel/IpcParallel/Stream/ObjectStream.vb
+++ b/Parallel/IpcParallel/Stream/ObjectStream.vb
@@ -78,6 +78,12 @@ Namespace IpcStream
End Get
End Property
+ Public ReadOnly Property IsNothing As Boolean
+ Get
+ Return type Is Nothing OrElse stream Is Nothing
+ End Get
+ End Property
+
Sub New()
End Sub
@@ -107,10 +113,17 @@ Namespace IpcStream
Dim chunk As Byte() = read.ReadBytes(size)
Dim typeJson As String = chunk.UTF8String
- size = read.ReadInt32
- type = typeJson.LoadJSON(Of TypeInfo)
- method = CType(methodi, StreamMethods)
- stream = read.ReadBytes(size)
+ If chunk.IsNullOrEmpty AndAlso typeJson.StringEmpty Then
+ ' target object is nothing
+ type = Nothing
+ method = StreamMethods.Auto
+ stream = Nothing
+ Else
+ size = read.ReadInt32
+ type = typeJson.LoadJSON(Of TypeInfo)
+ method = CType(methodi, StreamMethods)
+ stream = read.ReadBytes(size)
+ End If
End Using
End Sub
diff --git a/Parallel/IpcParallel/TaskBuilder.vb b/Parallel/IpcParallel/TaskBuilder.vb
index a547820..620537d 100644
--- a/Parallel/IpcParallel/TaskBuilder.vb
+++ b/Parallel/IpcParallel/TaskBuilder.vb
@@ -1,46 +1,46 @@
#Region "Microsoft.VisualBasic::899ab496ae35911ec94c1e11a823a3b9, Parallel\IpcParallel\TaskBuilder.vb"
- ' Author:
- '
- ' asuka (amethyst.asuka@gcmodeller.org)
- ' xie (genetics@smrucc.org)
- ' xieguigang (xie.guigang@live.com)
- '
- ' Copyright (c) 2018 GPL3 Licensed
- '
- '
- ' GNU GENERAL PUBLIC LICENSE (GPL3)
- '
- '
- ' This program is free software: you can redistribute it and/or modify
- ' it under the terms of the GNU General Public License as published by
- ' the Free Software Foundation, either version 3 of the License, or
- ' (at your option) any later version.
- '
- ' This program is distributed in the hope that it will be useful,
- ' but WITHOUT ANY WARRANTY; without even the implied warranty of
- ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ' GNU General Public License for more details.
- '
- ' You should have received a copy of the GNU General Public License
- ' along with this program. If not, see .
-
-
-
- ' /********************************************************************************/
-
- ' Summaries:
-
- ' Class TaskBuilder
- '
- ' Constructor: (+1 Overloads) Sub New
- '
- ' Function: FromStream, GetArgumentValue, GetArgumentValueNumber, GetMethod, GetParameters
- ' PostError, Run
- '
- ' Sub: PostFinished
- '
- ' /********************************************************************************/
+' Author:
+'
+' asuka (amethyst.asuka@gcmodeller.org)
+' xie (genetics@smrucc.org)
+' xieguigang (xie.guigang@live.com)
+'
+' Copyright (c) 2018 GPL3 Licensed
+'
+'
+' GNU GENERAL PUBLIC LICENSE (GPL3)
+'
+'
+' This program is free software: you can redistribute it and/or modify
+' it under the terms of the GNU General Public License as published by
+' the Free Software Foundation, either version 3 of the License, or
+' (at your option) any later version.
+'
+' This program is distributed in the hope that it will be useful,
+' but WITHOUT ANY WARRANTY; without even the implied warranty of
+' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+' GNU General Public License for more details.
+'
+' You should have received a copy of the GNU General Public License
+' along with this program. If not, see .
+
+
+
+' /********************************************************************************/
+
+' Summaries:
+
+' Class TaskBuilder
+'
+' Constructor: (+1 Overloads) Sub New
+'
+' Function: FromStream, GetArgumentValue, GetArgumentValueNumber, GetMethod, GetParameters
+' PostError, Run
+'
+' Sub: PostFinished
+'
+' /********************************************************************************/
#End Region
@@ -50,6 +50,7 @@ Imports System.Reflection
Imports Microsoft.VisualBasic.ApplicationServices.Development.NetCore5
#End If
Imports Microsoft.VisualBasic.ComponentModel
+Imports Microsoft.VisualBasic.Language
Imports Microsoft.VisualBasic.MIME.application.json
Imports Microsoft.VisualBasic.Net.Tcp
Imports Microsoft.VisualBasic.Parallel
@@ -76,7 +77,9 @@ Public Class TaskBuilder : Implements ITaskDriver
Dim par As Object = GetArgumentValue(i)
Dim targetType As Type = params(i).ParameterType
- If par.GetType.IsInheritsFrom(targetType) Then
+ If par Is Nothing Then
+ Yield par
+ ElseIf par.GetType.IsInheritsFrom(targetType) Then
Yield Conversion.CTypeDynamic(par, targetType)
ElseIf par.GetType Is GetType(SocketRef) Then
' is a common parameter value between
@@ -92,13 +95,16 @@ Public Class TaskBuilder : Implements ITaskDriver
Next
End Function
- Public Function Run() As Integer Implements ITaskDriver.Run
+ Private Function Initialize(ByRef api As MethodInfo, ByRef target As Object, ByRef args As Object()) As Integer
Dim task As IDelegate = GetMethod()
- Dim api As MethodInfo = task.GetMethod
- Dim params As ParameterInfo() = api.GetParameters
- Dim target As Object = task.GetMethodTarget
+ Dim params As ParameterInfo()
+
+ api = task.GetMethod
+ params = api.GetParameters
+ target = task.GetMethodTarget
+
Dim n As Integer = GetArgumentValueNumber()
- Dim args As New List(Of Object)(GetParameters(params, n))
+ Dim argList As New List(Of Object)(GetParameters(params, n))
Call Console.WriteLine("run task:")
Call Console.WriteLine(task.GetJson(indent:=False, simpleDict:=True))
@@ -108,15 +114,36 @@ Public Class TaskBuilder : Implements ITaskDriver
If Not params(i).IsOptional Then
Return PostError(New Exception($"missing parameter value for [{i}]{params(i).Name}!"))
Else
- args.Add(params(i).DefaultValue)
+ argList.Add(params(i).DefaultValue)
End If
Next
+ args = argList.ToArray
+
+ Return 0
+ End Function
+
+ Public Function Run() As Integer Implements ITaskDriver.Run
+ Dim api As MethodInfo = Nothing
+ Dim target As Object = Nothing
+ Dim args As Object() = Nothing
+
+ Try
+ Dim i As New Value(Of Integer)
+
+ If 0 <> (i = Initialize(api, target, args)) Then
+ Return i
+ End If
+ Catch ex As Exception
+ Call PostError(ex)
+ Return 500
+ End Try
+
' send debug message
Call New TcpRequest(masterHost, masterPort).SendMessage(New RequestStream(IPCSocket.Protocol, Protocols.PostStart))
Try
- Call PostFinished(api.Invoke(target, args.ToArray), Protocols.PostResult)
+ Call PostFinished(api.Invoke(target, args), Protocols.PostResult)
Catch ex As Exception
Call PostError(ex)
Finally
@@ -165,11 +192,17 @@ Public Class TaskBuilder : Implements ITaskDriver
Dim request As New RequestStream(IPCSocket.Protocol, Protocols.GetArgumentByIndex, BitConverter.GetBytes(i))
Dim resp = New TcpRequest(masterHost, masterPort).SendMessage(request)
Dim stream As New ObjectStream(resp.ChunkBuffer)
- Dim socket As SocketRef = SocketRef.GetSocket(stream)
- Using buffer As ObjectStream = socket.Open
- Return FromStream(buffer)
- End Using
+ If stream.IsNothing Then
+ ' 20210516 object value is nothing?
+ Return Nothing
+ Else
+ Dim socket As SocketRef = SocketRef.GetSocket(stream)
+
+ Using buffer As ObjectStream = socket.Open
+ Return FromStream(buffer)
+ End Using
+ End If
End Function
Private Function PostError(err As Exception) As Integer
diff --git a/Parallel/ThreadTask/ThreadTask.vb b/Parallel/ThreadTask/ThreadTask.vb
index 22588da..1ee7592 100644
--- a/Parallel/ThreadTask/ThreadTask.vb
+++ b/Parallel/ThreadTask/ThreadTask.vb
@@ -146,6 +146,9 @@ Namespace ThreadTask
''' Run parallel task list
'''
'''
+ '''
+ ''' Threads count is 1 or debug mode will running in sequence mode
+ '''
Public Function RunParallel() As IEnumerable(Of TOut)
If threads.Length = 1 OrElse debugMode Then
Return SequenceTask()