SF.net SVN: mahogany: [7259] trunk/M/src/modules/spam/DspamFilter.cpp

[email protected]
Newsgroups gmane.mail.mahogany.cvs
Message-ID <[email protected]>
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.