int ignoreProblem;
char * str1;
uint64_t num1;
+ int nrefs;
};
/**
p = ps->probs + ps->numProblems;
ps->numProblems++;
- *p = prob;
+ *p = rpmProblemLink(prob);
}
void rpmpsAppend(rpmps ps, rpmProblemType type,
p = rpmProblemCreate(type, pkgNEVR, key, dn, bn, altNEVR, number);
rpmpsAppendProblem(ps, p);
+ rpmProblemFree(p);
}
#define XSTRCMP(a, b) ((!(a) && !(b)) || ((a) && (b) && !strcmp((a), (b))))
if (dn != NULL) t = stpcpy(t, dn);
if (bn != NULL) t = stpcpy(t, bn);
}
- return p;
+ return rpmProblemLink(p);
}
rpmProblem rpmProblemFree(rpmProblem prob)
{
+ if (prob == NULL) return NULL;
+
+ if (prob->nrefs > 1) {
+ return rpmProblemUnlink(prob);
+ }
prob->pkgNEVR = _free(prob->pkgNEVR);
prob->altNEVR = _free(prob->altNEVR);
prob->str1 = _free(prob->str1);
- prob = _free(prob);
+ free(prob);
+ return NULL;
+}
+
+rpmProblem rpmProblemLink(rpmProblem prob)
+{
+ if (prob) {
+ prob->nrefs++;
+ }
+ return prob;
+}
+
+rpmProblem rpmProblemUnlink(rpmProblem prob)
+{
+ if (prob) {
+ prob->nrefs--;
+ }
return NULL;
}
rpmProblem rpmProblemFree(rpmProblem prob);
/** \ingroup rpmps
+ * Reference an rpmProblem instance
+ * @param prob rpm problem
+ * @return rpm problem
+ */
+rpmProblem rpmProblemLink(rpmProblem prob);
+
+/** \ingroup rpmps
+ * Unreference an rpmProblem instance
+ * @param prob rpm problem
+ * @return rpm problem
+ */
+rpmProblem rpmProblemUnlink(rpmProblem prob);
+
+/** \ingroup rpmps
* Return package NEVR
* @param prob rpm problem
* @return package NEVR