Bladeren bron

src: implement _starpu_mkdtemp (either by using mkdtemp or when not available by using our own algorithm) and test it

Nathalie Furmento 8 jaren geleden
bovenliggende
commit
42f76c4ffb
5 gewijzigde bestanden met toevoegingen van 103 en 1 verwijderingen
  1. 1 0
      configure.ac
  2. 44 0
      src/common/utils.c
  3. 2 0
      src/common/utils.h
  4. 2 1
      tests/Makefile.am
  5. 54 0
      tests/main/mkdtemp.c

+ 1 - 0
configure.ac

@@ -737,6 +737,7 @@ AC_CHECK_HEADERS([aio.h])
 AC_CHECK_LIB([rt], [aio_read])
 
 AC_CHECK_FUNCS([mkostemp])
+AC_CHECK_FUNCS([mkdtemp])
 
 AC_CHECK_FUNCS([pread pwrite])
 

+ 44 - 0
src/common/utils.c

@@ -143,6 +143,50 @@ void _starpu_mkpath_and_check(const char *path, mode_t mode)
 	}
 }
 
+char *_starpu_mkdtemp_internal(char *tmpl)
+{
+	int len = (int)strlen(tmpl);
+	int i;
+	int ret;
+	struct stat sb;
+
+	// Initialize template
+	for(i=len-6 ; i<len ; i++)
+	{
+		STARPU_ASSERT_MSG(tmpl[i] == 'X', "Template must terminate by XXXXXX\n");
+		tmpl[i] = 'a';
+	}
+
+	// Find directory which does not exist by looping over all 6 last characters
+	i=len-6;
+	ret = stat(tmpl, &sb);
+	while (ret == 0 && S_ISDIR(sb.st_mode))
+	{
+		if (tmpl[i] == 'z')
+			i++;
+		if (i == len)
+		{
+			_STARPU_MSG("Error making StarPU temporary directory\n");
+			STARPU_ABORT();
+		}
+		tmpl[i] ++;
+		ret = stat(tmpl, &sb);
+	}
+
+	// Create directory
+	ret = _starpu_mkpath(tmpl, 0777);
+	return ret == 0 ? tmpl : NULL;
+}
+
+char *_starpu_mkdtemp(char *tmpl)
+{
+#if defined(HAVE_MKDTEMP)
+	return mkdtemp(tmpl);
+#else
+	return _starpu_mkdtemp_internal(tmp);
+#endif
+}
+
 char *_starpu_mktemp(const char *directory, int flags, int *fd)
 {
 	/* create template for mkstemp */

+ 2 - 0
src/common/utils.h

@@ -126,6 +126,8 @@
 #define _STARPU_IS_ZERO(a) (fpclassify(a) == FP_ZERO)
 #endif
 
+char *_starpu_mkdtemp_internal(char *tmpl);
+char *_starpu_mkdtemp(char *tmpl);
 int _starpu_mkpath(const char *s, mode_t mode);
 void _starpu_mkpath_and_check(const char *s, mode_t mode);
 char *_starpu_mktemp(const char *directory, int flags, int *fd);

+ 2 - 1
tests/Makefile.am

@@ -133,7 +133,8 @@ XFAIL_TESTS	=				\
 
 myPROGRAMS =
 
-myPROGRAMS +=				\
+myPROGRAMS +=					\
+	main/mkdtemp				\
 	main/restart				\
 	main/execute_schedule			\
 	main/insert_task_pack			\

+ 54 - 0
tests/main/mkdtemp.c

@@ -0,0 +1,54 @@
+/* StarPU --- Runtime system for heterogeneous multicore architectures.
+ *
+ * Copyright (C) 2017 CNRS
+ *
+ * StarPU is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at
+ * your option) any later version.
+ *
+ * StarPU is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License in COPYING.LGPL for more details.
+ */
+
+#include <starpu.h>
+#include <common/config.h>
+#include <common/utils.h>
+#include "../helper.h"
+
+int do_test(char *(*func)(char *tmpl))
+{
+	int ret;
+	char dirname[128] = "/tmp/abcdef_XXXXXX";
+	char *ptr;
+	struct stat sb;
+
+	ptr = func(dirname);
+	FPRINTF(stderr, "Directory '%s' (res '%s')\n", dirname, ptr);
+
+	// use stat
+	ret = stat(dirname, &sb);
+	if (ret != 0 || !S_ISDIR(sb.st_mode))
+	{
+		FPRINTF(stderr, "Directory '%s' has not been created\n", dirname);
+		return 1;
+	}
+
+	ret = rmdir(dirname);
+	STARPU_CHECK_RETURN_VALUE(ret, "rmdir '%s'\n", dirname);
+
+	return ret;
+}
+
+int main(void)
+{
+	int ret, ret2;
+
+	ret = do_test(_starpu_mkdtemp);
+	ret2 = do_test(_starpu_mkdtemp_internal);
+
+	return ret + ret2;
+}