[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