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