Nginx源代码分析之初始化(三)
来源:互联网 发布:拳皇97超强优化版 编辑:程序博客网 时间:2024/04/30 15:45
ngx_create_thread 有多个版本
类unix 下面的
ngx_err_t
ngx_create_thread(ngx_tid_t *tid, ngx_thread_value_t (*func)(void *arg),
void *arg, ngx_log_t *log)
{
int err;
if (nthreads >= max_threads) {
ngx_log_error(NGX_LOG_CRIT, log, 0,
"no more than %ui threads can be created", max_threads);
return NGX_ERROR;
}
err = pthread_create(tid, &thr_attr, func, arg);
if (err != 0) {
ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_create() failed");
return err;
}
ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,
"thread is created: " NGX_TID_T_FMT, *tid);
nthreads++;
return err;
}
bsd下面的
ngx_err_t
ngx_create_thread(ngx_tid_t *tid, ngx_thread_value_t (*func)(void *arg),
void *arg, ngx_log_t *log)
{
ngx_pid_t id;
ngx_err_t err;
char *stack, *stack_top;
if (nthreads >= max_threads) {
ngx_log_error(NGX_LOG_CRIT, log, 0,
"no more than %ui threads can be created", max_threads);
return NGX_ERROR;
}
last_stack -= ngx_thread_stack_size;
stack = mmap(last_stack, usable_stack_size, PROT_READ|PROT_WRITE,
MAP_STACK, -1, 0);
if (stack == MAP_FAILED) {
ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
"mmap(%p:%uz, MAP_STACK) thread stack failed",
last_stack, usable_stack_size);
return NGX_ERROR;
}
if (stack != last_stack) {
ngx_log_error(NGX_LOG_ALERT, log, 0,
"stack %p address was changed to %p", last_stack, stack);
return NGX_ERROR;
}
stack_top = stack + usable_stack_size;
ngx_log_debug2(NGX_LOG_DEBUG_CORE, log, 0,
"thread stack: %p-%p", stack, stack_top);
ngx_set_errno(0);
id = rfork_thread(RFPROC|RFTHREAD|RFMEM, stack_top,
(ngx_rfork_thread_func_pt) func, arg);
err = ngx_errno;
if (id == -1) {
ngx_log_error(NGX_LOG_ALERT, log, err, "rfork() failed");
} else {
*tid = id;
nthreads = (ngx_freebsd_kern_usrstack - stack_top)
/ ngx_thread_stack_size;
tids[nthreads] = id;
ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "rfork()ed thread: %P", id);
}
return err;
}
windows 下面的
ngx_create_thread(ngx_tid_t *tid,
ngx_thread_value_t (__stdcall *func)(void *arg), void *arg, ngx_log_t *log)
{
u_long id;
ngx_err_t err;
*tid = CreateThread(NULL, stack_size, func, arg, 0, &id);
if (*tid != NULL) {
ngx_log_error(NGX_LOG_NOTICE, log, 0,
"create thread " NGX_TID_T_FMT, id);
return 0;
}
err = ngx_errno;
ngx_log_error(NGX_LOG_ALERT, log, err, "CreateThread() failed");
return err;
}
- Nginx源代码分析之初始化(三)
- Nginx源代码分析之初始化(二)
- Chrome源代码分析之初始化(七)
- Nginx源代码分析之connect(四)
- Nginx源代码分析之connect(五)
- Nginx源代码分析之upstream(八)
- Nginx源代码分析之accept(十)
- Nginx源代码分析之spdy(十五)
- Nginx源代码分析之accept(十六)
- Nginx源代码分析之背景简介(一)
- Nginx源代码分析之I/O模型(六)
- Nginx源代码分析之I/O模型细节(七)
- Nginx源代码分析之网络超时管理(九)
- Nginx源代码分析之I/O细节(十一)
- Nginx源代码分析之进程模型(十二)
- Nginx源代码分析之反向代理(十三)
- Nginx源代码分析之群惊问题(十七)
- Nginx源代码分析之锁的实现(十八)
- 图书目录
- 对TCP/IP协议的理解
- iOS 获取网络状态,区分2G3G4GWIFI等,非reachability
- java实现2张图按透明度和像素融合渐变过程
- Java 对字符串数据进行MD5/SHA1哈希散列运算
- Nginx源代码分析之初始化(三)
- 一个测试WIFI的activity
- 【delphi】 TComboBox 动态生成下拉,并展开后鼠标丢失问题
- (*p)++和*(p++)和*p++的区别
- weblogic性能调优
- Android Studio使用SVN报错:XXX不是工作副本(XXX is not working copy)
- mysql中的内连接,外连接,全连接,交叉连接实例详解
- Symmetric Tree
- 网络模块初始化-net( 网络名字空间 )