Revision: 7259
http://svn.sourceforge.net/mahogany/?rev=7259&view=rev
Author: vadz
Date: 2007-04-30 07:48:48 -0700 (Mon, 30 Apr 2007)
Log Message:
-----------
reuse the same memory map of hash database files for all contexts instead of un/remapping the file all the time (restores the logic of code prior to rev 7143 but now it works with hash driver and not sqlite one)
Revision Links:
--------------
http://svn.sourceforge.net/mahogany/?rev=7143&view=rev
Modified Paths:
--------------
trunk/M/src/modules/spam/DspamFilter.cpp
Modified: trunk/M/src/modules/spam/DspamFilter.cpp
===================================================================
--- trunk/M/src/modules/spam/DspamFilter.cpp 2007-04-30 14:46:27 UTC (rev 7258)
+++ trunk/M/src/modules/spam/DspamFilter.cpp 2007-04-30 14:48:48 UTC (rev 7259)
@@ -48,6 +48,8 @@
// wrappers around DSPAM_CTX
// ----------------------------------------------------------------------------
+static const char *DSPAM_USER_NAME = "mahogany";
+
// base class used by DspamProcess/ClassifyCtx
class DspamCtx
{
@@ -57,8 +59,8 @@
{
m_ctx = dspam_create
(
- "mahogany", // user
- NULL, // no group
+ DSPAM_USER_NAME, // user name used as base file name
+ NULL, // no group
mApplication->GetLocalDir().fn_str(),
mode,
flags
@@ -75,11 +77,22 @@
// and now that the attributes are set we can attach the context to the
// storage
- if ( dspam_attach(m_ctx, NULL) != 0 )
+ if ( dspam_attach(m_ctx, ms_hashMap) != 0 )
{
dspam_destroy(m_ctx);
m_ctx = NULL;
}
+ else if ( !ms_hashMap )
+ {
+ // this is the first context we create so it has just mapped the hash
+ // database into memory: tell it to not unmap it when we're done with
+ // it and keep the pointer to reuse for the subsequent contexts
+ _hash_drv_storage *storage = (_hash_drv_storage *)m_ctx->storage;
+ storage->dbh_attached = 1;
+
+ ms_hashMap = storage->map;
+ ms_hashLock = storage->lock;
+ }
}
// destroy the context
@@ -92,12 +105,34 @@
operator DSPAM_CTX *() const { return m_ctx; }
DSPAM_CTX *operator->() const { return m_ctx; }
+ // close the database connection
+ static void CloseHashStorage()
+ {
+ if ( ms_hashMap )
+ {
+ _hash_drv_close(ms_hashMap);
+ free(ms_hashMap);
+ ms_hashMap = NULL;
+
+ _hash_drv_lock_free(&ms_hashLock, DSPAM_USER_NAME);
+ }
+ }
+
private:
+ // the hash driver data reused by all contexts
+ static hash_drv_map_t ms_hashMap;
+ static _ds_lock_t ms_hashLock;
+
DSPAM_CTX *m_ctx;
DECLARE_NO_COPY_CLASS(DspamCtx);
};
+hash_drv_map_t DspamCtx::ms_hashMap = NULL;
+_ds_lock_t DspamCtx::ms_hashLock = NULL;
+
+MMODULE_CLEANUP(DspamCtx::CloseHashStorage)
+
// normal DSPAM context
class DspamProcessCtx : public DspamCtx
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.