D
das.chaos
Guest
Moin,
bevor ich mit Kanonen bzw. Valgrind auf Spatzen schiesse...
Ich habe mir testweise eine in-memory residierende db(3) per
angelegt!
Erzeugt mittels
eine Kopie von void *arg referenzierten Objekt
bzw. Bytestring und speichert diese in db(3).
Findet und loescht zuvor erstellten Eintrag, wobei eine Referenz auf
Element, von o. g. Funktion bei Erfolg, zurueckgegeben wird. Es
ergeben sich fuer mich ein paar Fragen, da ich momentan einen
Knoten im Kopf habe.
Befindet sich dann das per data.data referenzierte Element innerhalb
eines, aus Sicht von db(3), ungueltigen Addressraumes? Sollte dann
o. g. Funktion eigendlich als
reimplementiert werden? Damit eine Kopie des
zu loeschenden Objektes erzeugt werden wird,
welche von aufrufenden Entitaet wiederum per
void free(void *ptr) irgendwann geloescht
werden wird, falls die Kopie von dem zuvor in
db(3) entfernten Element nicht mehr
benoetigt werden weurde?
Moeglicherweise habe ich mir schon unbewusst
die Fragen selber beantwortet... da mir bekannt
ist, dass die Implementierung von db(3) ein
eigenes Memory Management auf Basis von
Paging implementiert.
Helft mir mal bitte auf die Spruenge, dass liegt
wohl am Wetter, dass ich momentan den Wald
vor lauter Baeumen nicht sehe.
bevor ich mit Kanonen bzw. Valgrind auf Spatzen schiesse...
Ich habe mir testweise eine in-memory residierende db(3) per
C:
db = dbopen(NULL, O_RDWR, 0, DB_HASH, NULL);
C:
static void *
c_obj_add(DB *db, DBT *key, void *arg)
{
struct c_obj *co;
DBT data;
if ((co = arg) == NULL)
return (NULL);
data.data = co;
data.size = co->co_len;
if ((*db->put)(db, key, &data, 0))
return (NULL);
return (data.data);
}
C:
(*db->put)(db, key, &data, 0)
bzw. Bytestring und speichert diese in db(3).
C:
static void *
c_obj_del(DB *db, DBT *key, void *arg __unused)
{
DBT data;
(void)memset(&data, 0, sizeof(data));
if ((*db->get)(db, key, &data, 0))
return (NULL);
if ((*db->del)(db, key, 0))
return (NULL);
return (data.data);
}
Element, von o. g. Funktion bei Erfolg, zurueckgegeben wird. Es
ergeben sich fuer mich ein paar Fragen, da ich momentan einen
Knoten im Kopf habe.
Befindet sich dann das per data.data referenzierte Element innerhalb
eines, aus Sicht von db(3), ungueltigen Addressraumes? Sollte dann
o. g. Funktion eigendlich als
C:
static void *
c_obj_del(DB *db, DBT *key, void *arg __unused)
{
DBT data;
void *rv;
(void)memset(&data, 0, sizeof(data));
if ((*db->get)(db, key, &data, 0))
goto bad;
if ((rv = malloc(data.size)) == NULL)
goto bad;
(void)memmove(rv, data.data, data.size);
if ((*db->del)(db, key, 0))
goto bad1;
out:
return (rv};
bad1:
free(rv);
bad:
rv = NULL:
goto out;
}
zu loeschenden Objektes erzeugt werden wird,
welche von aufrufenden Entitaet wiederum per
void free(void *ptr) irgendwann geloescht
werden wird, falls die Kopie von dem zuvor in
db(3) entfernten Element nicht mehr
benoetigt werden weurde?
Moeglicherweise habe ich mir schon unbewusst
die Fragen selber beantwortet... da mir bekannt
ist, dass die Implementierung von db(3) ein
eigenes Memory Management auf Basis von
Paging implementiert.
Helft mir mal bitte auf die Spruenge, dass liegt
wohl am Wetter, dass ich momentan den Wald
vor lauter Baeumen nicht sehe.