Fix more mjData stack leakages.
PiperOrigin-RevId: 562545230 Change-Id: I2facf25b00878669dc12d5865767a44229d2ca48
This commit is contained in:
committed by
Copybara-Service
parent
5a21e202ed
commit
0e36f00857
@@ -387,7 +387,6 @@ void mj_collision(const mjModel* m, mjData* d) {
|
|||||||
int g1, g2, merged, b1 = 0, b2 = 0, exadr = 0, pairadr = 0, startadr;
|
int g1, g2, merged, b1 = 0, b2 = 0, exadr = 0, pairadr = 0, startadr;
|
||||||
int nexclude = m->nexclude, npair = m->npair, nbodypair = ((m->nbody-1)*m->nbody)/2;
|
int nexclude = m->nexclude, npair = m->npair, nbodypair = ((m->nbody-1)*m->nbody)/2;
|
||||||
int *broadphasepair = 0;
|
int *broadphasepair = 0;
|
||||||
mjMARKSTACK;
|
|
||||||
|
|
||||||
// reset the size of the contact array and invalidate efc arrays
|
// reset the size of the contact array and invalidate efc arrays
|
||||||
d->ncon = 0;
|
d->ncon = 0;
|
||||||
@@ -409,6 +408,8 @@ void mj_collision(const mjModel* m, mjData* d) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mjMARKSTACK;
|
||||||
|
|
||||||
// predefined only; ignore exclude
|
// predefined only; ignore exclude
|
||||||
if (m->opt.collision == mjCOL_PAIR) {
|
if (m->opt.collision == mjCOL_PAIR) {
|
||||||
d->nbodypair_broad = npair;
|
d->nbodypair_broad = npair;
|
||||||
@@ -677,7 +678,6 @@ int mj_broadphase(const mjModel* m, mjData* d, int* pair, int maxpair) {
|
|||||||
mjtNum cov[9], cen[3], dif[3], eigval[3], frame[9], quat[4];
|
mjtNum cov[9], cen[3], dif[3], eigval[3], frame[9], quat[4];
|
||||||
mjtBroadphase *sortbuf, *activebuf;
|
mjtBroadphase *sortbuf, *activebuf;
|
||||||
mjtNum *aabb;
|
mjtNum *aabb;
|
||||||
mjMARKSTACK;
|
|
||||||
|
|
||||||
int dsbl_filterparent = mjDISABLED(mjDSBL_FILTERPARENT);
|
int dsbl_filterparent = mjDISABLED(mjDSBL_FILTERPARENT);
|
||||||
// world with geoms, and body with plane or hfield, can collide all bodies
|
// world with geoms, and body with plane or hfield, can collide all bodies
|
||||||
@@ -750,6 +750,7 @@ int mj_broadphase(const mjModel* m, mjData* d, int* pair, int maxpair) {
|
|||||||
mju_eig3(eigval, frame, quat, cov);
|
mju_eig3(eigval, frame, quat, cov);
|
||||||
|
|
||||||
// allocate AABB; clear world entry (not used)
|
// allocate AABB; clear world entry (not used)
|
||||||
|
mjMARKSTACK;
|
||||||
aabb = mj_stackAllocNum(d, 6*nbody);
|
aabb = mj_stackAllocNum(d, 6*nbody);
|
||||||
mju_zero(aabb, 6);
|
mju_zero(aabb, 6);
|
||||||
|
|
||||||
|
|||||||
@@ -495,13 +495,14 @@ void mj_instantiateEquality(const mjModel* m, mjData* d) {
|
|||||||
mjtNum cpos[6], pos[2][3], ref[2], dif, deriv;
|
mjtNum cpos[6], pos[2][3], ref[2], dif, deriv;
|
||||||
mjtNum quat[4], quat1[4], quat2[4], quat3[4], axis[3];
|
mjtNum quat[4], quat1[4], quat2[4], quat3[4], axis[3];
|
||||||
mjtNum *jac[2], *jacdif, *data, *sparse_buf = NULL;
|
mjtNum *jac[2], *jacdif, *data, *sparse_buf = NULL;
|
||||||
mjMARKSTACK;
|
|
||||||
|
|
||||||
// disabled or no equality constraints: return
|
// disabled or no equality constraints: return
|
||||||
if (mjDISABLED(mjDSBL_EQUALITY) || m->nemax == 0) {
|
if (mjDISABLED(mjDSBL_EQUALITY) || m->nemax == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mjMARKSTACK;
|
||||||
|
|
||||||
// allocate space
|
// allocate space
|
||||||
jac[0] = mj_stackAllocNum(d, 6*nv);
|
jac[0] = mj_stackAllocNum(d, 6*nv);
|
||||||
jac[1] = mj_stackAllocNum(d, 6*nv);
|
jac[1] = mj_stackAllocNum(d, 6*nv);
|
||||||
@@ -703,13 +704,14 @@ void mj_instantiateEquality(const mjModel* m, mjData* d) {
|
|||||||
void mj_instantiateFriction(const mjModel* m, mjData* d) {
|
void mj_instantiateFriction(const mjModel* m, mjData* d) {
|
||||||
int nv = m->nv, issparse = mj_isSparse(m);
|
int nv = m->nv, issparse = mj_isSparse(m);
|
||||||
mjtNum* jac;
|
mjtNum* jac;
|
||||||
mjMARKSTACK;
|
|
||||||
|
|
||||||
// disabled: return
|
// disabled: return
|
||||||
if (mjDISABLED(mjDSBL_FRICTIONLOSS)) {
|
if (mjDISABLED(mjDSBL_FRICTIONLOSS)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mjMARKSTACK;
|
||||||
|
|
||||||
// allocate Jacobian
|
// allocate Jacobian
|
||||||
jac = mj_stackAllocNum(d, nv);
|
jac = mj_stackAllocNum(d, nv);
|
||||||
|
|
||||||
@@ -764,13 +766,14 @@ void mj_instantiateLimit(const mjModel* m, mjData* d) {
|
|||||||
int side, nv = m->nv, issparse = mj_isSparse(m);
|
int side, nv = m->nv, issparse = mj_isSparse(m);
|
||||||
mjtNum margin, value, dist, angleAxis[3];
|
mjtNum margin, value, dist, angleAxis[3];
|
||||||
mjtNum *jac;
|
mjtNum *jac;
|
||||||
mjMARKSTACK;
|
|
||||||
|
|
||||||
// disabled: return
|
// disabled: return
|
||||||
if (mjDISABLED(mjDSBL_LIMIT)) {
|
if (mjDISABLED(mjDSBL_LIMIT)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mjMARKSTACK;
|
||||||
|
|
||||||
// allocate Jacobian
|
// allocate Jacobian
|
||||||
jac = mj_stackAllocNum(d, nv);
|
jac = mj_stackAllocNum(d, nv);
|
||||||
|
|
||||||
@@ -863,7 +866,7 @@ void mj_instantiateLimit(const mjModel* m, mjData* d) {
|
|||||||
// find tendon limits
|
// find tendon limits
|
||||||
for (int i=0; i < m->ntendon; i++) {
|
for (int i=0; i < m->ntendon; i++) {
|
||||||
if (m->tendon_limited[i]) {
|
if (m->tendon_limited[i]) {
|
||||||
// get value = lenth, margin
|
// get value = length, margin
|
||||||
value = d->ten_length[i];
|
value = d->ten_length[i];
|
||||||
margin = m->tendon_margin[i];
|
margin = m->tendon_margin[i];
|
||||||
|
|
||||||
|
|||||||
@@ -394,13 +394,13 @@ void mj_tendon(const mjModel* m, mjData* d) {
|
|||||||
mjtNum dif[3], divisor, wpnt[12], wlen;
|
mjtNum dif[3], divisor, wpnt[12], wlen;
|
||||||
mjtNum *L = d->ten_length, *J = d->ten_J;
|
mjtNum *L = d->ten_length, *J = d->ten_J;
|
||||||
mjtNum *jac1, *jac2, *jacdif, *tmp, *sparse_buf = NULL;
|
mjtNum *jac1, *jac2, *jacdif, *tmp, *sparse_buf = NULL;
|
||||||
mjMARKSTACK;
|
|
||||||
|
|
||||||
if (!nten) {
|
if (!nten) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// allocate space
|
// allocate space
|
||||||
|
mjMARKSTACK;
|
||||||
jac1 = mj_stackAllocNum(d, 3*nv);
|
jac1 = mj_stackAllocNum(d, 3*nv);
|
||||||
jac2 = mj_stackAllocNum(d, 3*nv);
|
jac2 = mj_stackAllocNum(d, 3*nv);
|
||||||
jacdif = mj_stackAllocNum(d, 3*nv);
|
jacdif = mj_stackAllocNum(d, 3*nv);
|
||||||
@@ -622,13 +622,13 @@ void mj_transmission(const mjModel* m, mjData* d) {
|
|||||||
mjtNum *jac, *jacA, *jacS;
|
mjtNum *jac, *jacA, *jacS;
|
||||||
mjtNum *length = d->actuator_length, *moment = d->actuator_moment, *gear;
|
mjtNum *length = d->actuator_length, *moment = d->actuator_moment, *gear;
|
||||||
mjtNum *jacref = NULL, *moment_tmp = NULL; // required for site actuators
|
mjtNum *jacref = NULL, *moment_tmp = NULL; // required for site actuators
|
||||||
mjMARKSTACK;
|
|
||||||
|
|
||||||
if (!nu) {
|
if (!nu) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// allocate space, clear moments
|
// allocate space, clear moments
|
||||||
|
mjMARKSTACK;
|
||||||
jac = mj_stackAllocNum(d, 3*nv);
|
jac = mj_stackAllocNum(d, 3*nv);
|
||||||
jacA = mj_stackAllocNum(d, 3*nv);
|
jacA = mj_stackAllocNum(d, 3*nv);
|
||||||
jacS = mj_stackAllocNum(d, 3*nv);
|
jacS = mj_stackAllocNum(d, 3*nv);
|
||||||
|
|||||||
@@ -634,7 +634,6 @@ void mjd_inverseFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_actuatio
|
|||||||
mjtNum *DsDq, mjtNum *DsDv, mjtNum *DsDa,
|
mjtNum *DsDq, mjtNum *DsDv, mjtNum *DsDa,
|
||||||
mjtNum *DmDq) {
|
mjtNum *DmDq) {
|
||||||
int nq = m->nq, nv = m->nv, nM = m->nM, ns = m->nsensordata;
|
int nq = m->nq, nv = m->nv, nM = m->nM, ns = m->nsensordata;
|
||||||
mjMARKSTACK;
|
|
||||||
|
|
||||||
if (m->opt.integrator == mjINT_RK4) {
|
if (m->opt.integrator == mjINT_RK4) {
|
||||||
mjERROR("RK4 integrator is not supported");
|
mjERROR("RK4 integrator is not supported");
|
||||||
@@ -648,6 +647,7 @@ void mjd_inverseFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_actuatio
|
|||||||
int skipsensor = !DsDq && !DsDv && !DsDa;
|
int skipsensor = !DsDq && !DsDv && !DsDa;
|
||||||
|
|
||||||
// local vectors
|
// local vectors
|
||||||
|
mjMARKSTACK;
|
||||||
mjtNum *pos = mj_stackAllocNum(d, nq); // position
|
mjtNum *pos = mj_stackAllocNum(d, nq); // position
|
||||||
mjtNum *force = mj_stackAllocNum(d, nv); // force
|
mjtNum *force = mj_stackAllocNum(d, nv); // force
|
||||||
mjtNum *force_plus = mj_stackAllocNum(d, nv); // nudged force
|
mjtNum *force_plus = mj_stackAllocNum(d, nv); // nudged force
|
||||||
|
|||||||
@@ -665,7 +665,6 @@ void mj_RungeKutta(const mjModel* m, mjData* d, int N) {
|
|||||||
mjtNum C[9], T[9], *X[10], *F[10], *dX;
|
mjtNum C[9], T[9], *X[10], *F[10], *dX;
|
||||||
const mjtNum* A = (N == 4 ? RK4_A : 0);
|
const mjtNum* A = (N == 4 ? RK4_A : 0);
|
||||||
const mjtNum* B = (N == 4 ? RK4_B : 0);
|
const mjtNum* B = (N == 4 ? RK4_B : 0);
|
||||||
mjMARKSTACK;
|
|
||||||
|
|
||||||
// check order
|
// check order
|
||||||
if (!A) {
|
if (!A) {
|
||||||
@@ -673,6 +672,7 @@ void mj_RungeKutta(const mjModel* m, mjData* d, int N) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// allocate space for intermediate solutions
|
// allocate space for intermediate solutions
|
||||||
|
mjMARKSTACK;
|
||||||
dX = mj_stackAllocNum(d, 2*nv+na);
|
dX = mj_stackAllocNum(d, 2*nv+na);
|
||||||
for (int i=0; i < N; i++) {
|
for (int i=0; i < N; i++) {
|
||||||
X[i] = mj_stackAllocNum(d, nq+nv+na);
|
X[i] = mj_stackAllocNum(d, nq+nv+na);
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ static void mj_discreteAcc(const mjModel* m, mjData* d) {
|
|||||||
|
|
||||||
// if disabled or no dof damping, nothing to do
|
// if disabled or no dof damping, nothing to do
|
||||||
if (!dof_damping) {
|
if (!dof_damping) {
|
||||||
|
mjFREESTACK;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,7 +278,6 @@ void mj_inverse(const mjModel* m, mjData* d) {
|
|||||||
void mj_compareFwdInv(const mjModel* m, mjData* d) {
|
void mj_compareFwdInv(const mjModel* m, mjData* d) {
|
||||||
int nv = m->nv, nefc = d->nefc;
|
int nv = m->nv, nefc = d->nefc;
|
||||||
mjtNum *qforce, *dif, *save_qfrc_constraint, *save_efc_force;
|
mjtNum *qforce, *dif, *save_qfrc_constraint, *save_efc_force;
|
||||||
mjMARKSTACK;
|
|
||||||
|
|
||||||
// clear result, return if no constraints
|
// clear result, return if no constraints
|
||||||
d->solver_fwdinv[0] = d->solver_fwdinv[1] = 0;
|
d->solver_fwdinv[0] = d->solver_fwdinv[1] = 0;
|
||||||
@@ -286,6 +286,7 @@ void mj_compareFwdInv(const mjModel* m, mjData* d) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// allocate
|
// allocate
|
||||||
|
mjMARKSTACK;
|
||||||
qforce = mj_stackAllocNum(d, nv);
|
qforce = mj_stackAllocNum(d, nv);
|
||||||
dif = mj_stackAllocNum(d, nv);
|
dif = mj_stackAllocNum(d, nv);
|
||||||
save_qfrc_constraint = mj_stackAllocNum(d, nv);
|
save_qfrc_constraint = mj_stackAllocNum(d, nv);
|
||||||
|
|||||||
@@ -459,7 +459,7 @@ void mj_island(const mjModel* m, mjData* d) {
|
|||||||
memset(d->island_dofnum, 0, nisland*sizeof(int));
|
memset(d->island_dofnum, 0, nisland*sizeof(int));
|
||||||
for (int i=0; i < nv; i++) {
|
for (int i=0; i < nv; i++) {
|
||||||
// dof_island
|
// dof_island
|
||||||
int island = tree_island[m->dof_treeid[i]];;
|
int island = tree_island[m->dof_treeid[i]];
|
||||||
d->dof_island[i] = island;
|
d->dof_island[i] = island;
|
||||||
|
|
||||||
// island_dofnum
|
// island_dofnum
|
||||||
@@ -497,7 +497,7 @@ void mj_island(const mjModel* m, mjData* d) {
|
|||||||
mjERROR("not all islands assigned to dofs");
|
mjERROR("not all islands assigned to dofs");
|
||||||
}
|
}
|
||||||
|
|
||||||
// finalize dof_islandind: set remaning indices to -1
|
// finalize dof_islandind: set remaining indices to -1
|
||||||
for (int i=num_dof_island; i < nv; i++) {
|
for (int i=num_dof_island; i < nv; i++) {
|
||||||
d->island_dofind[i] = -1;
|
d->island_dofind[i] = -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -854,13 +854,13 @@ void mj_energyPos(const mjModel* m, mjData* d) {
|
|||||||
// velocity-dependent energy (kinetic)
|
// velocity-dependent energy (kinetic)
|
||||||
void mj_energyVel(const mjModel* m, mjData* d) {
|
void mj_energyVel(const mjModel* m, mjData* d) {
|
||||||
mjtNum *vec;
|
mjtNum *vec;
|
||||||
mjMARKSTACK;
|
|
||||||
|
|
||||||
// return if disabled (already cleared in potential)
|
// return if disabled (already cleared in potential)
|
||||||
if (!mjENABLED(mjENBL_ENERGY)) {
|
if (!mjENABLED(mjENBL_ENERGY)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mjMARKSTACK;
|
||||||
vec = mj_stackAllocNum(d, m->nv);
|
vec = mj_stackAllocNum(d, m->nv);
|
||||||
|
|
||||||
// kinetic energy: 0.5 * qvel' * M * qvel
|
// kinetic energy: 0.5 * qvel' * M * qvel
|
||||||
|
|||||||
@@ -529,6 +529,7 @@ void mjv_initPerturb(const mjModel* m, mjData* d, const mjvScene* scn, mjvPertur
|
|||||||
|
|
||||||
// invalid selected body: return
|
// invalid selected body: return
|
||||||
if (sel <= 0 || sel >= m->nbody) {
|
if (sel <= 0 || sel >= m->nbody) {
|
||||||
|
mjFREESTACK;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user