Explorar o código

Hangs when closing db drivers (https://trac.osgeo.org/grass/ticket/2775)

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@67290 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa %!s(int64=9) %!d(string=hai) anos
pai
achega
0401dfed93
Modificáronse 3 ficheiros con 12 adicións e 4 borrados
  1. 0 2
      lib/db/dbmi_client/shutdown.c
  2. 12 0
      lib/db/dbmi_client/start.c
  3. 0 2
      lib/db/dbmi_driver/driver.c

+ 0 - 2
lib/db/dbmi_client/shutdown.c

@@ -37,10 +37,8 @@ int db_shutdown_driver(dbDriver * driver)
 {
 {
     int status;
     int status;
 
 
-#ifdef __MINGW32__
     db__set_protocol_fds(driver->send, driver->recv);
     db__set_protocol_fds(driver->send, driver->recv);
     DB_START_PROCEDURE_CALL(DB_PROC_SHUTDOWN_DRIVER);
     DB_START_PROCEDURE_CALL(DB_PROC_SHUTDOWN_DRIVER);
-#endif
 
 
     /* close the communication FILEs */
     /* close the communication FILEs */
     fclose(driver->send);
     fclose(driver->send);

+ 12 - 0
lib/db/dbmi_client/start.c

@@ -28,6 +28,13 @@
 #define READ  0
 #define READ  0
 #define WRITE 1
 #define WRITE 1
 
 
+void close_on_exec(int fd)
+{
+#ifndef __MINGW32__
+    int flags = fcntl(fd, F_GETFD);
+    fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
+#endif
+}
 
 
 /*!
 /*!
   \brief Initialize a new dbDriver for db transaction.
   \brief Initialize a new dbDriver for db transaction.
@@ -132,6 +139,11 @@ dbDriver *db_start_driver(const char *name)
 	return (dbDriver *) NULL;
 	return (dbDriver *) NULL;
     }
     }
 
 
+    close_on_exec(p1[READ]);
+    close_on_exec(p1[WRITE]);
+    close_on_exec(p2[READ]);
+    close_on_exec(p2[WRITE]);
+
     pid = G_spawn_ex(startup,
     pid = G_spawn_ex(startup,
 		     SF_BACKGROUND,
 		     SF_BACKGROUND,
 		     SF_REDIRECT_DESCRIPTOR, 0, p1[READ],
 		     SF_REDIRECT_DESCRIPTOR, 0, p1[READ],

+ 0 - 2
lib/db/dbmi_driver/driver.c

@@ -139,12 +139,10 @@ int db_driver(int argc, char *argv[])
     stat = DB_OK;
     stat = DB_OK;
     /* get the procedure number */
     /* get the procedure number */
     while (db__recv_procnum(&procnum) == DB_OK) {
     while (db__recv_procnum(&procnum) == DB_OK) {
-#ifdef __MINGW32__
 	if (procnum == DB_PROC_SHUTDOWN_DRIVER) {
 	if (procnum == DB_PROC_SHUTDOWN_DRIVER) {
 	    db__send_procedure_ok(procnum);
 	    db__send_procedure_ok(procnum);
 	    break;
 	    break;
 	}
 	}
-#endif
 	db_clear_error();
 	db_clear_error();
 
 
 	/* find this procedure */
 	/* find this procedure */