diff options
author | Volker Lendecke <vl@samba.org> | 2008-07-11 17:44:09 +0200 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2008-07-11 17:53:25 +0200 |
commit | d670d0a09bec3b6900421df17fc9d959545ee953 (patch) | |
tree | 0f772cbe645829c2f92219a04f4fad03cd0a27b4 | |
parent | d803fa6e46c98cc6cdcacfb0225388d786617f0a (diff) | |
download | samba-d670d0a09bec3b6900421df17fc9d959545ee953.tar.gz samba-d670d0a09bec3b6900421df17fc9d959545ee953.tar.bz2 samba-d670d0a09bec3b6900421df17fc9d959545ee953.zip |
Revert "Remove gencache_[un]lock_entry"
This reverts commit 7a5a575ffe5196caecedc93970a25abfbe6f8059.
(This used to be commit 62e444dd50ae974c2ab9a553cdf7f188a8f2c538)
-rw-r--r-- | source3/include/proto.h | 2 | ||||
-rw-r--r-- | source3/lib/gencache.c | 25 | ||||
-rw-r--r-- | source3/libsmb/dsgetdcname.c | 12 |
3 files changed, 37 insertions, 2 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 278a42a974..9958c91dca 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -606,6 +606,8 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob, bool *expired); bool gencache_set_data_blob(const char *keystr, const DATA_BLOB *blob, time_t timeout); void gencache_iterate(void (*fn)(const char* key, const char *value, time_t timeout, void* dptr), void* data, const char* keystr_pattern); +int gencache_lock_entry( const char *key ); +void gencache_unlock_entry( const char *key ); /* The following definitions come from lib/genrand.c */ diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c index a55b2ab9ba..1b4342a62b 100644 --- a/source3/lib/gencache.c +++ b/source3/lib/gencache.c @@ -484,3 +484,28 @@ void gencache_iterate(void (*fn)(const char* key, const char *value, time_t time tdb_search_list_free(first_node); } + +/******************************************************************** + lock a key +********************************************************************/ + +int gencache_lock_entry( const char *key ) +{ + if (!gencache_init()) + return -1; + + return tdb_lock_bystring(cache, key); +} + +/******************************************************************** + unlock a key +********************************************************************/ + +void gencache_unlock_entry( const char *key ) +{ + if (!gencache_init()) + return; + + tdb_unlock_bystring(cache, key); + return; +} diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index afc87030d0..2a445cbd5a 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -159,6 +159,7 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, { time_t expire_time; char *key; + bool ret = false; if (!gencache_init()) { return NT_STATUS_INTERNAL_DB_ERROR; @@ -171,8 +172,15 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, expire_time = time(NULL) + DSGETDCNAME_CACHE_TTL; - return gencache_set_data_blob(key, blob, expire_time) - ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + if (gencache_lock_entry(key) != 0) { + return NT_STATUS_LOCK_NOT_GRANTED; + } + + ret = gencache_set_data_blob(key, blob, expire_time); + + gencache_unlock_entry(key); + + return ret ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; } /**************************************************************** |