save memory
authorVolker Lendecke <Volker.Lendecke@SerNet.DE>
Wed, 31 Oct 2007 14:06:22 +0000 (15:06 +0100)
committerJeremy Allison <jra@samba.org>
Thu, 1 Nov 2007 18:04:24 +0000 (11:04 -0700)
Hi!

Attached find a patch that I've wanted to check in for ages.
The whole area probably needs a major rewrite, but this is a
minimal patch that on a 32-bit box saves 1.5k per smbd per
defined share, twice as much on a 64-bit box.

Volker

From ebb80e664ecc49eb597a45cb57e1067fbae49e62 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl@sernet.de>
Date: Wed, 31 Oct 2007 15:04:34 +0100
Subject: [PATCH] Change global->copymap from bool* to a bitmap

We right now have 401 parameters, so with bool being represented as a 64-bit
integer this saves about 3k of memory per smbd per share that is defined in
smb.conf.
(This used to be commit 94f2c35a683eace7f9f3dad9748aaec93f7c534f)

source3/param/loadparm.c

index a5b264756795ef6ada87b6c0f62cd4bc2625bf9c..163f4179a6345a92fe53a2674d14f8d78b86764f 100644 (file)
@@ -441,7 +441,7 @@ typedef struct {
        bool bStrictAllocate;
        bool bStrictSync;
        char magic_char;
-       bool *copymap;
+       struct bitmap *copymap;
        bool bDeleteReadonly;
        bool bFakeOplocks;
        bool bDeleteVetoFiles;
@@ -2181,7 +2181,8 @@ static const char *get_boolean(bool bool_value);
 static int getservicebyname(const char *pszServiceName,
                            service * pserviceDest);
 static void copy_service(service * pserviceDest,
-                        service * pserviceSource, bool *pcopymapDest);
+                        service * pserviceSource,
+                        struct bitmap *pcopymapDest);
 static bool do_parameter(const char *pszParmName, const char *pszParmValue);
 static bool do_section(const char *pszSectionName);
 static void init_copymap(service * pservice);
@@ -2455,7 +2456,7 @@ static void free_service(service *pservice)
                       pservice->szService));
 
        string_free(&pservice->szService);
-       SAFE_FREE(pservice->copymap);
+       bitmap_free(pservice->copymap);
 
        for (i = 0; parm_table[i].label; i++) {
                if ((parm_table[i].type == P_STRING ||
@@ -3188,7 +3189,8 @@ static int getservicebyname(const char *pszServiceName, service * pserviceDest)
  If pcopymapDest is NULL then copy all fields
 ***************************************************************************/
 
-static void copy_service(service * pserviceDest, service * pserviceSource, bool *pcopymapDest)
+static void copy_service(service * pserviceDest, service * pserviceSource,
+                        struct bitmap *pcopymapDest)
 {
        int i;
        bool bcopyall = (pcopymapDest == NULL);
@@ -3197,7 +3199,7 @@ static void copy_service(service * pserviceDest, service * pserviceSource, bool
 
        for (i = 0; parm_table[i].label; i++)
                if (parm_table[i].ptr && parm_table[i].p_class == P_LOCAL &&
-                   (bcopyall || pcopymapDest[i])) {
+                   (bcopyall || bitmap_query(pcopymapDest,i))) {
                        void *def_ptr = parm_table[i].ptr;
                        void *src_ptr =
                                ((char *)pserviceSource) + PTR_DIFF(def_ptr,
@@ -3244,9 +3246,8 @@ static void copy_service(service * pserviceDest, service * pserviceSource, bool
        if (bcopyall) {
                init_copymap(pserviceDest);
                if (pserviceSource->copymap)
-                       memcpy((void *)pserviceDest->copymap,
-                              (void *)pserviceSource->copymap,
-                              sizeof(bool) * NUMPARAMETERS);
+                       bitmap_copy(pserviceDest->copymap,
+                                   pserviceSource->copymap);
        }
        
        data = pserviceSource->param_opt;
@@ -3985,15 +3986,17 @@ static bool handle_printing(int snum, const char *pszParmValue, char **ptr)
 static void init_copymap(service * pservice)
 {
        int i;
-       SAFE_FREE(pservice->copymap);
-       pservice->copymap = SMB_MALLOC_ARRAY(bool,NUMPARAMETERS);
+       if (pservice->copymap) {
+               bitmap_free(pservice->copymap);
+       }
+       pservice->copymap = bitmap_allocate(NUMPARAMETERS);
        if (!pservice->copymap)
                DEBUG(0,
                      ("Couldn't allocate copymap!! (size %d)\n",
                       (int)NUMPARAMETERS));
        else
                for (i = 0; i < NUMPARAMETERS; i++)
-                       pservice->copymap[i] = True;
+                       bitmap_set(pservice->copymap, i);
 }
 
 /***************************************************************************
@@ -4095,7 +4098,7 @@ bool lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
                   the same data pointer */
                for (i = 0; parm_table[i].label; i++)
                        if (parm_table[i].ptr == parm_table[parmnum].ptr)
-                               ServicePtrs[snum]->copymap[i] = False;
+                               bitmap_clear(ServicePtrs[snum]->copymap, i);
        }
 
        /* if it is a special case then go ahead */