r15083: Using talloc with destructors is nice and all, but in this
authorJeremy Allison <jra@samba.org>
Thu, 13 Apr 2006 22:22:54 +0000 (22:22 +0000)
committerJeremy Allison <jra@samba.org>
Thu, 13 Apr 2006 22:22:54 +0000 (22:22 +0000)
case it's in a performace critical path and it *hurts* us.
Go back to plain malloc/free with an explicit destructor
call.
Jeremy.

source/locking/brlock.c
source/locking/locking.c
source/smbd/blocking.c

index 60c94c2b98df62feb1ee6bf9cdd8b1e16dc2d509..e6f0dd1c729baa9dfd546acc4fcac9e8ec78f1fd 100644 (file)
@@ -1304,10 +1304,8 @@ int brl_forall(BRLOCK_FN(fn))
  Unlock the record.
 ********************************************************************/
 
-static int byte_range_lock_destructor(void *p)
+int byte_range_lock_destructor(struct byte_range_lock *br_lck)
 {
-       struct byte_range_lock *br_lck =
-               talloc_get_type_abort(p, struct byte_range_lock);
        TDB_DATA key;
 
        key.dptr = (char *)&br_lck->key;
@@ -1336,6 +1334,7 @@ static int byte_range_lock_destructor(void *p)
 
        tdb_chainunlock(tdb, key);
        SAFE_FREE(br_lck->lock_data);
+       SAFE_FREE(br_lck);
        return 0;
 }
 
@@ -1344,12 +1343,11 @@ static int byte_range_lock_destructor(void *p)
  Leave the record locked.
 ********************************************************************/
 
-struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx,
-                                       files_struct *fsp)
+struct byte_range_lock *brl_get_locks(files_struct *fsp)
 {
        TDB_DATA key;
        TDB_DATA data;
-       struct byte_range_lock *br_lck = TALLOC_P(mem_ctx, struct byte_range_lock);
+       struct byte_range_lock *br_lck = SMB_MALLOC_P(struct byte_range_lock);
 
        if (br_lck == NULL) {
                return NULL;
@@ -1367,12 +1365,10 @@ struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx,
 
        if (tdb_chainlock(tdb, key) != 0) {
                DEBUG(3, ("Could not lock byte range lock entry\n"));
-               TALLOC_FREE(br_lck);
+               SAFE_FREE(br_lck);
                return NULL;
        }
 
-       talloc_set_destructor(br_lck, byte_range_lock_destructor);
-
        data = tdb_fetch(tdb, key);
        br_lck->lock_data = (void *)data.dptr;
        br_lck->num_locks = data.dsize / sizeof(struct lock_struct);
index 0b3f625d03e98c1cedf5cd0216bce4dd41c3bcf6..2b6023c0c41029f711b524814f64a46429861694 100644 (file)
@@ -100,7 +100,7 @@ BOOL is_locked(files_struct *fsp,
                        DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp->fsp_name ));
                        ret = False;
                } else {
-                       struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
+                       struct byte_range_lock *br_lck = brl_get_locks(fsp);
                        if (!br_lck) {
                                return False;
                        }
@@ -111,10 +111,10 @@ BOOL is_locked(files_struct *fsp,
                                        count,
                                        lock_type,
                                        lock_flav);
-                       TALLOC_FREE(br_lck);
+                       byte_range_lock_destructor(br_lck);
                }
        } else {
-               struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
+               struct byte_range_lock *br_lck = brl_get_locks(fsp);
                if (!br_lck) {
                        return False;
                }
@@ -125,7 +125,7 @@ BOOL is_locked(files_struct *fsp,
                                count,
                                lock_type,
                                lock_flav);
-               TALLOC_FREE(br_lck);
+               byte_range_lock_destructor(br_lck);
        }
 
        DEBUG(10,("is_locked: flavour = %s brl start=%.0f len=%.0f %s for fnum %d file %s\n",
@@ -158,7 +158,7 @@ NTSTATUS query_lock(files_struct *fsp,
                return NT_STATUS_OK;
        }
 
-       br_lck = brl_get_locks(NULL, fsp);
+       br_lck = brl_get_locks(fsp);
        if (!br_lck) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -171,7 +171,7 @@ NTSTATUS query_lock(files_struct *fsp,
                        plock_type,
                        lock_flav);
 
-       TALLOC_FREE(br_lck);
+       byte_range_lock_destructor(br_lck);
        return status;
 }
 
@@ -204,7 +204,7 @@ NTSTATUS do_lock(files_struct *fsp,
                lock_flav_name(lock_flav), lock_type_name(lock_type),
                (double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
 
-       br_lck = brl_get_locks(NULL, fsp);
+       br_lck = brl_get_locks(fsp);
        if (!br_lck) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -218,7 +218,7 @@ NTSTATUS do_lock(files_struct *fsp,
                        lock_flav,
                        my_lock_ctx);
 
-       TALLOC_FREE(br_lck);
+       byte_range_lock_destructor(br_lck);
        return status;
 }
 
@@ -305,7 +305,7 @@ NTSTATUS do_unlock(files_struct *fsp,
        DEBUG(10,("do_unlock: unlock start=%.0f len=%.0f requested for fnum %d file %s\n",
                  (double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
 
-       br_lck = brl_get_locks(NULL, fsp);
+       br_lck = brl_get_locks(fsp);
        if (!br_lck) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -317,7 +317,7 @@ NTSTATUS do_unlock(files_struct *fsp,
                        count,
                        lock_flav);
    
-       TALLOC_FREE(br_lck);
+       byte_range_lock_destructor(br_lck);
 
        if (!ok) {
                DEBUG(10,("do_unlock: returning ERRlock.\n" ));
@@ -343,10 +343,10 @@ void locking_close_file(files_struct *fsp)
         * Just release all the brl locks, no need to release individually.
         */
 
-       br_lck = brl_get_locks(NULL,fsp);
+       br_lck = brl_get_locks(fsp);
        if (br_lck) {
                brl_close_fnum(br_lck, pid);
-               TALLOC_FREE(br_lck);
+               byte_range_lock_destructor(br_lck);
        }
 
        if(lp_posix_locking(SNUM(fsp->conn))) {
index 6b47d0466bd8dd0fec84036e74ae56a8c9133c27..a8db498ef5a2aaa64871d0098c18aca3277eb2f5 100644 (file)
@@ -121,7 +121,7 @@ BOOL push_blocking_lock_request( char *inbuf, int length,
        memcpy(blr->inbuf, inbuf, length);
        blr->length = length;
 
-       br_lck = brl_get_locks(NULL, blr->fsp);
+       br_lck = brl_get_locks(blr->fsp);
        if (!br_lck) {
                free_blocking_lock_record(blr);
                return False;
@@ -136,7 +136,7 @@ BOOL push_blocking_lock_request( char *inbuf, int length,
                        PENDING_LOCK,
                        blr->lock_flav,
                        &my_lock_ctx);
-       TALLOC_FREE(br_lck);
+       byte_range_lock_destructor(br_lck);
 
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0,("push_blocking_lock_request: failed to add PENDING_LOCK record.\n"));
@@ -625,7 +625,7 @@ void remove_pending_lock_requests_by_fid(files_struct *fsp)
        for(blr = blocking_lock_queue; blr; blr = next) {
                next = blr->next;
                if(blr->fsp->fnum == fsp->fnum) {
-                       struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
+                       struct byte_range_lock *br_lck = brl_get_locks(fsp);
 
                        if (br_lck) {
                                DEBUG(10,("remove_pending_lock_requests_by_fid - removing request type %d for \
@@ -637,7 +637,7 @@ file %s fnum = %d\n", blr->com_type, fsp->fsp_name, fsp->fnum ));
                                        blr->offset,
                                        blr->count,
                                        blr->lock_flav);
-                               TALLOC_FREE(br_lck);
+                               byte_range_lock_destructor(br_lck);
 
                        }
 
@@ -658,7 +658,7 @@ void remove_pending_lock_requests_by_mid(int mid)
                next = blr->next;
                if(SVAL(blr->inbuf,smb_mid) == mid) {
                        files_struct *fsp = blr->fsp;
-                       struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
+                       struct byte_range_lock *br_lck = brl_get_locks(fsp);
 
                        if (br_lck) {
                                DEBUG(10,("remove_pending_lock_requests_by_mid - removing request type %d for \
@@ -670,7 +670,7 @@ file %s fnum = %d\n", blr->com_type, fsp->fsp_name, fsp->fnum ));
                                        blr->offset,
                                        blr->count,
                                        blr->lock_flav);
-                               TALLOC_FREE(br_lck);
+                               byte_range_lock_destructor(br_lck);
                        }
 
                        blocking_lock_reply_error(blr,NT_STATUS_FILE_LOCK_CONFLICT);
@@ -754,7 +754,7 @@ void process_blocking_lock_queue(time_t t)
                        fsp->fnum, fsp->fsp_name ));
 
                if((blr->expire_time != -1) && (blr->expire_time <= t)) {
-                       struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
+                       struct byte_range_lock *br_lck = brl_get_locks(fsp);
 
                        /*
                         * Lock expired - throw away all previously
@@ -771,7 +771,7 @@ void process_blocking_lock_queue(time_t t)
                                        blr->offset,
                                        blr->count,
                                        blr->lock_flav);
-                               TALLOC_FREE(br_lck);
+                               byte_range_lock_destructor(br_lck);
                        }
 
                        blocking_lock_reply_error(blr,NT_STATUS_FILE_LOCK_CONFLICT);
@@ -780,7 +780,7 @@ void process_blocking_lock_queue(time_t t)
                }
 
                if(!change_to_user(conn,vuid)) {
-                       struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
+                       struct byte_range_lock *br_lck = brl_get_locks(fsp);
 
                        /*
                         * Remove the entry and return an error to the client.
@@ -793,7 +793,7 @@ void process_blocking_lock_queue(time_t t)
                                        blr->offset,
                                        blr->count,
                                        blr->lock_flav);
-                               TALLOC_FREE(br_lck);
+                               byte_range_lock_destructor(br_lck);
                        }
 
                        DEBUG(0,("process_blocking_lock_queue: Unable to become user vuid=%d.\n",
@@ -804,7 +804,7 @@ void process_blocking_lock_queue(time_t t)
                }
 
                if(!set_current_service(conn,SVAL(blr->inbuf,smb_flg),True)) {
-                       struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
+                       struct byte_range_lock *br_lck = brl_get_locks(fsp);
 
                        /*
                         * Remove the entry and return an error to the client.
@@ -817,7 +817,7 @@ void process_blocking_lock_queue(time_t t)
                                        blr->offset,
                                        blr->count,
                                        blr->lock_flav);
-                               TALLOC_FREE(br_lck);
+                               byte_range_lock_destructor(br_lck);
                        }
 
                        DEBUG(0,("process_blocking_lock_queue: Unable to become service Error was %s.\n", strerror(errno) ));
@@ -834,7 +834,7 @@ void process_blocking_lock_queue(time_t t)
                 */
 
                if(blocking_lock_record_process(blr)) {
-                       struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
+                       struct byte_range_lock *br_lck = brl_get_locks(fsp);
 
                        if (br_lck) {
                                brl_remove_pending_lock(br_lck,
@@ -843,7 +843,7 @@ void process_blocking_lock_queue(time_t t)
                                        blr->offset,
                                        blr->count,
                                        blr->lock_flav);
-                               TALLOC_FREE(br_lck);
+                               byte_range_lock_destructor(br_lck);
                        }
 
                        free_blocking_lock_record(blr);