ACE中UUID的问题
时间:2010-07-15 来源:public0821
最近用到了ACE的UUID,使用方法是网上找的,如下:
tstring sUuid; ACE_Utils::UUID_GENERATOR::instance()->init(); ACE_Utils::UUID uuid; ACE_Utils::UUID_GENERATOR::instance()->generateUUID(uuid); sUuid.assign(uuid.to_string ()->c_str ()) return sUuid;
将这段代码封装成一个函数,在很多地方都用到了他,结果问题出来了,在linux环境中连接数据库的时候报系统资源不足,在windows环境跑着没有任何问题。
最开始的时候根本没怀疑到UUID上去,还以为是其他哪里的问题,当时看系统限制的进程打开文件句柄数是1024,通过跟踪程序,发现程序的socket句柄一直在涨,当时程序用到socket的地方只有发送UDP数据和连接数据库,于是使劲在那里面找,把人都快弄残废了。最后逐步排查,费了九牛二虎之力,才找到UUID上。
最后一看ACE的源代码,发现在ACE_Utils::UUID_GENERATOR::instance()->init();函数中打开了一个socket没有关闭,代码如下
#elif defined (linux) struct ifreq ifr; ACE_HANDLE handle = ACE_OS::socket (PF_INET, SOCK_DGRAM, 0); if (handle == ACE_INVALID_HANDLE) { return -1; } ACE_OS::strcpy (ifr.ifr_name, "eth0"); if (ACE_OS::ioctl (handle/*s*/, SIOCGIFHWADDR, &ifr) < 0) { ACE_OS::close (handle); return -1; } struct sockaddr* sa = (struct sockaddr *) &ifr.ifr_addr; ACE_OS::memcpy (node->node, sa->sa_data, 6); return 0; #else
里面的handle句柄在后面没有正常关闭。
由于我们用的是ACE5.4版本,于是我想看看最新的5.5.3版本是怎么样的,结果5.5.3版本的代码如下:
#elif defined (linux) struct ifreq ifr; ACE_HANDLE handle = ACE_OS::socket (PF_INET, SOCK_DGRAM, 0); if (handle == ACE_INVALID_HANDLE) return -1; ACE_OS::strcpy (ifr.ifr_name, "eth0"); if (ACE_OS::ioctl (handle/*s*/, SIOCGIFHWADDR, &ifr) < 0) { ACE_OS::close (handle); return -1; } struct sockaddr* sa = (struct sockaddr *) &ifr.ifr_addr; ACE_OS::close (handle); ACE_OS::memcpy (node->node, sa->sa_data, 6); return 0; #else
handle已经关闭了,估计是新版本修复了这个bug
由于不方便将ACE版本升级到最新版本,最后只能在自己的代码中控制只调用一次ACE_Utils::UUID_GENERATOR::instance()->init()函数,不知道这样后,生成的UUID还是不是真正的UUID,需要仔细研究下