static void android_media_AudioRecord_release(JNIEnv *env, jobject thiz) { sp<AudioRecord> lpRecorder = setAudioRecord(env, thiz, 0); if (lpRecorder == NULL) { return; } ALOGV("About to delete lpRecorder: %x\n", (int)lpRecorder.get()); lpRecorder->stop(); audiorecord_callback_cookie *lpCookie = (audiorecord_callback_cookie *)env->GetIntField( thiz, javaAudioRecordFields.nativeCallbackCookie); // reset the native resources in the Java object so any attempt to access // them after a call to release fails. env->SetIntField(thiz, javaAudioRecordFields.nativeCallbackCookie, 0); // delete the callback information if (lpCookie) { Mutex::Autolock l(sLock); ALOGV("deleting lpCookie: %x\n", (int)lpCookie); while (lpCookie->busy) { if (lpCookie->cond.waitRelative(sLock, milliseconds(CALLBACK_COND_WAIT_TIMEOUT_MS)) != NO_ERROR) { break; } } sAudioRecordCallBackCookies.remove(lpCookie); env->DeleteGlobalRef(lpCookie->audioRecord_class); env->DeleteGlobalRef(lpCookie->audioRecord_ref); delete lpCookie; } }
void testSortedVector() { printf("Test Firebird::SortedVector: "); SortedVector<int, 100> v; int i; for (i = 0; i < 100; i++) v.add(99 - i); for (i = 0; i < 50; i++) v.remove(0); bool passed = true; for (i = 50; i < 100; i++) if (v[i - 50] != i) passed = false; printf(passed ? "PASSED\n" : "FAILED\n"); }
void ZoneComponent::destroyObjectFromWorld(SceneObject* sceneObject, bool sendSelfDestroy) { ManagedReference<SceneObject*> par = sceneObject->getParent(); sceneObject->broadcastDestroy(sceneObject, sendSelfDestroy); ManagedReference<Zone*> rootZone = sceneObject->getZone(); ManagedReference<Zone*> zone = sceneObject->getLocalZone(); if (par != NULL) { uint64 parentID = sceneObject->getParentID(); par->removeObject(sceneObject, NULL, false); if (par->isCellObject()) { ManagedReference<BuildingObject*> build = cast<BuildingObject*>(par->getParent().get().get()); if (build != NULL) { CreatureObject* creature = cast<CreatureObject*>(sceneObject); if (creature != NULL) build->onExit(creature, parentID); } } sceneObject->notifyObservers(ObserverEventType::OBJECTREMOVEDFROMZONE, sceneObject, 0); } else if (zone != NULL) { zone->removeObject(sceneObject, NULL, false); } if (rootZone != NULL) { Locker locker(rootZone); if (!sceneObject->isActiveArea()) rootZone->remove(sceneObject); rootZone->dropSceneObject(sceneObject); SharedBuildingObjectTemplate* objtemplate = dynamic_cast<SharedBuildingObjectTemplate*>(sceneObject->getObjectTemplate()); if (objtemplate != NULL) { String modFile = objtemplate->getTerrainModificationFile(); if (!modFile.isEmpty()) { rootZone->getPlanetManager()->getTerrainManager()->removeTerrainModification(sceneObject->getObjectID()); } } locker.release(); SortedVector<ManagedReference<QuadTreeEntry*> > closeSceneObjects; CloseObjectsVector* closeobjects = (CloseObjectsVector*) sceneObject->getCloseObjects(); if (closeobjects != NULL) { try { closeobjects->safeCopyTo(closeSceneObjects); while (closeSceneObjects.size() > 0) { ManagedReference<QuadTreeEntry*> obj = closeSceneObjects.get(0); if (obj != NULL && obj != sceneObject && obj->getCloseObjects() != NULL) obj->removeInRangeObject(sceneObject); sceneObject->removeInRangeObject((int) 0); closeSceneObjects.remove((int) 0); } closeobjects->removeAll(); } catch (...) { } } else { SortedVector<ManagedReference<QuadTreeEntry*> > closeSceneObjects; sceneObject->info("Null closeobjects vector in ZoneComponent::destroyObjectFromWorld", true); rootZone->getInRangeObjects(sceneObject->getPositionX(), sceneObject->getPositionY(), 512, &closeSceneObjects, false); for (int i = 0; i < closeSceneObjects.size(); ++i) { QuadTreeEntry* obj = closeSceneObjects.get(i); if (obj != sceneObject && obj->getCloseObjects() != NULL) obj->removeInRangeObject(sceneObject); } } // rootZone->dropSceneObject(sceneObject); // locker.release(); Vector<ManagedReference<ActiveArea*> >* activeAreas = sceneObject->getActiveAreas(); while (activeAreas->size() > 0) { Locker _alocker(sceneObject->getContainerLock()); ManagedReference<ActiveArea*> area = activeAreas->get(0); activeAreas->remove(0); _alocker.release(); area->enqueueExitEvent(sceneObject); } } }
Vector<WorldCoordinates>* PathFinderManager::findPathFromWorldToWorld(const WorldCoordinates& pointA, Vector<WorldCoordinates>& endPoints, Zone* zone, bool allowPartial) { Vector<WorldCoordinates>* finalpath = new Vector<WorldCoordinates>(); float finalLengthSq = FLT_MAX; #ifdef PROFILE_PATHING Timer t; t.start(); #endif for (const WorldCoordinates& pointB : endPoints) { const Vector3& startTemp = pointA.getPoint(); const Vector3& targetTemp = pointB.getPoint(); SortedVector<ManagedReference<NavArea*> > areas; Vector3 mid = startTemp + ((targetTemp-startTemp) * 0.5f); zone->getInRangeNavMeshes(mid.getX(), mid.getY(), &areas, true); SortedVector<NavCollision*> collisions; getNavMeshCollisions(&collisions, &areas, pointA.getWorldPosition(), pointB.getWorldPosition()); // Collisions are sorted by distance from the start of the line. This is done so that we can chain our path from // one navmesh to another if a path spans multiple meshes. Vector<WorldCoordinates> *path = new Vector<WorldCoordinates>(); float len = 0.0f; try { int collisionSize = collisions.size(); if (collisionSize == 1) { // we're entering/exiting a navmesh NavCollision* collision = collisions.get(0); NavArea *area = collision->getNavArea(); Vector3 position = collision->getPosition(); position.setZ(CollisionManager::getWorldFloorCollision(position.getX(), position.getY(), zone, true)); if (area->containsPoint(startTemp.getX(), startTemp.getY())) { if (!getRecastPath(startTemp, position, area, path, len, allowPartial)) { // exiting navmesh delete collision; if (path != NULL) delete path; continue; } path->add(pointB); } else { path->add(pointA); if (!getRecastPath(position, targetTemp, area, path, len, allowPartial)) { // entering navmesh delete collision; if (path != NULL) delete path; continue; } } if (len > 0 && len < finalLengthSq) { if (finalpath) delete finalpath; finalLengthSq = len; finalpath = path; path = NULL; } } else if (collisionSize == 0) { // we're already inside a navmesh (or there are no navmeshes around) for (int i = 0; i < areas.size(); i++) { if (!getRecastPath(startTemp, targetTemp, areas.get(i), path, len, allowPartial)) { continue; } if (len > 0 && len < finalLengthSq) { if (finalpath) delete finalpath; finalLengthSq = len; finalpath = path; path = new Vector<WorldCoordinates>(); } } } else if (collisionSize == 2) { // we're crossing over a mesh or dealing with multiple meshes NavCollision* collision1 = collisions.get(0); NavArea *area1 = collision1->getNavArea(); NavCollision* collision2 = collisions.get(1); NavArea *area2 = collision2->getNavArea(); if (area1 == area2) { // crossing same mesh path->add(pointA); Vector3 position1 = collision1->getPosition(); position1.setZ(CollisionManager::getWorldFloorCollision(position1.getX(), position1.getY(), zone, false)); Vector3 position2 = collision2->getPosition(); position2.setZ(CollisionManager::getWorldFloorCollision(position2.getX(), position2.getY(), zone, false)); if (!getRecastPath(position1, position2, area1, path, len, allowPartial)) { delete collision1; delete collision2; if (path != NULL) delete path; continue; } path->add(pointB); if (len > 0 && len < finalLengthSq) { if (finalpath) delete finalpath; finalLengthSq = len; finalpath = path; path = NULL; } } else { // TODO: handle multiple meshes } } else { // TODO: handle multiple meshes } } catch (...) { error("Unhandled pathing exception"); for (int i=collisions.size()-1; i>=0; i--) { NavCollision *collision = collisions.remove(i); delete collision; } delete path; path = NULL; } for (int i=collisions.size()-1; i>=0; i--) { NavCollision *collision = collisions.remove(i); delete collision; } if (path != NULL) delete path; } if (finalpath && finalpath->size() < 2) { // path could not be evaluated, just return the start/end position finalpath->removeAll(); finalpath->add(pointA); finalpath->add(endPoints.get(0)); } #ifdef PROFILE_PATHING t.stop(); totalTime.add(t.getElapsedTime()); info("Spent " + String::valueOf(totalTime.get()) + " in recast", true); #endif return finalpath; }