Browse Source

Replace fork() with vfork() in tap config, faster.

Adam Ierymenko 12 years ago
parent
commit
f823fd05ac
1 changed files with 7 additions and 7 deletions
  1. 7 7
      node/EthernetTap.cpp

+ 7 - 7
node/EthernetTap.cpp

@@ -218,7 +218,7 @@ EthernetTap::EthernetTap(
 		int kextpid;
 		int kextpid;
 		char tmp[4096];
 		char tmp[4096];
 		strcpy(tmp,_r->homePath.c_str());
 		strcpy(tmp,_r->homePath.c_str());
-		if ((kextpid = (int)fork()) == 0) {
+		if ((kextpid = (int)vfork()) == 0) {
 			chdir(tmp);
 			chdir(tmp);
 			execl(ZT_MAC_KEXTLOAD,ZT_MAC_KEXTLOAD,"-q","-repository",tmp,"tap.kext",(const char *)0);
 			execl(ZT_MAC_KEXTLOAD,ZT_MAC_KEXTLOAD,"-q","-repository",tmp,"tap.kext",(const char *)0);
 			exit(-1);
 			exit(-1);
@@ -255,7 +255,7 @@ EthernetTap::EthernetTap(
 
 
 	// Configure MAC address and MTU, bring interface up
 	// Configure MAC address and MTU, bring interface up
 	long cpid;
 	long cpid;
-	if ((cpid = (long)fork()) == 0) {
+	if ((cpid = (long)vfork()) == 0) {
 		execl(ZT_ETHERTAP_IFCONFIG,ZT_ETHERTAP_IFCONFIG,_dev,"lladdr",ethaddr,"mtu",mtustr,"up",(const char *)0);
 		execl(ZT_ETHERTAP_IFCONFIG,ZT_ETHERTAP_IFCONFIG,_dev,"lladdr",ethaddr,"mtu",mtustr,"up",(const char *)0);
 		exit(-1);
 		exit(-1);
 	} else {
 	} else {
@@ -285,7 +285,7 @@ EthernetTap::~EthernetTap()
 #ifdef __APPLE__
 #ifdef __APPLE__
 void EthernetTap::whack()
 void EthernetTap::whack()
 {
 {
-	long cpid = (long)fork();
+	long cpid = (long)vfork();
 	if (cpid == 0) {
 	if (cpid == 0) {
 		execl(ZT_MAC_IPCONFIG,ZT_MAC_IPCONFIG,"set",_dev,"AUTOMATIC-V6",(const char *)0);
 		execl(ZT_MAC_IPCONFIG,ZT_MAC_IPCONFIG,"set",_dev,"AUTOMATIC-V6",(const char *)0);
 		exit(-1);
 		exit(-1);
@@ -304,7 +304,7 @@ void EthernetTap::whack() {}
 #ifdef __LINUX__
 #ifdef __LINUX__
 static bool ___removeIp(const char *_dev,const InetAddress &ip)
 static bool ___removeIp(const char *_dev,const InetAddress &ip)
 {
 {
-	long cpid = (long)fork();
+	long cpid = (long)vfork();
 	if (cpid == 0) {
 	if (cpid == 0) {
 		execl(ZT_ETHERTAP_IP_COMMAND,ZT_ETHERTAP_IP_COMMAND,"addr","del",ip.toString().c_str(),"dev",_dev,(const char *)0);
 		execl(ZT_ETHERTAP_IP_COMMAND,ZT_ETHERTAP_IP_COMMAND,"addr","del",ip.toString().c_str(),"dev",_dev,(const char *)0);
 		exit(1); /* not reached unless exec fails */
 		exit(1); /* not reached unless exec fails */
@@ -337,7 +337,7 @@ bool EthernetTap::addIP(const InetAddress &ip)
 	}
 	}
 
 
 	long cpid;
 	long cpid;
-	if ((cpid = (long)fork()) == 0) {
+	if ((cpid = (long)vfork()) == 0) {
 		execl(ZT_ETHERTAP_IP_COMMAND,ZT_ETHERTAP_IP_COMMAND,"addr","add",ip.toString().c_str(),"dev",_dev,(const char *)0);
 		execl(ZT_ETHERTAP_IP_COMMAND,ZT_ETHERTAP_IP_COMMAND,"addr","add",ip.toString().c_str(),"dev",_dev,(const char *)0);
 		exit(-1);
 		exit(-1);
 	} else {
 	} else {
@@ -357,7 +357,7 @@ bool EthernetTap::addIP(const InetAddress &ip)
 static bool ___removeIp(const char *_dev,const InetAddress &ip)
 static bool ___removeIp(const char *_dev,const InetAddress &ip)
 {
 {
 	int cpid;
 	int cpid;
-	if ((cpid = (int)fork()) == 0) {
+	if ((cpid = (int)vfork()) == 0) {
 		execl(ZT_ETHERTAP_IFCONFIG,ZT_ETHERTAP_IFCONFIG,_dev,"inet",ip.toIpString().c_str(),"-alias",(const char *)0);
 		execl(ZT_ETHERTAP_IFCONFIG,ZT_ETHERTAP_IFCONFIG,_dev,"inet",ip.toIpString().c_str(),"-alias",(const char *)0);
 		exit(-1);
 		exit(-1);
 	} else {
 	} else {
@@ -390,7 +390,7 @@ bool EthernetTap::addIP(const InetAddress &ip)
 	}
 	}
 
 
 	int cpid;
 	int cpid;
-	if ((cpid = (int)fork()) == 0) {
+	if ((cpid = (int)vfork()) == 0) {
 		execl(ZT_ETHERTAP_IFCONFIG,ZT_ETHERTAP_IFCONFIG,_dev,ip.isV4() ? "inet" : "inet6",ip.toString().c_str(),"alias",(const char *)0);
 		execl(ZT_ETHERTAP_IFCONFIG,ZT_ETHERTAP_IFCONFIG,_dev,ip.isV4() ? "inet" : "inet6",ip.toString().c_str(),"alias",(const char *)0);
 		exit(-1);
 		exit(-1);
 	} else {
 	} else {