Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
d8207171
L
libvirt
项目概览
openeuler
/
libvirt
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
libvirt
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d8207171
编写于
16年前
作者:
D
Daniel P. Berrange
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Dynamically adjust worker threads in daemon
上级
f6134117
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
111 addition
and
16 deletion
+111
-16
ChangeLog
ChangeLog
+5
-0
qemud/qemud.c
qemud/qemud.c
+94
-15
qemud/qemud.h
qemud/qemud.h
+12
-1
未找到文件。
ChangeLog
浏览文件 @
d8207171
Tue Jan 20 19:26:53 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
* qemud/qemud.c, qemud/qemud.h: Dynamic spawn/cleanup threads
for processing RPC calls as number of clients changes
Tue Jan 20 19:24:53 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
* qemud/qemud.c, qemud/qemud.h, qemud/remote.c: Allow the
...
...
This diff is collapsed.
Click to expand it.
qemud/qemud.c
浏览文件 @
d8207171
...
...
@@ -167,7 +167,7 @@ static void sig_handler(int sig, siginfo_t * siginfo,
static
void
qemudDispatchClientEvent
(
int
watch
,
int
fd
,
int
events
,
void
*
opaque
);
static
void
qemudDispatchServerEvent
(
int
watch
,
int
fd
,
int
events
,
void
*
opaque
);
static
int
qemudStartWorker
(
struct
qemud_server
*
server
,
struct
qemud_worker
*
worker
);
void
qemudClientMessageQueuePush
(
struct
qemud_client_message
**
queue
,
...
...
@@ -1247,6 +1247,20 @@ static int qemudDispatchServer(struct qemud_server *server, struct qemud_socket
server
->
clients
[
server
->
nclients
++
]
=
client
;
if
(
server
->
nclients
>
server
->
nactiveworkers
&&
server
->
nactiveworkers
<
server
->
nworkers
)
{
int
i
;
for
(
i
=
0
;
i
<
server
->
nworkers
;
i
++
)
{
if
(
!
server
->
workers
[
i
].
hasThread
)
{
if
(
qemudStartWorker
(
server
,
&
server
->
workers
[
i
])
<
0
)
return
-
1
;
server
->
nactiveworkers
++
;
break
;
}
}
}
return
0
;
cleanup:
...
...
@@ -1302,19 +1316,28 @@ static struct qemud_client *qemudPendingJob(struct qemud_server *server)
static
void
*
qemudWorker
(
void
*
data
)
{
struct
qemud_server
*
server
=
data
;
struct
qemud_worker
*
worker
=
data
;
struct
qemud_server
*
server
=
worker
->
server
;
while
(
1
)
{
struct
qemud_client
*
client
=
NULL
;
struct
qemud_client_message
*
reply
;
virMutexLock
(
&
server
->
lock
);
while
((
client
=
qemudPendingJob
(
server
))
==
NULL
)
{
while
(((
client
=
qemudPendingJob
(
server
))
==
NULL
)
&&
!
worker
->
quitRequest
)
{
if
(
virCondWait
(
&
server
->
job
,
&
server
->
lock
)
<
0
)
{
virMutexUnlock
(
&
server
->
lock
);
return
NULL
;
}
}
if
(
worker
->
quitRequest
)
{
if
(
client
)
virMutexUnlock
(
&
client
->
lock
);
virMutexUnlock
(
&
server
->
lock
);
return
NULL
;
}
worker
->
processingCall
=
1
;
virMutexUnlock
(
&
server
->
lock
);
/* We own a locked client now... */
...
...
@@ -1341,7 +1364,38 @@ static void *qemudWorker(void *data)
client
->
refs
--
;
virMutexUnlock
(
&
client
->
lock
);
virMutexLock
(
&
server
->
lock
);
worker
->
processingCall
=
0
;
virMutexUnlock
(
&
server
->
lock
);
}
}
static
int
qemudStartWorker
(
struct
qemud_server
*
server
,
struct
qemud_worker
*
worker
)
{
pthread_attr_t
attr
;
pthread_attr_init
(
&
attr
);
/* We want to join workers, so don't detach them */
/*pthread_attr_setdetachstate(&attr, 1);*/
if
(
worker
->
hasThread
)
return
-
1
;
worker
->
server
=
server
;
worker
->
hasThread
=
1
;
worker
->
quitRequest
=
0
;
worker
->
processingCall
=
0
;
if
(
pthread_create
(
&
worker
->
thread
,
&
attr
,
qemudWorker
,
worker
)
!=
0
)
{
worker
->
hasThread
=
0
;
worker
->
server
=
NULL
;
return
-
1
;
}
return
0
;
}
...
...
@@ -1940,21 +1994,19 @@ static int qemudRunLoop(struct qemud_server *server) {
virMutexLock
(
&
server
->
lock
);
server
->
nworkers
=
min_workers
;
if
(
min_workers
>
max_workers
)
max_workers
=
min_workers
;
server
->
nworkers
=
max_workers
;
if
(
VIR_ALLOC_N
(
server
->
workers
,
server
->
nworkers
)
<
0
)
{
VIR_ERROR0
(
_
(
"Failed to allocate workers"
));
return
-
1
;
}
for
(
i
=
0
;
i
<
server
->
nworkers
;
i
++
)
{
pthread_attr_t
attr
;
pthread_attr_init
(
&
attr
);
pthread_attr_setdetachstate
(
&
attr
,
1
);
pthread_create
(
&
server
->
workers
[
i
],
&
attr
,
qemudWorker
,
server
);
for
(
i
=
0
;
i
<
min_workers
;
i
++
)
{
if
(
qemudStartWorker
(
server
,
&
server
->
workers
[
i
])
<
0
)
goto
cleanup
;
server
->
nactiveworkers
++
;
}
for
(;;)
{
...
...
@@ -2000,6 +2052,26 @@ static int qemudRunLoop(struct qemud_server *server) {
}
}
/* If number of active workers exceeds both the min_workers
* threshold and the number of clients, then kill some
* off */
for
(
i
=
0
;
(
i
<
server
->
nworkers
&&
server
->
nactiveworkers
>
server
->
nclients
&&
server
->
nactiveworkers
>
min_workers
)
;
i
++
)
{
if
(
server
->
workers
[
i
].
hasThread
&&
!
server
->
workers
[
i
].
processingCall
)
{
server
->
workers
[
i
].
quitRequest
=
1
;
virCondBroadcast
(
&
server
->
job
);
virMutexUnlock
(
&
server
->
lock
);
pthread_join
(
server
->
workers
[
i
].
thread
,
NULL
);
virMutexLock
(
&
server
->
lock
);
server
->
workers
[
i
].
hasThread
=
0
;
server
->
nactiveworkers
--
;
}
}
/* Unregister any timeout that's active, since we
* just had an event processed
*/
...
...
@@ -2015,11 +2087,18 @@ static int qemudRunLoop(struct qemud_server *server) {
}
}
cleanup:
for
(
i
=
0
;
i
<
server
->
nworkers
;
i
++
)
{
pthread_t
thread
=
server
->
workers
[
i
];
if
(
!
server
->
workers
[
i
].
hasThread
)
continue
;
server
->
workers
[
i
].
quitRequest
=
1
;
virCondBroadcast
(
&
server
->
job
);
virMutexUnlock
(
&
server
->
lock
);
pthread_join
(
thread
,
NULL
);
pthread_join
(
server
->
workers
[
i
].
thread
,
NULL
);
virMutexLock
(
&
server
->
lock
);
server
->
workers
[
i
].
hasThread
=
0
;
}
VIR_FREE
(
server
->
workers
);
...
...
This diff is collapsed.
Click to expand it.
qemud/qemud.h
浏览文件 @
d8207171
...
...
@@ -157,13 +157,24 @@ struct qemud_socket {
struct
qemud_socket
*
next
;
};
struct
qemud_worker
{
pthread_t
thread
;
int
hasThread
:
1
;
int
processingCall
:
1
;
int
quitRequest
:
1
;
/* back-pointer to our server */
struct
qemud_server
*
server
;
};
/* Main server state */
struct
qemud_server
{
virMutex
lock
;
virCond
job
;
int
nworkers
;
pthread_t
*
workers
;
int
nactiveworkers
;
struct
qemud_worker
*
workers
;
int
nsockets
;
struct
qemud_socket
*
sockets
;
int
nclients
;
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录