TEST(SingletonTest, bug35674422) { std::string path = android::base::GetExecutableDirectory(); // libutils_test_singleton1.so contains the ANDROID_SINGLETON_STATIC_INSTANCE // definition of SingletonTestData, load it first. std::string lib = android::base::StringPrintf("%s/libutils_test_singleton1.so", path.c_str()); void* handle1 = dlopen(lib.c_str(), RTLD_NOW); ASSERT_TRUE(handle1 != nullptr) << dlerror(); // libutils_test_singleton2.so references SingletonTestData but should not // have a definition lib = android::base::StringPrintf("%s/libutils_test_singleton2.so", path.c_str()); void* handle2 = dlopen(lib.c_str(), RTLD_NOW); ASSERT_TRUE(handle2 != nullptr) << dlerror(); using has_fn_t = decltype(&singletonHasInstance); using get_fn_t = decltype(&singletonGetInstanceContents); using set_fn_t = decltype(&singletonSetInstanceContents); has_fn_t has1 = reinterpret_cast<has_fn_t>(dlsym(handle1, "singletonHasInstance")); ASSERT_TRUE(has1 != nullptr) << dlerror(); has_fn_t has2 = reinterpret_cast<has_fn_t>(dlsym(handle2, "singletonHasInstance")); ASSERT_TRUE(has2 != nullptr) << dlerror(); get_fn_t get1 = reinterpret_cast<get_fn_t>(dlsym(handle1, "singletonGetInstanceContents")); ASSERT_TRUE(get1 != nullptr) << dlerror(); get_fn_t get2 = reinterpret_cast<get_fn_t>(dlsym(handle2, "singletonGetInstanceContents")); ASSERT_TRUE(get2 != nullptr) << dlerror(); set_fn_t set1 = reinterpret_cast<set_fn_t>(dlsym(handle2, "singletonSetInstanceContents")); ASSERT_TRUE(set1 != nullptr) << dlerror(); EXPECT_FALSE(has1()); EXPECT_FALSE(has2()); set1(12345678U); EXPECT_TRUE(has1()); EXPECT_TRUE(has2()); EXPECT_EQ(12345678U, get1()); EXPECT_EQ(12345678U, get2()); }
float VoxelView::diffuseLight(const Pos3D &p) { Pos3D x(1,0,0),y(0,1,0),z(0,0,1); float nx=has1(p+x)-has1(p-x); float ny=has1(p+y)-has1(p-y); // float nz=has1(p+z)-has1(p-z); // float n=sqrt(nx*nx+ny*ny+nz*nz); /* nx/=n; ny/=n; nz/=n; */ float nf=nx-ny; /* if(n<0.7) nf=0.0; if(n>2.0) nf=0.0; */ /* nx+=has1(p+x+x)-has1(p-x-x); ny+=has1(p+y+y)-has1(p-y-y); nz+=has1(p+z+z)-has1(p-z-z); */ // f=32, a=32 for trees // f=64, a=16 for terrain float a,f; if(gDrawingTerrain) { f=(64/256.0);//32 a=(16/256.0);//32; } else { f=(32/256.0);//32 a=(32/256.0);//32; } // nz=0; // cdebug(nx<<";"<<ny<<";"<<nz); // float v=(0.5*nx-ny)*0.125+0.2; float v=nf*f+a; /* if(hasShadow(p)) // v-=0.3; v-=20; */ // v/=0xFF; // cdebug(v); return v; }