Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
徽霖
Vscode
提交
2af4677f
V
Vscode
项目概览
徽霖
/
Vscode
通知
9
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
Vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2af4677f
编写于
6月 14, 2019
作者:
J
Joao Moreno
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
implement timeout mechanism for missing ipc channels
fixes #72531
上级
3fe6a332
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
59 addition
and
8 deletion
+59
-8
src/vs/base/parts/ipc/common/ipc.ts
src/vs/base/parts/ipc/common/ipc.ts
+59
-8
未找到文件。
src/vs/base/parts/ipc/common/ipc.ts
浏览文件 @
2af4677f
...
...
@@ -246,19 +246,29 @@ function deserialize(reader: IReader): any {
}
}
interface
PendingRequest
{
request
:
IRawPromiseRequest
|
IRawEventListenRequest
;
timeoutTimer
:
NodeJS
.
Timer
;
}
export
class
ChannelServer
<
TContext
=
string
>
implements
IChannelServer
<
TContext
>
,
IDisposable
{
private
channels
=
new
Map
<
string
,
IServerChannel
<
TContext
>>
();
private
activeRequests
=
new
Map
<
number
,
IDisposable
>
();
private
protocolListener
:
IDisposable
|
null
;
constructor
(
private
protocol
:
IMessagePassingProtocol
,
private
ctx
:
TContext
)
{
// Requests might come in for channels which are not yet registered.
// They will timeout after `timeoutDelay`.
private
pendingRequests
=
new
Map
<
string
,
PendingRequest
[]
>
();
constructor
(
private
protocol
:
IMessagePassingProtocol
,
private
ctx
:
TContext
,
private
timeoutDelay
:
number
=
1000
)
{
this
.
protocolListener
=
this
.
protocol
.
onMessage
(
msg
=>
this
.
onRawMessage
(
msg
));
this
.
sendResponse
({
type
:
ResponseType
.
Initialize
});
}
registerChannel
(
channelName
:
string
,
channel
:
IServerChannel
<
TContext
>
):
void
{
this
.
channels
.
set
(
channelName
,
channel
);
this
.
flushPendingRequests
(
channelName
);
}
private
sendResponse
(
response
:
IRawResponse
):
void
{
...
...
@@ -311,11 +321,7 @@ export class ChannelServer<TContext = string> implements IChannelServer<TContext
const
channel
=
this
.
channels
.
get
(
request
.
channelName
);
if
(
!
channel
)
{
this
.
sendResponse
(
<
IRawResponse
>
{
id
:
request
.
id
,
data
:
{
message
:
request
.
channelName
,
name
:
'
Unknown channel
'
,
stack
:
undefined
},
type
:
ResponseType
.
PromiseError
});
this
.
collectPendingRequest
(
request
);
return
;
}
...
...
@@ -357,7 +363,7 @@ export class ChannelServer<TContext = string> implements IChannelServer<TContext
const
channel
=
this
.
channels
.
get
(
request
.
channelName
);
if
(
!
channel
)
{
console
.
error
(
`Unknown channel:
${
request
.
channelName
}
`
);
this
.
collectPendingRequest
(
request
);
return
;
}
...
...
@@ -377,6 +383,46 @@ export class ChannelServer<TContext = string> implements IChannelServer<TContext
}
}
private
collectPendingRequest
(
request
:
IRawPromiseRequest
|
IRawEventListenRequest
):
void
{
let
pendingRequests
=
this
.
pendingRequests
.
get
(
request
.
channelName
);
if
(
!
pendingRequests
)
{
pendingRequests
=
[];
this
.
pendingRequests
.
set
(
request
.
channelName
,
pendingRequests
);
}
const
timer
=
setTimeout
(()
=>
{
console
.
error
(
`Unknown channel:
${
request
.
channelName
}
`
);
if
(
request
.
type
===
RequestType
.
Promise
)
{
this
.
sendResponse
(
<
IRawResponse
>
{
id
:
request
.
id
,
data
:
{
name
:
'
Unknown channel
'
,
message
:
`Channel name '
${
request
.
channelName
}
' timed out after
${
this
.
timeoutDelay
}
ms`
,
stack
:
undefined
},
type
:
ResponseType
.
PromiseError
});
}
},
this
.
timeoutDelay
);
pendingRequests
.
push
({
request
,
timeoutTimer
:
timer
});
}
private
flushPendingRequests
(
channelName
:
string
):
void
{
const
requests
=
this
.
pendingRequests
.
get
(
channelName
);
if
(
requests
)
{
for
(
const
request
of
requests
)
{
clearTimeout
(
request
.
timeoutTimer
);
switch
(
request
.
request
.
type
)
{
case
RequestType
.
Promise
:
this
.
onPromise
(
request
.
request
);
break
;
case
RequestType
.
EventListen
:
this
.
onEventListen
(
request
.
request
);
break
;
}
}
this
.
pendingRequests
.
delete
(
channelName
);
}
}
public
dispose
():
void
{
if
(
this
.
protocolListener
)
{
this
.
protocolListener
.
dispose
();
...
...
@@ -596,6 +642,7 @@ export interface ClientConnectionEvent {
}
interface
Connection
<
TContext
>
extends
Client
<
TContext
>
{
readonly
channelServer
:
ChannelServer
<
TContext
>
;
readonly
channelClient
:
ChannelClient
;
}
...
...
@@ -634,7 +681,7 @@ export class IPCServer<TContext = string> implements IChannelServer<TContext>, I
this
.
channels
.
forEach
((
channel
,
name
)
=>
channelServer
.
registerChannel
(
name
,
channel
));
const
connection
:
Connection
<
TContext
>
=
{
channelClient
,
ctx
};
const
connection
:
Connection
<
TContext
>
=
{
channel
Server
,
channel
Client
,
ctx
};
this
.
_connections
.
add
(
connection
);
this
.
_onDidChangeConnections
.
fire
(
connection
);
...
...
@@ -670,6 +717,10 @@ export class IPCServer<TContext = string> implements IChannelServer<TContext>, I
registerChannel
(
channelName
:
string
,
channel
:
IServerChannel
<
TContext
>
):
void
{
this
.
channels
.
set
(
channelName
,
channel
);
for
(
const
connection
of
this
.
_connections
)
{
connection
.
channelServer
.
registerChannel
(
channelName
,
channel
);
}
}
dispose
():
void
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录