[bdbxml] Segmentation fault in putDocument
"chehai wu" <[email protected]> Mon, 20 Feb 2006 11:16:45 +0800
| Newsgroups | gmane.comp.db.dbxml.general |
|---|---|
| Message-ID | <[email protected]> |
------=_Part_17718_5227686.1140405405190
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Hi,
I use two threads to put XML documents into a container by calling
XmlContainer::putDocument. The deadlock is possible, so I retry putDocument
when the deadlock is detected. But after the deadlock is resolved, the
program will generate the segmentation fault error. GDB shows the
following:
#0 0xb758292c in Dbc::get () from /usr/lib/libdb_cxx-4.3.so
#1 0xb775402c in DbXml::DocumentDatabase::getAllMetaData (this=3D0x80a8238=
,
context=3D@0x80b7fd4,
dictionary=3D0x80a6dd8, document=3D0x80b7f90, flags=3D30) at Cursor.hpp=
:49
#2 0xb76f6674 in DbXml::Document::setEagerMetaData (this=3D0x80b7f90) at
Document.cpp:145
#3 0xb76f67d3 in DbXml::Document::setMetaDataFromContainer (this=3D0x80b7f=
90,
container=3D0x80a5f28,
id=3D@0x1e, txn=3D0x80aa290, flags=3D0) at Document.cpp:127
#4 0xb76db475 in DbXml::Container::addDocument (this=3D0x80a5f28,
txn=3D0x80aa290,
document=3D@0x80b7f90, context=3D@0x80a5328, flags=3D536870912) at
Container.cpp:553
#5 0xb76e6a8f in AddDocumentFunctor::method (this=3D0x1e,
container=3D@0x80a5f28, txn=3D0x80aa290,
flags=3D536870912) at TransactedContainer.cpp:99
#6 0xb76e59ae in DbXml::TransactedContainer::transactedMethod
(this=3D0x80a5f28, txn=3D0x0,
flags=3D536870912, f=3D@0xb723b338) at TransactedContainer.cpp:217
#7 0xb76e5c90 in DbXml::TransactedContainer::addDocument (this=3D0x80a5f28=
,
txn=3D0x80aa290,
document=3D@0x1e, context=3D@0x1e, flags=3D536870912) at
TransactedContainer.cpp:110
#8 0xb771ae53 in DbXml::XmlContainer::putDocument (this=3D0x804a2bc,
txn=3D@0xb723b420,
document=3D@0x1e, context=3D@0x1e, flags=3D536870912) at XmlContainer.c=
pp:359
#9 0xb771b4e5 in DbXml::XmlContainer::putDocument (this=3D0x804a2bc,
txn=3D@0xb723b420,
name=3D@0xb723b42c, contents=3D@0x804a2c8, context=3D@0xb723b424,
flags=3D536870912)
at XmlContainer.cpp:392
#10 0x080497ce in dbWorker (arg=3D0x80a5ef8) at main.cpp:79
#11 0xb7317cfd in start_thread () from /lib/tls/libpthread.so.0
#12 0xb73f513e in clone () from /lib/tls/libc.so.6
I think there is something wrong in my code, but I cannot figure it out.
My code:
void*
dbWorker(void* arg)
{
int id =3D *(int*)arg;
std::string name;
DbXml::XmlUpdateContext dbUpdateContext;
bool failed;
DbXml::XmlTransaction txn;
try {
dbUpdateContext =3D dbManager->createUpdateContext();
} catch (DbXml::XmlException &xe) {
std::cerr << xe.what() << std::endl;
}
for (;;) {
failed =3D true;
while(failed) {
try {
txn =3D dbManager->createTransaction();
printf("thread %d %s\n", id, "before
putDocument");
dbContainer.putDocument(txn, name, XmlFile,
dbUpdateContext, DbXml::
DBXML_GEN_NAME);
printf("thread %d %s\n", id, "after
putDocument");
txn.commit();
} catch (DbXml::XmlException &xe) {
txn.abort();
if (xe.getDbErrno() =3D=3D DB_LOCK_DEADLOCK=
) {
printf("thread %d %s\n", id,
"deadlock detected");
continue;
}
std::cerr << xe.what() << std::endl;
}
failed =3D false;
}
}
}
------=_Part_17718_5227686.1140405405190
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Hi,<br> I use two threads to put XML documents into =
a container by calling XmlContainer::putDocument. The deadlock is pos=
sible, so I retry putDocument when the deadlock is detected. But after the =
deadlock is resolved, the program will generate the segmentation faul=
t error. GDB shows the following:
<br><br>#0 0xb758292c in Dbc::get () from /usr/lib/libdb_cxx-<a href=
=3D"http://4.3.so">4.3.so</a><br>#1 0xb775402c in DbXml::DocumentData=
base::getAllMetaData (this=3D0x80a8238, context=3D@0x80b7fd4, <br> &nb=
sp; dictionary=3D0x80a6dd8, document=3D0x80b7f90, flags=3D30) at=20
Cursor.hpp:49<br>#2 0xb76f6674 in DbXml::Document::setEagerMetaData (=
this=3D0x80b7f90) at Document.cpp:145<br>#3 0xb76f67d3 in DbXml::Docu=
ment::setMetaDataFromContainer (this=3D0x80b7f90, container=3D0x80a5f28, <b=
r> id=3D@0x1e, txn=3D0x80aa290, flags=3D0) at=20
Document.cpp:127<br>#4 0xb76db475 in DbXml::Container::addDocument (t=
his=3D0x80a5f28, txn=3D0x80aa290, <br> document=3D@0x80b7=
f90, context=3D@0x80a5328, flags=3D536870912) at Container.cpp:553<br>#5&nb=
sp; 0xb76e6a8f in AddDocumentFunctor::method (this=3D0x1e, container=3D@0x8=
0a5f28, txn=3D0x80aa290,=20
<br> flags=3D536870912) at TransactedContainer.cpp:99<br>=
#6 0xb76e59ae in DbXml::TransactedContainer::transactedMethod (this=
=3D0x80a5f28, txn=3D0x0, <br> flags=3D536870912, f=3D@0xb=
723b338) at TransactedContainer.cpp:217<br>
#7 0xb76e5c90 in DbXml::TransactedContainer::addDocument (this=3D0x80=
a5f28, txn=3D0x80aa290, <br> document=3D@0x1e, context=3D=
@0x1e, flags=3D536870912) at TransactedContainer.cpp:110<br>#8 0xb771=
ae53 in DbXml::XmlContainer::putDocument (this=3D0x804a2bc, txn=3D@0xb723b4=
20,=20
<br> document=3D@0x1e, context=3D@0x1e, flags=3D536870912=
) at XmlContainer.cpp:359<br>#9 0xb771b4e5 in DbXml::XmlContainer::pu=
tDocument (this=3D0x804a2bc, txn=3D@0xb723b420, <br> name=
=3D@0xb723b42c, contents=3D@0x804a2c8, context=3D@0xb723b424, flags=3D53687=
0912)
<br> at XmlContainer.cpp:392<br>#10 0x080497ce in dbWorke=
r (arg=3D0x80a5ef8) at main.cpp:79<br>#11 0xb7317cfd in start_thread () fro=
m /lib/tls/libpthread.so.0<br>#12 0xb73f513e in clone () from /lib/tls/libc=
.so.6<br><br>
I think there is something wrong in my code, but I cannot figure it ou=
t.<br><br>My code:<br><br>void*<br>dbWorker(void* arg)<br>{<br> =
int id =3D *(int*)arg;<br> =
std::string name;<br>  =
; DbXml::XmlUpdateContext dbUpdateContext;
<br> bool failed;<br> =
DbXml::XmlTransaction txn;<br> &n=
bsp; try {<br> &=
nbsp; dbUpdateContext =3D d=
bManager->createUpdateContext();<br> =
} catch (DbXml::XmlException &xe) {<br> &=
nbsp; std::cerr=
<<=20
xe.what() << std::endl;<br> =
}<br> for (;;) {<br> =
&nb=
sp; failed =3D true;<br> &nb=
sp; while(failed) {<br> &nbs=
p; &=
nbsp; try {<br> =
&nb=
sp; =
txn =3D dbManager->createTransaction();
<br>  =
; &n=
bsp; printf("thread %d %s\n",=
id, "before putDocument");<br> &nbs=
p; &=
nbsp; &nbs=
p; dbContainer.putDocument(txn, name, XmlFile, dbUpdateContext, DbXml::<br>=
DBXML_GEN_NAME);
<br>  =
; &n=
bsp; printf("thread %d %s\n",=
id, "after putDocument");<br>  =
; &n=
bsp;  =
; txn.commit();<br> &n=
bsp;  =
; } catch (DbXml::XmlException &xe) {
<br>  =
; &n=
bsp; txn.abort();<br> =
&nb=
sp; =
if (xe.getDbErrno() =3D=3D DB_LOCK_DEADLOCK) {<br> =
&nb=
sp; =
&nb=
sp; printf("thread %d %s\n", id, "deadlock detected");
<br>  =
; &n=
bsp;  =
; continue;<br> =
&nb=
sp; }<br> =
&nb=
sp; =
std::cerr << xe.what() << std::e=
ndl;<br> &=
nbsp; }<b=
r> &=
nbsp; failed =
=3D false;
<br>  =
; }<br> }<br>}<=
br>
------=_Part_17718_5227686.1140405405190--