Revision: 33838
          http://brlcad.svn.sourceforge.net/brlcad/?rev=33838&view=rev
Author:   bob1961
Date:     2009-02-19 22:40:20 +0000 (Thu, 19 Feb 2009)

Log Message:
-----------
Some of the writes to ged_result_str need to be semaphore protected.

Modified Paths:
--------------
    brlcad/trunk/src/libged/gqa.c

Modified: brlcad/trunk/src/libged/gqa.c
===================================================================
--- brlcad/trunk/src/libged/gqa.c       2009-02-19 21:39:06 UTC (rev 33837)
+++ brlcad/trunk/src/libged/gqa.c       2009-02-19 22:40:20 UTC (rev 33838)
@@ -987,8 +987,11 @@
 #endif
            bu_semaphore_release(BU_SEM_SYSCALL);
        }
-    } else
+    } else {
+       bu_semaphore_acquire(GED_SEM_WORKER);
        bu_vls_printf(&ged_current_gedp->ged_result_str, "overlap %s %s\n", 
reg1->reg_name, reg2->reg_name);
+       bu_semaphore_release(GED_SEM_WORKER);
+    }
 
     /* XXX We should somehow flag the volume/weight calculations as invalid */
 
@@ -1071,10 +1074,12 @@
        VJOIN1(pt, ap->a_ray.r_pt, pp->pt_inhit->hit_dist, ap->a_ray.r_dir);
        VJOIN1(opt, ap->a_ray.r_pt, pp->pt_outhit->hit_dist, ap->a_ray.r_dir);
 
+       bu_semaphore_acquire(GED_SEM_WORKER);
        DLOG(&ged_current_gedp->ged_result_str, "%s %g->%g\n",
             pp->pt_regionp->reg_name,
             pp->pt_inhit->hit_dist,
             pp->pt_outhit->hit_dist);
