freebsd的sun rpc烂透了

亲爱的,稍微改进下你的程序吧,这不费多大事儿。
我在一个多线程的corba程序的多个worker线程中调用了sun rpc的clnt_create函数。然后我的程序偶尔会core dump.查了下,backtrace如下:
#0 0x84c7f82a in fclose (fp=0x0) at /usr/src/lib/libc/stdio/fclose.c:56
#1 0x84c4b0a2 in endnetconfig (handlep=0x86e0420) at /usr/src/lib/libc/rpc/getnetconfig.c:394
#2 0x84c40cc5 in __rpc_endconf (vhandle=0x86e0410) at /usr/src/lib/libc/rpc/rpc_generic.c:441
#3 0x84c327eb in clnt_create_timed (hostname=0x80977d8 "127.0.0.1", prog=931729681, vers=1,
netclass=0x80977d4 "tcp", tp=0x0) at /usr/src/lib/libc/rpc/clnt_generic.c:271
#4 0x84c3264d in clnt_create (hostname=0x80977d8 "127.0.0.1", prog=931729681, vers=1,
nettype=0x80977d4 "tcp") at /usr/src/lib/libc/rpc/clnt_generic.c:186
... 后面的我略了。
然后我打开netnetconfig.c看了下
endnetconfig中调用了fclose函数关闭一个叫做nc_file的file handle。而这个file handle是一个全局静态变量。
static FILE *nc_file;
然而在使用这个变量的时候,完全没有加锁。

ni.ref++;
if ((nc_file != NULL) || (nc_file = fopen(NETCONFIG, "r")) != NULL) {
nc_vars->valid = NC_VALID;
nc_vars->flag = 0;
nc_vars->nc_configs = ni.head;
return ((void *)nc_vars);
}
ni.ref--;

其实问题很简单,

static pthread_mutex_t nc_file_lock = PTHREAD_MUTEX_INITIALIZER;

定义一个mutex,然后在恰当的时候获取、释放锁就行了。
亲爱的,稍微改进下你的程序吧,这不费多大事儿。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