aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexandra Ellwood <lxs@mit.edu>2007-07-31 20:23:02 +0000
committerAlexandra Ellwood <lxs@mit.edu>2007-07-31 20:23:02 +0000
commit56154de391f4a33501fcfdc6ab916e14abe52204 (patch)
tree96f9abcfb97490c5b1b8d190cecf278da36abce5 /src
parent304539fc1dd57d93d68b98dc436fd8f84f5bdb75 (diff)
downloadkrb5-56154de391f4a33501fcfdc6ab916e14abe52204.zip
krb5-56154de391f4a33501fcfdc6ab916e14abe52204.tar.gz
krb5-56154de391f4a33501fcfdc6ab916e14abe52204.tar.bz2
Implemented and tested cc_ccache_wait_for_change()
ticket: 4644 status: open git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@19740 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src')
-rw-r--r--src/ccapi/lib/ccapi_context.c1
-rw-r--r--src/ccapi/server/ccs_cache_collection.c46
-rw-r--r--src/ccapi/server/ccs_callback.c3
-rw-r--r--src/ccapi/server/ccs_ccache.c4
-rw-r--r--src/ccapi/server/ccs_client.c5
5 files changed, 36 insertions, 23 deletions
diff --git a/src/ccapi/lib/ccapi_context.c b/src/ccapi/lib/ccapi_context.c
index feccc85..1aef3a6 100644
--- a/src/ccapi/lib/ccapi_context.c
+++ b/src/ccapi/lib/ccapi_context.c
@@ -125,6 +125,7 @@ cc_int32 cc_initialize (cc_context_t *out_context,
case ccapi_version_4:
case ccapi_version_5:
case ccapi_version_6:
+ case ccapi_version_7:
break;
default:
diff --git a/src/ccapi/server/ccs_cache_collection.c b/src/ccapi/server/ccs_cache_collection.c
index 543f99c..f838c9a 100644
--- a/src/ccapi/server/ccs_cache_collection.c
+++ b/src/ccapi/server/ccs_cache_collection.c
@@ -484,6 +484,7 @@ cc_int32 ccs_cache_collection_set_default_ccache (ccs_cache_collection_t io_cac
cc_int32 err = ccNoError;
ccs_ccache_t old_default = NULL;
ccs_ccache_t new_default = NULL;
+ cc_uint32 equal = 0;
if (!io_cache_collection) { err = cci_check_error (ccErrBadParam); }
if (!in_identifier ) { err = cci_check_error (ccErrBadParam); }
@@ -494,29 +495,34 @@ cc_int32 ccs_cache_collection_set_default_ccache (ccs_cache_collection_t io_cac
}
if (!err) {
- err = ccs_ccache_list_push_front (io_cache_collection->ccaches,
- in_identifier);
- }
-
- if (!err) {
- err = ccs_ccache_notify_default_state_changed (old_default,
- io_cache_collection,
- FALSE /* no longer default */);
- }
-
- if (!err) {
- err = ccs_cache_collection_get_default_ccache (io_cache_collection,
- &new_default);
+ err = ccs_ccache_compare_identifier (old_default, in_identifier, &equal);
}
- if (!err) {
- err = ccs_ccache_notify_default_state_changed (new_default,
- io_cache_collection,
- TRUE /* now default */);
- }
- if (!err) {
- err = ccs_cache_collection_changed (io_cache_collection);
+ if (!err && !equal) {
+ err = ccs_ccache_list_push_front (io_cache_collection->ccaches,
+ in_identifier);
+
+ if (!err) {
+ err = ccs_ccache_notify_default_state_changed (old_default,
+ io_cache_collection,
+ FALSE /* no longer default */);
+ }
+
+ if (!err) {
+ err = ccs_cache_collection_get_default_ccache (io_cache_collection,
+ &new_default);
+ }
+
+ if (!err) {
+ err = ccs_ccache_notify_default_state_changed (new_default,
+ io_cache_collection,
+ TRUE /* now default */);
+ }
+
+ if (!err) {
+ err = ccs_cache_collection_changed (io_cache_collection);
+ }
}
return cci_check_error (err);
diff --git a/src/ccapi/server/ccs_callback.c b/src/ccapi/server/ccs_callback.c
index 1076d90..3088258 100644
--- a/src/ccapi/server/ccs_callback.c
+++ b/src/ccapi/server/ccs_callback.c
@@ -117,7 +117,8 @@ cc_int32 ccs_callback_release (ccs_callback_t io_callback)
err = ccs_server_client_for_pipe (io_callback->client_pipe, &client);
}
- if (!err) {
+ if (!err && client) {
+ /* if client object still has a reference to us, remove it */
err = ccs_client_remove_callback (client, io_callback);
}
diff --git a/src/ccapi/server/ccs_ccache.c b/src/ccapi/server/ccs_ccache.c
index 3eab42f..93c0c46 100644
--- a/src/ccapi/server/ccs_ccache.c
+++ b/src/ccapi/server/ccs_ccache.c
@@ -118,6 +118,8 @@ cc_int32 ccs_ccache_new (ccs_ccache_t *out_ccache,
if (!err) {
/* first cache is default */
ccache->last_default_time = (count == 0) ? now : 0;
+ cci_debug_printf ("%s ccache->last_default_time is %d.",
+ __FUNCTION__, ccache->last_default_time);
ccache->last_changed_time = now;
}
}
@@ -862,6 +864,7 @@ static cc_int32 ccs_ccache_wait_for_change (ccs_pipe_t in_client_pi
if (!err) {
if (last_wait_for_change_time < io_ccache->last_changed_time) {
+ cci_debug_printf ("%s returning immediately", __FUNCTION__);
err = cci_stream_write_time (io_reply_data, io_ccache->last_changed_time);
} else {
@@ -879,6 +882,7 @@ static cc_int32 ccs_ccache_wait_for_change (ccs_pipe_t in_client_pi
ccs_callback_array_count (io_ccache->change_callbacks));
if (!err) { callback = NULL; /* take ownership */ }
+ cci_debug_printf ("%s blocking", __FUNCTION__);
will_block = 1;
}
diff --git a/src/ccapi/server/ccs_client.c b/src/ccapi/server/ccs_client.c
index 9e8a81c..b29616f 100644
--- a/src/ccapi/server/ccs_client.c
+++ b/src/ccapi/server/ccs_client.c
@@ -121,7 +121,7 @@ cc_int32 ccs_client_remove_callback (ccs_client_t io_client,
ccs_callback_t in_callback)
{
cc_int32 err = ccNoError;
- cc_uint32 found_lock = 0;
+ cc_uint32 found_callback = 0;
if (!io_client) { err = cci_check_error (ccErrBadParam); }
@@ -134,13 +134,14 @@ cc_int32 ccs_client_remove_callback (ccs_client_t io_client,
if (callback == in_callback) {
cci_debug_printf ("%s: Removing callback reference %p.", __FUNCTION__, callback);
+ found_callback = 1;
err = ccs_callbackref_array_remove (io_client->callbacks, i);
break;
}
}
}
- if (!err && !found_lock) {
+ if (!err && !found_callback) {
cci_debug_printf ("%s: WARNING! callback not found.", __FUNCTION__);
}