int (*getnfiles) (struct ubik_dbase * adbase); /*!< find out number of files */
short readers; /*!< number of current read transactions */
struct ubik_version cachedVersion; /*!< version of caller's cached data */
+#ifdef UKERNEL
+ struct afs_lock cache_lock;
+#else
+ struct Lock cache_lock; /*!< protects cached application data */
+#endif
#ifdef AFS_PTHREAD_ENV
pthread_cond_t version_cond; /*!< condition variable to manage changes to version */
pthread_cond_t flags_cond; /*!< condition variable to manage changes to flags */
#endif
};
+/**
+ * ubik_CheckCache callback function.
+ *
+ * @param[in] atrans ubik transaction
+ * @param[in] rock rock passed to ubik_CheckCache
+ *
+ * @return operation status
+ * @retval 0 cache was read properly
+ */
+typedef int (*ubik_updatecache_func) (struct ubik_trans *atrans, void *rock);
+
/*! \name procedures for automatically authenticating ubik connections */
extern int (*ubik_CRXSecurityProc) (void *, struct rx_securityClass **,
afs_int32 *);
#define TRSETLOCK 8 /*!< SetLock is using trans */
#define TRSTALE 16 /*!< udisk_end during getLock */
#endif /* UBIK_PAUSE */
+#define TRCACHELOCKED 32 /*!< this trans has locked dbase->cache_lock
+ * (meaning, this trans has called
+ * ubik_CheckCache at some point */
/*\}*/
/*! \name ubik_lock flags */
register struct ubik_version *aversion);
extern int ubik_GetVersion(register struct ubik_trans *atrans,
register struct ubik_version *avers);
-extern int ubik_CacheUpdate(register struct ubik_trans *atrans);
+extern int ubik_CheckCache(struct ubik_trans *atrans,
+ ubik_updatecache_func check,
+ void *rock);
/*\}*/
/*! \name ubikclient.c */