Revision: 71899 http://sourceforge.net/p/brlcad/code/71899 Author: brlcad Date: 2018-09-28 18:54:04 +0000 (Fri, 28 Sep 2018) Log Message: ----------- still needs less bomb, but rework the logic flow for falling back to prep when there's something goes wrong.
Modified Paths: -------------- brlcad/trunk/src/librt/cache.c Modified: brlcad/trunk/src/librt/cache.c =================================================================== --- brlcad/trunk/src/librt/cache.c 2018-09-28 18:50:03 UTC (rev 71898) +++ brlcad/trunk/src/librt/cache.c 2018-09-28 18:54:04 UTC (rev 71899) @@ -253,6 +253,8 @@ { struct bu_external data_external = BU_EXTERNAL_INIT_ZERO; size_t version = (size_t)-1; + struct bu_external raw_external; + struct db5_raw_internal raw_internal; cache_check(cache); RT_CK_DIR(cache_dir); @@ -264,48 +266,44 @@ if (cache_dir->d_major_type != DB5_MAJORTYPE_BINARY_MIME || cache_dir->d_minor_type != 0) bu_bomb("invalid object type"); - { - struct bu_external raw_external; - struct db5_raw_internal raw_internal; + if (db_get_external(&raw_external, cache_dir, cache->dbip)) + bu_bomb("db_get_external() failed"); - if (db_get_external(&raw_external, cache_dir, cache->dbip)) - bu_bomb("db_get_external() failed"); + if (db5_get_raw_internal_ptr(&raw_internal, raw_external.ext_buf) == NULL) + bu_bomb("rt_db_external5_to_internal5() failed"); - if (db5_get_raw_internal_ptr(&raw_internal, raw_external.ext_buf) == NULL) - bu_bomb("rt_db_external5_to_internal5() failed"); + { + struct bu_attribute_value_set attributes; + const char *version_str; - { - struct bu_attribute_value_set attributes; - const char *version_str; + if (db5_import_attributes(&attributes, &raw_internal.attributes) < 0) + bu_bomb("db5_import_attributes() failed"); - if (db5_import_attributes(&attributes, &raw_internal.attributes) < 0) - bu_bomb("db5_import_attributes() failed"); + if (bu_strcmp(cache_mime_type, bu_avs_get(&attributes, "mime_type"))) + bu_bomb("invalid MIME type"); - if (bu_strcmp(cache_mime_type, bu_avs_get(&attributes, "mime_type"))) - bu_bomb("invalid MIME type"); + version_str = bu_avs_get(&attributes, "rt_cache::version"); + if (!version_str) + bu_bomb("missing version"); - version_str = bu_avs_get(&attributes, "rt_cache::version"); - if (!version_str) - bu_bomb("missing version"); + { + const char *endptr; - { - const char *endptr; + errno = 0; + version = strtol(version_str, (char **)&endptr, 10); - errno = 0; - version = strtol(version_str, (char **)&endptr, 10); - - if ((version == 0 && errno) || endptr == version_str || *endptr) - bu_bomb("invalid version"); - } - - bu_avs_free(&attributes); + if ((version == 0 && errno) || endptr == version_str || *endptr) + bu_bomb("invalid version"); } - uncompress_external(&raw_internal.body, &data_external); - bu_free_external(&raw_external); + bu_avs_free(&attributes); } + uncompress_external(&raw_internal.body, &data_external); + bu_free_external(&raw_external); + if (rt_obj_prep_serialize(stp, internal, &data_external, &version)) { + /* failed to serialize */ bu_free_external(&data_external); return 0; } @@ -369,7 +367,8 @@ rt_cache_prep(struct rt_cache *cache, struct soltab *stp, struct rt_db_internal *internal) { - char name[37]; + int ret = 0; /* success */ + char name[37] = {0}; struct directory *dir = RT_DIR_NULL; cache_check(cache); @@ -376,22 +375,22 @@ RT_CK_SOLTAB(stp); RT_CK_DB_INTERNAL(internal); + if (!cache) + return rt_obj_prep(stp, internal, stp->st_rtip); + cache_generate_name(name, stp); - if (cache) - dir = db_lookup(cache->dbip, name, 0); + dir = db_lookup(cache->dbip, name, 0); - if (dir != RT_DIR_NULL) { - if (!cache_try_load(cache, dir, stp, internal)) { - bu_bomb("cache_try_load() failed"); - } - } else { + if (!dir || cache_try_load(cache, dir, stp, internal) == 0) { char type = 0; - if (rt_obj_prep(stp, internal, stp->st_rtip)) - return 1; + /* not in cache so run prep and, if successful, cache it */ - if (cache && OBJ[stp->st_id].ft_prep_serialize) { - if (!(dir = db_diradd(cache->dbip, name, RT_DIR_PHONY_ADDR, 0, RT_DIR_NON_GEOM, (void *)&type))) { + ret = rt_obj_prep(stp, internal, stp->st_rtip); + + if (ret == 0 && OBJ[stp->st_id].ft_prep_serialize) { + dir = db_diradd(cache->dbip, name, RT_DIR_PHONY_ADDR, 0, RT_DIR_NON_GEOM, (void *)&type); + if (!dir) { bu_bomb("db_diradd() failed"); } @@ -399,7 +398,7 @@ } } - return 0; + return ret; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ BRL-CAD Source Commits mailing list brlcad-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits