Ver código fonte

Implement perfmodel locking on windows

Samuel Thibault 10 anos atrás
pai
commit
1ec6838c01
1 arquivos alterados com 23 adições e 0 exclusões
  1. 23 0
      src/common/utils.c

+ 23 - 0
src/common/utils.c

@@ -110,6 +110,13 @@ int _starpu_ftruncate(FILE *file)
 
 int _starpu_frdlock(FILE *file)
 {
+#ifdef __MINGW32__
+	int ret;
+	do {
+		ret = _locking(fileno(file), _LK_RLCK, 10);
+	} while (ret == EDEADLOCK);
+	return ret;
+#else
 	struct flock lock = {
 		.l_type = F_RDLCK,
 		.l_whence = SEEK_SET,
@@ -117,10 +124,17 @@ int _starpu_frdlock(FILE *file)
 		.l_len = 0
 	};
 	return fcntl(fileno(file), F_SETLKW, &lock);
+#endif
 }
 
 int _starpu_frdunlock(FILE *file)
 {
+#ifdef __MINGW32__
+#  ifndef _LK_UNLCK
+#    define _LK_UNLCK _LK_UNLOCK
+#  endif
+	return _locking(fileno(file), _LK_UNLCK, 10);
+#else
 	struct flock lock = {
 		.l_type = F_UNLCK,
 		.l_whence = SEEK_SET,
@@ -128,10 +142,18 @@ int _starpu_frdunlock(FILE *file)
 		.l_len = 0
 	};
 	return fcntl(fileno(file), F_SETLKW, &lock);
+#endif
 }
 
 int _starpu_fwrlock(FILE *file)
 {
+#ifdef __MINGW32__
+	int ret;
+	do {
+		ret = _locking(fileno(file), _LK_LOCK, 10);
+	} while (ret == EDEADLOCK);
+	return ret;
+#else
 	struct flock lock = {
 		.l_type = F_WRLCK,
 		.l_whence = SEEK_SET,
@@ -139,6 +161,7 @@ int _starpu_fwrlock(FILE *file)
 		.l_len = 0
 	};
 	return fcntl(fileno(file), F_SETLKW, &lock);
+#endif
 }
 
 int _starpu_fwrunlock(FILE *file)