[GRASS-SVN] r65764 - grass/branches/releasebranch_7_0/raster/r.mapcalc

svn_grass at osgeo.org svn_grass at osgeo.org
Tue Jul 21 11:40:13 PDT 2015


Author: martinl
Date: 2015-07-21 11:40:13 -0700 (Tue, 21 Jul 2015)
New Revision: 65764

Modified:
   grass/branches/releasebranch_7_0/raster/r.mapcalc/map.c
Log:
Prevent concurrent raster reads when a mask is present
        (merge r65591 from trunk)


Modified: grass/branches/releasebranch_7_0/raster/r.mapcalc/map.c
===================================================================
--- grass/branches/releasebranch_7_0/raster/r.mapcalc/map.c	2015-07-21 18:09:35 UTC (rev 65763)
+++ grass/branches/releasebranch_7_0/raster/r.mapcalc/map.c	2015-07-21 18:40:13 UTC (rev 65764)
@@ -71,6 +71,7 @@
 static struct map *maps;
 static int num_maps;
 static int max_maps;
+static int masking;
 
 static int min_row = INT_MAX;
 static int max_row = -INT_MAX;
@@ -81,10 +82,24 @@
 
 #ifdef HAVE_PTHREAD_H
 static pthread_mutex_t cats_mutex;
+static pthread_mutex_t mask_mutex;
 #endif
 
 /****************************************************************************/
 
+static void read_row(int fd, void *buf, int row, int res_type)
+{
+#ifdef HAVE_PTHREAD_H
+    if (masking)
+	pthread_mutex_lock(&mask_mutex);
+#endif
+    Rast_get_row(fd, buf, row, res_type);
+#ifdef HAVE_PTHREAD_H
+    if (masking)
+	pthread_mutex_unlock(&mask_mutex);
+#endif
+}
+
 static void cache_sub_init(struct row_cache *cache, int data_type)
 {
     struct sub_cache *sub = G_malloc(sizeof(struct sub_cache));
@@ -145,7 +160,7 @@
 
     if (i >= 0 && i < cache->nrows) {
 	if (!sub->valid[i]) {
-	    Rast_get_row(cache->fd, sub->buf[i], row + i, data_type);
+	    read_row(cache->fd, sub->buf[i], row + i, data_type);
 	    sub->valid[i] = 1;
 	}
 	return sub->buf[i];
@@ -154,7 +169,7 @@
     if (i <= -cache->nrows || i >= cache->nrows * 2 - 1) {
 	memset(sub->valid, 0, cache->nrows);
 	sub->row = i;
-	Rast_get_row(cache->fd, sub->buf[0], row, data_type);
+	read_row(cache->fd, sub->buf[0], row, data_type);
 	sub->valid[0] = 1;
 	return sub->buf[0];
     }
@@ -182,7 +197,7 @@
     G_freea(tmp);
     G_freea(vtmp);
 
-    Rast_get_row(cache->fd, sub->buf[i], row, data_type);
+    read_row(cache->fd, sub->buf[i], row, data_type);
     sub->valid[i] = 1;
 
     return sub->buf[i];
@@ -365,11 +380,6 @@
 #endif
 }
 
-static void read_row(int fd, void *buf, int row, int res_type)
-{
-    Rast_get_row(fd, buf, row, res_type);
-}
-
 static void setup_map(struct map *m)
 {
     int nrows = m->max_row - m->min_row + 1;
@@ -576,6 +586,8 @@
 
 #ifdef HAVE_PTHREAD_H
     pthread_mutex_init(&cats_mutex, NULL);
+    pthread_mutex_init(&mask_mutex, NULL);
+    masking = Rast_maskfd() >= 0;
 #endif
 
     for (i = 0; i < num_maps; i++)
@@ -635,6 +647,7 @@
 
 #ifdef HAVE_PTHREAD_H
     pthread_mutex_destroy(&cats_mutex);
+    pthread_mutex_destroy(&mask_mutex);
 #endif
 }
 



More information about the grass-commit mailing list