1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-01 04:58:35 +03:00

r15083: Using talloc with destructors is nice and all, but in this

case it's in a performace critical path and it *hurts* us.
Go back to plain malloc/free with an explicit destructor
call.
Jeremy.
(This used to be commit 1c99aed563c29e1b3d70939878af747a0660bfec)
This commit is contained in:
Jeremy Allison 2006-04-13 22:22:54 +00:00 committed by Gerald (Jerry) Carter
parent 1f19676903
commit 713eaf1d67
3 changed files with 31 additions and 35 deletions

View File

@ -1304,10 +1304,8 @@ int brl_forall(BRLOCK_FN(fn))
Unlock the record. 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; TDB_DATA key;
key.dptr = (char *)&br_lck->key; key.dptr = (char *)&br_lck->key;
@ -1336,6 +1334,7 @@ static int byte_range_lock_destructor(void *p)
tdb_chainunlock(tdb, key); tdb_chainunlock(tdb, key);
SAFE_FREE(br_lck->lock_data); SAFE_FREE(br_lck->lock_data);
SAFE_FREE(br_lck);
return 0; return 0;
} }
@ -1344,12 +1343,11 @@ static int byte_range_lock_destructor(void *p)
Leave the record locked. Leave the record locked.
********************************************************************/ ********************************************************************/
struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx, struct byte_range_lock *brl_get_locks(files_struct *fsp)
files_struct *fsp)
{ {
TDB_DATA key; TDB_DATA key;
TDB_DATA data; 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) { if (br_lck == NULL) {
return NULL; return NULL;
@ -1367,12 +1365,10 @@ struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx,
if (tdb_chainlock(tdb, key) != 0) { if (tdb_chainlock(tdb, key) != 0) {
DEBUG(3, ("Could not lock byte range lock entry\n")); DEBUG(3, ("Could not lock byte range lock entry\n"));
TALLOC_FREE(br_lck); SAFE_FREE(br_lck);
return NULL; return NULL;
} }
talloc_set_destructor(br_lck, byte_range_lock_destructor);
data = tdb_fetch(tdb, key); data = tdb_fetch(tdb, key);
br_lck->lock_data = (void *)data.dptr; br_lck->lock_data = (void *)data.dptr;
br_lck->num_locks = data.dsize / sizeof(struct lock_struct); br_lck->num_locks = data.dsize / sizeof(struct lock_struct);

View 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 )); DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp->fsp_name ));
ret = False; ret = False;
} else { } 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) { if (!br_lck) {
return False; return False;
} }
@ -111,10 +111,10 @@ BOOL is_locked(files_struct *fsp,
count, count,
lock_type, lock_type,
lock_flav); lock_flav);
TALLOC_FREE(br_lck); byte_range_lock_destructor(br_lck);
} }
} else { } 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) { if (!br_lck) {
return False; return False;
} }
@ -125,7 +125,7 @@ BOOL is_locked(files_struct *fsp,
count, count,
lock_type, lock_type,
lock_flav); 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", 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; return NT_STATUS_OK;
} }
br_lck = brl_get_locks(NULL, fsp); br_lck = brl_get_locks(fsp);
if (!br_lck) { if (!br_lck) {
return NT_STATUS_NO_MEMORY; return NT_STATUS_NO_MEMORY;
} }
@ -171,7 +171,7 @@ NTSTATUS query_lock(files_struct *fsp,
plock_type, plock_type,
lock_flav); lock_flav);
TALLOC_FREE(br_lck); byte_range_lock_destructor(br_lck);
return status; return status;
} }
@ -204,7 +204,7 @@ NTSTATUS do_lock(files_struct *fsp,
lock_flav_name(lock_flav), lock_type_name(lock_type), lock_flav_name(lock_flav), lock_type_name(lock_type),
(double)offset, (double)count, fsp->fnum, fsp->fsp_name )); (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) { if (!br_lck) {
return NT_STATUS_NO_MEMORY; return NT_STATUS_NO_MEMORY;
} }
@ -218,7 +218,7 @@ NTSTATUS do_lock(files_struct *fsp,
lock_flav, lock_flav,
my_lock_ctx); my_lock_ctx);
TALLOC_FREE(br_lck); byte_range_lock_destructor(br_lck);
return status; 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", 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 )); (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) { if (!br_lck) {
return NT_STATUS_NO_MEMORY; return NT_STATUS_NO_MEMORY;
} }
@ -317,7 +317,7 @@ NTSTATUS do_unlock(files_struct *fsp,
count, count,
lock_flav); lock_flav);
TALLOC_FREE(br_lck); byte_range_lock_destructor(br_lck);
if (!ok) { if (!ok) {
DEBUG(10,("do_unlock: returning ERRlock.\n" )); 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. * 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) { if (br_lck) {
brl_close_fnum(br_lck, pid); brl_close_fnum(br_lck, pid);
TALLOC_FREE(br_lck); byte_range_lock_destructor(br_lck);
} }
if(lp_posix_locking(SNUM(fsp->conn))) { if(lp_posix_locking(SNUM(fsp->conn))) {

View File

@ -121,7 +121,7 @@ BOOL push_blocking_lock_request( char *inbuf, int length,
memcpy(blr->inbuf, inbuf, length); memcpy(blr->inbuf, inbuf, length);
blr->length = length; blr->length = length;
br_lck = brl_get_locks(NULL, blr->fsp); br_lck = brl_get_locks(blr->fsp);
if (!br_lck) { if (!br_lck) {
free_blocking_lock_record(blr); free_blocking_lock_record(blr);
return False; return False;
@ -136,7 +136,7 @@ BOOL push_blocking_lock_request( char *inbuf, int length,
PENDING_LOCK, PENDING_LOCK,
blr->lock_flav, blr->lock_flav,
&my_lock_ctx); &my_lock_ctx);
TALLOC_FREE(br_lck); byte_range_lock_destructor(br_lck);
if (!NT_STATUS_IS_OK(status)) { if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("push_blocking_lock_request: failed to add PENDING_LOCK record.\n")); 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) { for(blr = blocking_lock_queue; blr; blr = next) {
next = blr->next; next = blr->next;
if(blr->fsp->fnum == fsp->fnum) { 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) { if (br_lck) {
DEBUG(10,("remove_pending_lock_requests_by_fid - removing request type %d for \ 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->offset,
blr->count, blr->count,
blr->lock_flav); 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; next = blr->next;
if(SVAL(blr->inbuf,smb_mid) == mid) { if(SVAL(blr->inbuf,smb_mid) == mid) {
files_struct *fsp = blr->fsp; 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) { if (br_lck) {
DEBUG(10,("remove_pending_lock_requests_by_mid - removing request type %d for \ 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->offset,
blr->count, blr->count,
blr->lock_flav); blr->lock_flav);
TALLOC_FREE(br_lck); byte_range_lock_destructor(br_lck);
} }
blocking_lock_reply_error(blr,NT_STATUS_FILE_LOCK_CONFLICT); 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 )); fsp->fnum, fsp->fsp_name ));
if((blr->expire_time != -1) && (blr->expire_time <= t)) { 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 * Lock expired - throw away all previously
@ -771,7 +771,7 @@ void process_blocking_lock_queue(time_t t)
blr->offset, blr->offset,
blr->count, blr->count,
blr->lock_flav); blr->lock_flav);
TALLOC_FREE(br_lck); byte_range_lock_destructor(br_lck);
} }
blocking_lock_reply_error(blr,NT_STATUS_FILE_LOCK_CONFLICT); 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)) { 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. * 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->offset,
blr->count, blr->count,
blr->lock_flav); 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", 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)) { 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. * 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->offset,
blr->count, blr->count,
blr->lock_flav); 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) )); 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)) { 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) { if (br_lck) {
brl_remove_pending_lock(br_lck, brl_remove_pending_lock(br_lck,
@ -843,7 +843,7 @@ void process_blocking_lock_queue(time_t t)
blr->offset, blr->offset,
blr->count, blr->count,
blr->lock_flav); blr->lock_flav);
TALLOC_FREE(br_lck); byte_range_lock_destructor(br_lck);
} }
free_blocking_lock_record(blr); free_blocking_lock_record(blr);