get rid of numerous probably inocuous valgrind/helgrind messages by ensuring that actual string copies are passed between threads, without refcount/shared data magic
This commit is contained in:
+3
-2
@@ -1419,10 +1419,11 @@ bool Db::addOrUpdate(const string &udi, const string &parent_udi, Doc &doc)
|
||||
// Dates etc.
|
||||
time_t mtime = atoll(doc.dmtime.empty() ? doc.fmtime.c_str() :
|
||||
doc.dmtime.c_str());
|
||||
struct tm *tm = localtime(&mtime);
|
||||
struct tm tmb;
|
||||
localtime_r(&mtime, &tmb);
|
||||
char buf[9];
|
||||
snprintf(buf, 9, "%04d%02d%02d",
|
||||
tm->tm_year+1900, tm->tm_mon + 1, tm->tm_mday);
|
||||
tmb.tm_year+1900, tmb.tm_mon + 1, tmb.tm_mday);
|
||||
// Date (YYYYMMDD)
|
||||
newdocument.add_boolean_term(wrap_prefix(xapday_prefix) + string(buf));
|
||||
// Month (YYYYMM)
|
||||
|
||||
+3
-1
@@ -50,9 +50,11 @@ public:
|
||||
// Note that udi and uniterm are strictly equivalent and are
|
||||
// passed both just to avoid recomputing uniterm which is
|
||||
// available on the caller site.
|
||||
// Take some care to avoid sharing string data (if string impl is cow)
|
||||
DbUpdTask(Op _op, const string& ud, const string& un,
|
||||
Xapian::Document *d, size_t tl)
|
||||
: op(_op), udi(ud), uniterm(un), doc(d), txtlen(tl)
|
||||
: op(_op), udi(ud.begin(), ud.end()), uniterm(un.begin(), un.end()),
|
||||
doc(d), txtlen(tl)
|
||||
{}
|
||||
// Udi and uniterm equivalently designate the doc
|
||||
Op op;
|
||||
|
||||
+29
-5
@@ -19,12 +19,12 @@
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
|
||||
#ifndef NO_NAMESPACES
|
||||
using std::string;
|
||||
using std::map;
|
||||
|
||||
#include "smallut.h"
|
||||
|
||||
namespace Rcl {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Dumb holder for document attributes and data.
|
||||
@@ -139,6 +139,8 @@ class Doc {
|
||||
|
||||
void erase() {
|
||||
url.erase();
|
||||
idxurl.erase();
|
||||
idxi = 0;
|
||||
ipath.erase();
|
||||
mimetype.erase();
|
||||
fmtime.erase();
|
||||
@@ -160,6 +162,30 @@ class Doc {
|
||||
haschildren = false;
|
||||
onlyxattr = false;
|
||||
}
|
||||
// Copy ensuring no shared string data, for threading issues.
|
||||
void copyto(Doc *d) const {
|
||||
d->url.assign(url.begin(), url.end());
|
||||
d->idxurl.assign(idxurl.begin(), idxurl.end());
|
||||
d->idxi = idxi;
|
||||
d->ipath.assign(ipath.begin(), ipath.end());
|
||||
d->mimetype.assign(mimetype.begin(), mimetype.end());
|
||||
d->fmtime.assign(fmtime.begin(), fmtime.end());
|
||||
d->dmtime.assign(dmtime.begin(), dmtime.end());
|
||||
d->origcharset.assign(origcharset.begin(), origcharset.end());
|
||||
map_ss_cp_noshr(meta, &d->meta);
|
||||
d->syntabs = syntabs;
|
||||
d->pcbytes.assign(pcbytes.begin(), pcbytes.end());
|
||||
d->fbytes.assign(fbytes.begin(), fbytes.end());
|
||||
d->dbytes.assign(dbytes.begin(), dbytes.end());
|
||||
d->sig.assign(sig.begin(), sig.end());
|
||||
d->text.assign(text.begin(), text.end());
|
||||
d->pc = pc;
|
||||
d->xdocid = xdocid;
|
||||
d->idxi = idxi;
|
||||
d->haspages = haspages;
|
||||
d->haschildren = haschildren;
|
||||
d->onlyxattr = onlyxattr;
|
||||
}
|
||||
Doc()
|
||||
: idxi(0), syntabs(false), pc(0), xdocid(0),
|
||||
haspages(false), haschildren(false), onlyxattr(false)
|
||||
@@ -247,8 +273,6 @@ class Doc {
|
||||
};
|
||||
|
||||
|
||||
#ifndef NO_NAMESPACES
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _RCLDOC_H_INCLUDED_ */
|
||||
|
||||
Reference in New Issue
Block a user