X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fporting.cpp;h=ad942b0bc32c5ba75da9d797fb8b2ad92e3a9cde;hb=58e6d25e033c76dc91aaac18fdeda92ac23fe0e1;hp=ef461242d28cad1afb37e34c889d3d9df55cfe71;hpb=34904a0744ee08d387a67619a5e2c46ce4928c12;p=oweals%2Fminetest.git diff --git a/src/porting.cpp b/src/porting.cpp index ef461242d..ad942b0bc 100644 --- a/src/porting.cpp +++ b/src/porting.cpp @@ -25,19 +25,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" -#if defined(__APPLE__) - #include - #include "CoreFoundation/CoreFoundation.h" -#elif defined(__FreeBSD__) +#if defined(__FreeBSD__) #include #include #elif defined(_WIN32) #include -#elif defined(__LINUX) - #include #endif #if !defined(_WIN32) - #include #include #include #endif @@ -140,8 +134,7 @@ void signal_handler_init(void) /* Multithreading support */ -int getNumberOfProcessors() -{ +int getNumberOfProcessors() { #if defined(_SC_NPROCESSORS_ONLN) return sysconf(_SC_NPROCESSORS_ONLN); @@ -174,8 +167,8 @@ int getNumberOfProcessors() } -bool threadBindToProcessor(threadid_t tid, int pnumber) -{ +#ifndef __ANDROID__ +bool threadBindToProcessor(threadid_t tid, int pnumber) { #if defined(_WIN32) HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, 0, tid); @@ -202,7 +195,7 @@ bool threadBindToProcessor(threadid_t tid, int pnumber) pnumber, NULL) == 0; #elif defined(_AIX) - + return bindprocessor(BINDTHREAD, (tid_t)tid, pnumber) == 0; #elif defined(__hpux) || defined(hpux) @@ -211,11 +204,11 @@ bool threadBindToProcessor(threadid_t tid, int pnumber) return pthread_processor_bind_np(PTHREAD_BIND_ADVISORY_NP, &answer, pnumber, tid) == 0; - + #elif defined(__APPLE__) struct thread_affinity_policy tapol; - + thread_port_t threadport = pthread_mach_thread_np(tid); tapol.affinity_tag = pnumber + 1; return thread_policy_set(threadport, THREAD_AFFINITY_POLICY, @@ -227,10 +220,9 @@ bool threadBindToProcessor(threadid_t tid, int pnumber) #endif } +#endif - -bool threadSetPriority(threadid_t tid, int prio) -{ +bool threadSetPriority(threadid_t tid, int prio) { #if defined(_WIN32) HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, 0, tid); @@ -241,21 +233,21 @@ bool threadSetPriority(threadid_t tid, int prio) CloseHandle(hThread); return success; - + #else struct sched_param sparam; int policy; - + if (pthread_getschedparam(tid, &policy, &sparam) != 0) return false; - + int min = sched_get_priority_min(policy); int max = sched_get_priority_max(policy); sparam.sched_priority = min + prio * (max - min) / THREAD_PRIORITY_HIGHEST; return pthread_setschedparam(tid, policy, &sparam) == 0; - + #endif } @@ -467,9 +459,15 @@ void initializePaths() { char buf[BUFSIZ]; memset(buf, 0, BUFSIZ); - assert(readlink("/proc/self/exe", buf, BUFSIZ-1) != -1); - pathRemoveFile(buf, '/'); - bindir = buf; + if (readlink("/proc/self/exe", buf, BUFSIZ-1) == -1) { + errorstream << "Unable to read bindir "<< std::endl; +#ifndef __ANDROID__ + assert("Unable to read bindir" == 0); +#endif + } else { + pathRemoveFile(buf, '/'); + bindir = buf; + } } // Find share directory from these. @@ -481,6 +479,9 @@ void initializePaths() trylist.push_back( bindir + DIR_DELIM + ".." + DIR_DELIM + "share" + DIR_DELIM + PROJECT_NAME); trylist.push_back(bindir + DIR_DELIM + ".."); +#ifdef __ANDROID__ + trylist.push_back(DIR_DELIM "sdcard" DIR_DELIM PROJECT_NAME); +#endif for(std::list::const_iterator i = trylist.begin(); i != trylist.end(); i++) @@ -499,8 +500,11 @@ void initializePaths() path_share = trypath; break; } - +#ifndef __ANDROID__ path_user = std::string(getenv("HOME")) + DIR_DELIM + "." + PROJECT_NAME; +#else + path_user = std::string(DIR_DELIM "sdcard" DIR_DELIM PROJECT_NAME DIR_DELIM); +#endif /* OS X @@ -539,20 +543,18 @@ void initializePaths() static irr::IrrlichtDevice* device; -void initIrrlicht(irr::IrrlichtDevice * _device) -{ +void initIrrlicht(irr::IrrlichtDevice * _device) { device = _device; } #ifndef SERVER -v2u32 getWindowSize() -{ +v2u32 getWindowSize() { return device->getVideoDriver()->getScreenSize(); } +#ifndef __ANDROID__ -float getDisplayDensity() -{ +float getDisplayDensity() { float gui_scaling = g_settings->getFloat("gui_scaling"); // using Y here feels like a bug, this needs to be discussed later! if (getWindowSize().Y <= 800) { @@ -565,8 +567,7 @@ float getDisplayDensity() return (4.0/3.0) * gui_scaling; } -v2u32 getDisplaySize() -{ +v2u32 getDisplaySize() { IrrlichtDevice *nulldevice = createDevice(video::EDT_NULL); core::dimension2d deskres = nulldevice->getVideoModeList()->getDesktopResolution(); @@ -575,93 +576,6 @@ v2u32 getDisplaySize() return deskres; } #endif - -#ifdef SERVER -#ifdef _WIN32 -void daemonize() -{ - errorstream << "daemonize not implemented on windows" << std::endl; -} -#else // assume posix like os - -static std::string get_pidfile_path() -{ - // make it static to make sure it won't change after first call to this fct - static std::string path_pidfile = ""; - static bool initialized = false; - - if (initialized) - { - return path_pidfile; - } - - g_settings->getNoEx("pidfile", path_pidfile); - - if (path_pidfile == "") { -#ifdef RUN_IN_PLACE - path_pidfile = "pidfile.pid"; -#else - path_pidfile = "/var/run/minetest.pid"; -#endif - } - initialized = true; - return path_pidfile; -} - - -void daemonize() -{ - std::string path_pidfile = get_pidfile_path(); - - FILE* pidfile = fopen(path_pidfile.c_str(),"r"); - - if (pidfile) { - int pid = 0; - if (fscanf(pidfile, "%i", &pid) == 1) { - if (kill(pid, 0) == 0) { - errorstream << - "Minetestserver is already running with pid: " - << pid << std::endl; - exit(-1); - } - } else { - errorstream << "Pidfile \"" << path_pidfile << "\" " - "already exists but content is invalid" << std::endl << - "Delete it manually if you're sure minetest isn't running!" - << std::endl; - exit(-1); - } - fclose(pidfile); - pidfile = 0; - } - - pid_t pid = fork(); - - if (pid > 0) { - pidfile = fopen(path_pidfile.c_str(),"w+"); - if (pidfile) { - fprintf(pidfile,"%i",pid); - fclose(pidfile); - } else { - errorstream << "Failed to create pidfile: \"" << path_pidfile - << "\""<< std::endl; - } - exit (0); - } else if (pid == 0) { - fclose(stdout); - fclose(stderr); - return; - } - - errorstream << "Failed to daemonize minetest, exiting" << std::endl; - exit(-1); -} - -void cleanup_pid() -{ - unlink(get_pidfile_path().c_str()); -} -#endif #endif } //namespace porting