File: | src/mite/thread.c |
Location: | line 58, column 5 |
Description: | Potential leak of memory pointed to by 'mtt' |
1 | /* | |||
2 | Teem: Tools to process and visualize scientific data and images . | |||
3 | Copyright (C) 2013, 2012, 2011, 2010, 2009 University of Chicago | |||
4 | Copyright (C) 2008, 2007, 2006, 2005 Gordon Kindlmann | |||
5 | Copyright (C) 2004, 2003, 2002, 2001, 2000, 1999, 1998 University of Utah | |||
6 | ||||
7 | This library is free software; you can redistribute it and/or | |||
8 | modify it under the terms of the GNU Lesser General Public License | |||
9 | (LGPL) as published by the Free Software Foundation; either | |||
10 | version 2.1 of the License, or (at your option) any later version. | |||
11 | The terms of redistributing and/or modifying this software also | |||
12 | include exceptions to the LGPL that facilitate static linking. | |||
13 | ||||
14 | This library is distributed in the hope that it will be useful, | |||
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
17 | Lesser General Public License for more details. | |||
18 | ||||
19 | You should have received a copy of the GNU Lesser General Public License | |||
20 | along with this library; if not, write to Free Software Foundation, Inc., | |||
21 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
22 | */ | |||
23 | ||||
24 | #include "mite.h" | |||
25 | #include "privateMite.h" | |||
26 | ||||
27 | miteThread * | |||
28 | miteThreadNew() { | |||
29 | static const char me[]="miteThreadNew"; | |||
30 | miteThread *mtt; | |||
31 | int ii; | |||
32 | ||||
33 | mtt = (miteThread *)calloc(1, sizeof(miteThread)); | |||
| ||||
34 | if (!mtt) { | |||
35 | biffAddf(MITEmiteBiffKey, "%s: couldn't calloc miteThread", me); | |||
36 | return NULL((void*)0); | |||
37 | } | |||
38 | ||||
39 | mtt->rmop = airMopNew(); | |||
40 | if (!mtt->rmop) { | |||
41 | biffAddf(MITEmiteBiffKey, "%s: couldn't calloc thread's mop", me); | |||
42 | airFree(mtt); return NULL((void*)0); | |||
43 | } | |||
44 | mtt->gctx = NULL((void*)0); | |||
45 | mtt->ansScl = mtt->ansVec = mtt->ansTen = NULL((void*)0); | |||
46 | mtt->_normal = NULL((void*)0); | |||
47 | mtt->shadeVec0 = NULL((void*)0); | |||
48 | mtt->shadeVec1 = NULL((void*)0); | |||
49 | mtt->shadeScl0 = NULL((void*)0); | |||
50 | mtt->shadeScl1 = NULL((void*)0); | |||
51 | /* were miteVal a full-fledged gageKind, the following would | |||
52 | be done by gagePerVolumeNew */ | |||
53 | mtt->ansMiteVal = AIR_CALLOC(gageKindTotalAnswerLength(miteValGageKind),(double*)(calloc((gageKindTotalAnswerLength(miteValGageKind)) , sizeof(double))) | |||
54 | double)(double*)(calloc((gageKindTotalAnswerLength(miteValGageKind)) , sizeof(double))); | |||
55 | mtt->directAnsMiteVal = AIR_CALLOC(miteValGageKind->itemMax+1,(double **)(calloc((miteValGageKind->itemMax+1), sizeof(double *))) | |||
56 | double *)(double **)(calloc((miteValGageKind->itemMax+1), sizeof(double *))); | |||
57 | if (!(mtt->ansMiteVal && mtt->directAnsMiteVal)) { | |||
58 | biffAddf(MITEmiteBiffKey, "%s: couldn't calloc miteVal answer arrays", me); | |||
| ||||
59 | return NULL((void*)0); | |||
60 | } | |||
61 | for (ii=0; ii<=miteValGageKind->itemMax; ii++) { | |||
62 | mtt->directAnsMiteVal[ii] = mtt->ansMiteVal | |||
63 | + gageKindAnswerOffset(miteValGageKind, ii); | |||
64 | } | |||
65 | mtt->verbose = 0; | |||
66 | mtt->skip = 0; | |||
67 | mtt->thrid = -1; | |||
68 | mtt->ui = mtt->vi = -1; | |||
69 | mtt->raySample = 0; | |||
70 | mtt->samples = 0; | |||
71 | mtt->stage = NULL((void*)0); | |||
72 | /* mtt->range[], rayStep, V, RR, GG, BB, TT initialized in | |||
73 | miteRayBegin or in miteSample */ | |||
74 | ||||
75 | return mtt; | |||
76 | } | |||
77 | ||||
78 | miteThread * | |||
79 | miteThreadNix(miteThread *mtt) { | |||
80 | ||||
81 | mtt->ansMiteVal = (double *)airFree(mtt->ansMiteVal); | |||
82 | mtt->directAnsMiteVal = (double **)airFree(mtt->directAnsMiteVal); | |||
83 | airMopOkay(mtt->rmop); | |||
84 | ||||
85 | airFree(mtt); | |||
86 | return NULL((void*)0); | |||
87 | } | |||
88 | ||||
89 | /* | |||
90 | ******** miteThreadBegin() | |||
91 | ** | |||
92 | ** this has some of the body of what would be miteThreadInit | |||
93 | */ | |||
94 | int | |||
95 | miteThreadBegin(miteThread **mttP, miteRender *mrr, | |||
96 | miteUser *muu, int whichThread) { | |||
97 | static const char me[]="miteThreadBegin"; | |||
98 | ||||
99 | /* all the miteThreads have already been allocated */ | |||
100 | (*mttP) = mrr->tt[whichThread]; | |||
101 | ||||
102 | if (!whichThread) { | |||
103 | /* this is the first thread- it just points to the parent gageContext */ | |||
104 | (*mttP)->gctx = muu->gctx0; | |||
105 | } else { | |||
106 | /* we have to generate a new gageContext */ | |||
107 | (*mttP)->gctx = gageContextCopy(muu->gctx0); | |||
108 | if (!(*mttP)->gctx) { | |||
109 | biffMovef(MITEmiteBiffKey, GAGEgageBiffKey, | |||
110 | "%s: couldn't set up thread %d", me, whichThread); | |||
111 | return 1; | |||
112 | } | |||
113 | } | |||
114 | ||||
115 | if (-1 != mrr->sclPvlIdx) { | |||
116 | (*mttP)->ansScl = (*mttP)->gctx->pvl[mrr->sclPvlIdx]->answer; | |||
117 | (*mttP)->nPerp = ((*mttP)->ansScl | |||
118 | + gageKindAnswerOffset(gageKindScl, gageSclNPerp)); | |||
119 | (*mttP)->geomTens = ((*mttP)->ansScl | |||
120 | + gageKindAnswerOffset(gageKindScl, gageSclGeomTens)); | |||
121 | } else { | |||
122 | (*mttP)->ansScl = NULL((void*)0); | |||
123 | (*mttP)->nPerp = NULL((void*)0); | |||
124 | (*mttP)->geomTens = NULL((void*)0); | |||
125 | } | |||
126 | (*mttP)->ansVec = (-1 != mrr->vecPvlIdx | |||
127 | ? (*mttP)->gctx->pvl[mrr->vecPvlIdx]->answer | |||
128 | : NULL((void*)0)); | |||
129 | (*mttP)->ansTen = (-1 != mrr->tenPvlIdx | |||
130 | ? (*mttP)->gctx->pvl[mrr->tenPvlIdx]->answer | |||
131 | : NULL((void*)0)); | |||
132 | (*mttP)->thrid = whichThread; | |||
133 | (*mttP)->raySample = 0; | |||
134 | (*mttP)->samples = 0; | |||
135 | (*mttP)->verbose = 0; | |||
136 | (*mttP)->skip = 0; | |||
137 | (*mttP)->_normal = _miteAnswerPointer(*mttP, mrr->normalSpec); | |||
138 | ||||
139 | /* set up shading answers */ | |||
140 | switch(mrr->shadeSpec->method) { | |||
141 | case miteShadeMethodNone: | |||
142 | /* nothing to do */ | |||
143 | break; | |||
144 | case miteShadeMethodPhong: | |||
145 | (*mttP)->shadeVec0 = _miteAnswerPointer(*mttP, mrr->shadeSpec->vec0); | |||
146 | break; | |||
147 | case miteShadeMethodLitTen: | |||
148 | (*mttP)->shadeVec0 = _miteAnswerPointer(*mttP, mrr->shadeSpec->vec0); | |||
149 | (*mttP)->shadeVec1 = _miteAnswerPointer(*mttP, mrr->shadeSpec->vec1); | |||
150 | (*mttP)->shadeScl0 = _miteAnswerPointer(*mttP, mrr->shadeSpec->scl0); | |||
151 | (*mttP)->shadeScl1 = _miteAnswerPointer(*mttP, mrr->shadeSpec->scl1); | |||
152 | break; | |||
153 | default: | |||
154 | biffAddf(MITEmiteBiffKey, "%s: shade method %d not implemented!", | |||
155 | me, mrr->shadeSpec->method); | |||
156 | return 1; | |||
157 | break; | |||
158 | } | |||
159 | ||||
160 | if (_miteStageSet(*mttP, mrr)) { | |||
161 | biffAddf(MITEmiteBiffKey, "%s: trouble setting up stage array", me); | |||
162 | return 1; | |||
163 | } | |||
164 | return 0; | |||
165 | } | |||
166 | ||||
167 | int | |||
168 | miteThreadEnd(miteThread *mtt, miteRender *mrr, | |||
169 | miteUser *muu) { | |||
170 | ||||
171 | AIR_UNUSED(mtt)(void)(mtt); | |||
172 | AIR_UNUSED(mrr)(void)(mrr); | |||
173 | AIR_UNUSED(muu)(void)(muu); | |||
174 | return 0; | |||
175 | } | |||
176 |