mirror of
https://github.com/nginx/nginx.git
synced 2025-06-09 10:52:47 +08:00
Merge 0aa71d5d9d
into 5b8a5c08ce
This commit is contained in:
commit
d24aed5d5b
@ -1403,10 +1403,11 @@ ngx_set_cpu_affinity(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
#if (NGX_HAVE_CPU_AFFINITY)
|
#if (NGX_HAVE_CPU_AFFINITY)
|
||||||
ngx_core_conf_t *ccf = conf;
|
ngx_core_conf_t *ccf = conf;
|
||||||
|
|
||||||
u_char ch, *p;
|
u_char ch, *p, *end, *dash, *start, *colon, *comma;
|
||||||
ngx_str_t *value;
|
ngx_str_t *value;
|
||||||
ngx_uint_t i, n;
|
ngx_uint_t i, n;
|
||||||
ngx_cpuset_t *mask;
|
ngx_cpuset_t *mask;
|
||||||
|
ngx_int_t last, first, stride;
|
||||||
|
|
||||||
if (ccf->cpu_affinity) {
|
if (ccf->cpu_affinity) {
|
||||||
return "is duplicate";
|
return "is duplicate";
|
||||||
@ -1445,6 +1446,76 @@ ngx_set_cpu_affinity(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for ( /* void */ ; n < cf->args->nelts; n++) {
|
for ( /* void */ ; n < cf->args->nelts; n++) {
|
||||||
|
if (value[n].data[0] == '(') {
|
||||||
|
CPU_ZERO(&mask[n - 1]);
|
||||||
|
|
||||||
|
start = value[n].data + 1;
|
||||||
|
end = value[n].data + value[n].len - 1;
|
||||||
|
|
||||||
|
if (*end != ')') {
|
||||||
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
"invalid \"worker_cpu_affinity\" specification");
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (start < end) {
|
||||||
|
/* find next delimiter */
|
||||||
|
for (comma = start; comma < end && *comma != ','; comma++) {
|
||||||
|
/* void */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* parse single element between delimiters */
|
||||||
|
dash = ngx_strlchr(start, comma, '-');
|
||||||
|
if (dash == NULL) {
|
||||||
|
/* single number */
|
||||||
|
first = last = ngx_atoi(start, comma - start);
|
||||||
|
stride = 1;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* range with optional stride */
|
||||||
|
first = ngx_atoi(start, dash - start);
|
||||||
|
colon = ngx_strlchr(dash + 1, comma, ':');
|
||||||
|
if (colon == NULL) {
|
||||||
|
/* no stride */
|
||||||
|
last = ngx_atoi(dash + 1, comma - (dash + 1));
|
||||||
|
stride = 1;
|
||||||
|
} else {
|
||||||
|
/* with stride */
|
||||||
|
last = ngx_atoi(dash + 1, colon - (dash + 1));
|
||||||
|
stride = ngx_atoi(colon + 1, comma - (colon + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first == NGX_ERROR || last == NGX_ERROR
|
||||||
|
|| stride == NGX_ERROR || stride == 0
|
||||||
|
|| first > last)
|
||||||
|
{
|
||||||
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
"invalid \"worker_cpu_affinity\" specification");
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = (ngx_uint_t) first;
|
||||||
|
i <= (ngx_uint_t) last;
|
||||||
|
i += (ngx_uint_t) stride)
|
||||||
|
{
|
||||||
|
if (i >= CPU_SETSIZE) {
|
||||||
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
"invalid \"worker_cpu_affinity\" specification");
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
CPU_SET(i, &mask[n - 1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (comma < end) {
|
||||||
|
start = comma + 1;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (value[n].len > CPU_SETSIZE) {
|
if (value[n].len > CPU_SETSIZE) {
|
||||||
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
Loading…
Reference in New Issue
Block a user