forb_uuid_generate((forb_uuid_t*)server_id->uuid);
}
+/**
+ * Checks whether the @a object is stale. Stale object is an object
+ * reference whose server cannot be contacted to handle requests.
+ *
+ * @param object Object reference to check.
+ *
+ * @return True if the object is stale, false otherwise.
+ */
+bool forb_object_is_stale(forb_object object)
+{
+ forb_orb remote_orb;
+ struct forb_env env;
+ bool stale = true;
+
+ remote_orb = forb_get_orb_of(object);
+ if (!remote_orb) { /* This shohuld never happen */
+ goto err;
+ }
+ /* TODO: Check not only the ORB, but also whether the object
+ * is still registered with the remote orb. */
+ forb_orb_is_alive(remote_orb, &env);
+ if (env.major == FORB_EX_COMM_FAILURE) {
+ /* Orb is not alive */
+ stale = true;
+ } else {
+ if (forb_exception_occured(&env)) {
+ ul_logerr("%s: unexpected exception: %s\n", __FUNCTION__, forb_strerror(&env));
+ }
+ stale = false;
+ }
+
+ forb_object_release(remote_orb);
+err:
+ return stale;
+}
+
/**
*
*
int fd, ret = 0;
char str[100];
forb_object object;
- forb_orb remote_orb;
- CORBA_Environment env;
fd = open(fn, O_RDWR);
if (fd < 0) {
/* We are done for now */
goto unlock_err;
}
- remote_orb = forb_get_orb_of(object);
- if (!remote_orb) { /* This shohuld never happen */
- ret = -1;
- goto object_release_err;
- }
- forb_orb_is_alive(remote_orb, &env);
- if (env.major == FORB_EX_COMM_FAILURE) {
+ if (forb_object_is_stale(object)) {
/* Orb is not alive */
- rewrite_regref(fd, objref);
+ ret = rewrite_regref(fd, objref);
} else {
- if (forb_exception_occured(&env)) {
- ul_logerr("%s: unexpected exception: %s\n", __FUNCTION__, forb_strerror(&env));
- }
/* Reference's FORB is alive :-( */
ret = 1;
}
- forb_object_release(remote_orb);
-object_release_err:
forb_object_release(object);
unlock_err:
lockf(fd, F_ULOCK, 0);
str[ret] = '\0';
object = forb_string_to_object(orb, str);
close(fd);
+
+ if (forb_object_is_stale(object)) {
+ forb_object_release(object);
+ object = NULL;
+ }
return object;
}