+       bu_semaphore_release(GED_SEM_WORKER);
 
        /* checking for air sticking out of the model .
         * This is done here because there may be any number of air
@@ -1128,13 +1133,18 @@
 
        /* computing the weight of the objects */
        if (analysis_flags & ANALYSIS_WEIGHT) {
+           bu_semaphore_acquire(GED_SEM_WORKER);
            DLOG(&ged_current_gedp->ged_result_str, "Hit %s doing weight\n", 
pp->pt_regionp->reg_name);
+           bu_semaphore_release(GED_SEM_WORKER);
+
            /* make sure mater index is within range of densities */
            if (pp->pt_regionp->reg_gmater >= num_densities) {
+               bu_semaphore_acquire(GED_SEM_WORKER);
                bu_vls_printf(&ged_current_gedp->ged_result_str, "density index 
%d on region %s is outside of range of table [1..%d]\nSet GIFTmater on region 
or add entry to density table\n",
                              pp->pt_regionp->reg_gmater,
                              pp->pt_regionp->reg_name,
                              num_densities); /* XXX this should do something 
else */
+               bu_semaphore_release(GED_SEM_WORKER);
                return BRLCAD_ERROR;
            } else {
 
@@ -1185,7 +1195,9 @@
                    los = pp->pt_regionp->reg_los;
 
                    if (los < 1) {
+                       bu_semaphore_acquire(GED_SEM_WORKER);
                        bu_vls_printf(&ged_current_gedp->ged_result_str, "bad 
LOS (%d) on %s\n", los, pp->pt_regionp->reg_name);
+                       bu_semaphore_release(GED_SEM_WORKER);
                    }
 
                    /* accumulate the total weight values */
@@ -1246,8 +1258,11 @@
                    bu_semaphore_release(GED_SEM_STATS);
 
                } else {
+                   bu_semaphore_acquire(GED_SEM_WORKER);
                    bu_vls_printf(&ged_current_gedp->ged_result_str, "density 
index %d from region %s is not set.\nAdd entry to density table\n",
                                  pp->pt_regionp->reg_gmater, 
pp->pt_regionp->reg_name);
+                   bu_semaphore_release(GED_SEM_WORKER);
+
                    aborted = 1;
                    return BRLCAD_ERROR;
                }
@@ -1270,11 +1285,13 @@
                bu_semaphore_release(GED_SEM_STATS);
            }
 
+           bu_semaphore_acquire(GED_SEM_WORKER);
            DLOG(&ged_current_gedp->ged_result_str, "\t\tvol hit %s oDist:%g 
objVol:%g %s\n",
                 pp->pt_regionp->reg_name,
                 dist,
                 prd->optr->o_len[state->curr_view],
                 prd->optr->o_name);
+           bu_semaphore_release(GED_SEM_WORKER);
 
            if (plot_volume) {
                point_t opt;
@@ -1350,7 +1367,9 @@
 miss(register struct application *ap)
 {
 #if 0
+    bu_semaphore_acquire(GED_SEM_WORKER);
     bu_vls_printf(&ged_current_gedp->ged_result_str, "missed\n");
+    bu_semaphore_release(GED_SEM_WORKER);
 #endif
     return(0);
 }
@@ -1417,7 +1436,9 @@
     while ((v = get_next_row(state))) {
 
        v_coord = v * gridSpacing;
+       bu_semaphore_acquire(GED_SEM_WORKER);
        DLOG(&ged_current_gedp->ged_result_str, "  v = %d v_coord=%g\n", v, 
v_coord);
+       bu_semaphore_release(GED_SEM_WORKER);
 
        if ((v&1) || state->first) {
            /* shoot all the rays in this row.
@@ -1429,7 +1450,9 @@
                ap.a_ray.r_pt[state->v_axis] = 
ap.a_rt_i->mdl_min[state->v_axis] + v*gridSpacing;
                ap.a_ray.r_pt[state->i_axis] = 
ap.a_rt_i->mdl_min[state->i_axis];
 
+               bu_semaphore_acquire(GED_SEM_WORKER);
                DLOG(&ged_current_gedp->ged_result_str, "%5g %5g %5g -> %g %g 
%g\n", V3ARGS(ap.a_ray.r_pt), V3ARGS(ap.a_ray.r_dir));
+               bu_semaphore_release(GED_SEM_WORKER);
                ap.a_user = v;
                (void)rt_shootray(&ap);
 
@@ -1449,7 +1472,9 @@
                ap.a_ray.r_pt[state->v_axis] = 
ap.a_rt_i->mdl_min[state->v_axis] + v*gridSpacing;
                ap.a_ray.r_pt[state->i_axis] = 
ap.a_rt_i->mdl_min[state->i_axis];
 
+               bu_semaphore_acquire(GED_SEM_WORKER);
                DLOG(&ged_current_gedp->ged_result_str, "%5g %5g %5g -> %g %g 
%g\n", V3ARGS(ap.a_ray.r_pt), V3ARGS(ap.a_ray.r_dir));
+               bu_semaphore_release(GED_SEM_WORKER);
                ap.a_user = v;
                (void)rt_shootray(&ap);
 
@@ -1461,14 +1486,19 @@
                bu_semaphore_release(GED_SEM_STATS);
 
                if (debug)
-                   if (u+1 <  state->steps[state->u_axis])
+                   if (u+1 <  state->steps[state->u_axis]) {
+                       bu_semaphore_acquire(GED_SEM_WORKER);
                        bu_vls_printf(&ged_current_gedp->ged_result_str, "  
---\n");
+                       bu_semaphore_release(GED_SEM_WORKER);
+                   }
            }
        }
     }
 
     if (u == -1) {
+       bu_semaphore_acquire(GED_SEM_WORKER);
        DLOG(&ged_current_gedp->ged_result_str, "didn't shoot any rays\n");
+       bu_semaphore_release(GED_SEM_WORKER);
     }
 
     /* There's nothing else left to work on in this view.
@@ -1503,7 +1533,9 @@
            return i;
        }
     }
+
     bu_vls_printf(&ged_current_gedp->ged_result_str, "%s Didn't find object 
named \"%s\" in %d entries\n", BU_FLSTR, name, num_objects);
+
     return BRLCAD_ERROR;
 }
 
@@ -1576,6 +1608,7 @@
 
     if (BU_LIST_IS_EMPTY(&list->l)) {
        bu_vls_printf(&ged_current_gedp->ged_result_str, "No %s\n", (char 
*)list->r.name);
+
        return;
     }
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to