void EditorInputCenter::put_object() { auto tileselect = &(Editor::current()->tileselect); if (tileselect->object[0] == '#') { if (edited_path && tileselect->object == "#node") { if (edited_path->is_valid() && last_node_marker) { add_path_node(); } } return; } GameObjectPtr game_object; try { game_object = ObjectFactory::instance().create(tileselect->object, sector_pos, LEFT); } catch(const std::exception& e) { log_warning << "Error creating object " << tileselect->object << ": " << e.what() << std::endl; return; } if (game_object == NULL) throw std::runtime_error("Creating " + tileselect->object + " object failed."); auto mo = dynamic_cast<MovingObject*> (game_object.get()); if (!mo) { Editor::current()->layerselect.add_layer(game_object.get()); } auto wo = dynamic_cast<worldmap_editor::WorldmapObject*> (game_object.get()); if (wo) { wo->move_to(wo->get_pos() / 32); } try { Editor::current()->currentsector->add_object(game_object); } catch(const std::exception& e) { log_warning << "Error adding object " << tileselect->object << ": " << e.what() << std::endl; return; } }
/** * getpath() - Finds the path from the topology between src and dest * @src: Source. This is the master from which the request originates * @dest: Destination. This is the slave to which we're trying to reach * * Function returns: next_pnode_id. The higher 16 bits of the next_pnode_id * represent the src id of the next node on path. The lower 16 bits of the * next_pnode_id represent the "index", which is the next entry in the array * of pnodes for that node to fill in clk and bw values. This is created using * CREATE_PNODE_ID. The return value is stored in ret_pnode, and this is added * to the list of path nodes. * * This function recursively finds the path by updating the src to the * closest possible node to dest. */ static int getpath(int src, int dest) { int pnode_num = -1, i; struct msm_bus_fabnodeinfo *fabnodeinfo; struct msm_bus_fabric_device *fabdev; int next_pnode_id = -1; struct msm_bus_inode_info *info = NULL; int _src = src/FABRIC_ID_KEY; int _dst = dest/FABRIC_ID_KEY; int ret_pnode = -1; int fabid = GET_FABID(src); /* Find the location of fabric for the src */ MSM_BUS_DBG("%d --> %d\n", src, dest); fabdev = msm_bus_get_fabric_device(fabid); if (!fabdev) { MSM_BUS_WARN("Fabric Not yet registered. Try again\n"); return -ENXIO; } /* Are we there yet? */ if (src == dest) { info = fabdev->algo->find_node(fabdev, src); if (ZERO_OR_NULL_PTR(info)) { MSM_BUS_ERR("Node %d not found\n", dest); return -ENXIO; } for (i = 0; i <= info->num_pnodes; i++) { if (info->pnode[i].next == -2) { MSM_BUS_DBG("src = dst Reusing pnode for" " info: %d at index: %d\n", info->node_info->priv_id, i); next_pnode_id = CREATE_PNODE_ID(src, i); info->pnode[i].clk[DUAL_CTX] = 0; info->pnode[i].bw[DUAL_CTX] = 0; info->pnode[i].next = next_pnode_id; MSM_BUS_DBG("returning: %d, %d\n", GET_NODE (next_pnode_id), GET_INDEX(next_pnode_id)); return next_pnode_id; } } next_pnode_id = CREATE_PNODE_ID(src, (info->num_pnodes + 1)); pnode_num = add_path_node(info, next_pnode_id); if (pnode_num < 0) { MSM_BUS_ERR("Error adding path node\n"); return -ENXIO; } MSM_BUS_DBG("returning: %d, %d\n", GET_NODE(next_pnode_id), GET_INDEX(next_pnode_id)); return next_pnode_id; } else if (_src == _dst) { /* * src and dest belong to same fabric, find the destination * from the radix tree */ info = fabdev->algo->find_node(fabdev, dest); if (ZERO_OR_NULL_PTR(info)) { MSM_BUS_ERR("Node %d not found\n", dest); return -ENXIO; } ret_pnode = getpath(info->node_info->priv_id, dest); next_pnode_id = ret_pnode; } else { /* find the dest fabric */ int trynextgw = true; struct list_head *gateways = fabdev->algo->get_gw_list(fabdev); list_for_each_entry(fabnodeinfo, gateways, list) { /* see if the destination is at a connected fabric */ if (_dst == (fabnodeinfo->info->node_info->priv_id / FABRIC_ID_KEY)) { /* Found the fab on which the device exists */ info = fabnodeinfo->info; trynextgw = false; ret_pnode = getpath(info->node_info->priv_id, dest); pnode_num = add_path_node(info, ret_pnode); if (pnode_num < 0) { MSM_BUS_ERR("Error adding path node\n"); return -ENXIO; } next_pnode_id = CREATE_PNODE_ID( info->node_info->priv_id, pnode_num); break; } } /* find the gateway */ if (trynextgw) { gateways = fabdev->algo->get_gw_list(fabdev); list_for_each_entry(fabnodeinfo, gateways, list) { struct msm_bus_fabric_device *gwfab = msm_bus_get_fabric_device(fabnodeinfo-> info->node_info->priv_id); if (!gwfab->visited) { MSM_BUS_DBG("VISITED ID: %d\n", gwfab->id); gwfab->visited = true; info = fabnodeinfo->info; ret_pnode = getpath(info-> node_info->priv_id, dest); pnode_num = add_path_node(info, ret_pnode); if (pnode_num < 0) { MSM_BUS_ERR("Malloc failure in" " adding path node\n"); return -ENXIO; } next_pnode_id = CREATE_PNODE_ID( info->node_info->priv_id, pnode_num); break; } } if (next_pnode_id < 0) return -ENXIO; } } if (!IS_NODE(src)) { MSM_BUS_DBG("Returning next_pnode_id:%d[%d]\n", GET_NODE( next_pnode_id), GET_INDEX(next_pnode_id)); return next_pnode_id; } info = fabdev->algo->find_node(fabdev, src); if (!info) { MSM_BUS_ERR("Node info not found.\n"); return -ENXIO; } pnode_num = add_path_node(info, next_pnode_id); MSM_BUS_DBG(" Last: %d[%d] = (%d, %d)\n", src, info->num_pnodes, GET_NODE(next_pnode_id), GET_INDEX(next_pnode_id)); MSM_BUS_DBG("returning: %d, %d\n", src, pnode_num); return CREATE_PNODE_ID(src, pnode_num); }