]> granicus.if.org Git - xz/commitdiff
Fix the detection of installed RAM on QNX.
authorLasse Collin <lasse.collin@tukaani.org>
Sun, 29 Mar 2015 19:13:48 +0000 (22:13 +0300)
committerLasse Collin <lasse.collin@tukaani.org>
Sun, 29 Mar 2015 19:13:48 +0000 (22:13 +0300)
The earlier version compiled but didn't actually work
since sysconf(_SC_PHYS_PAGES) always fails (or so I was told).

Thanks to Ole André Vadla Ravnås for the patch and testing.

m4/tuklib_physmem.m4
src/common/tuklib_physmem.c

index ea02208fd3eddf9ecb63031c3fa09d368f3270c2..8a57ca29876b4f9a32631ec139bcfda9dbdbc5a0 100644 (file)
@@ -10,8 +10,8 @@
 #
 #   Supported methods:
 #
-#     - Windows (including Cygwin), OS/2, DJGPP (DOS), and OpenVMS have
-#       operating-system specific functions.
+#     - Windows (including Cygwin), OS/2, DJGPP (DOS), OpenVMS, AROS,
+#       and QNX have operating-system specific functions.
 #
 #     - AIX has _system_configuration.physmem.
 #
@@ -54,7 +54,7 @@ AC_CACHE_CHECK([how to detect the amount of physical memory],
 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
 #if defined(_WIN32) || defined(__CYGWIN__) || defined(__OS2__) \
                || defined(__DJGPP__) || defined(__VMS) \
-               || defined(AMIGA) || defined(__AROS__)
+               || defined(AMIGA) || defined(__AROS__) || defined(__QNX__)
 int main(void) { return 0; }
 #else
 compile error
index 3cc7d12a171f46773ec6508016cd512b139134ab..cd2437d8c7d59788a62f2764e8e4a2fb3cba70df 100644 (file)
 #      define __USE_INLINE__
 #      include <proto/exec.h>
 
-// AIX
+#elif defined(__QNX__)
+#      include <sys/syspage.h>
+#      include <string.h>
+
 #elif defined(TUKLIB_PHYSMEM_AIX)
 #      include <sys/systemcfg.h>
 
@@ -126,6 +129,15 @@ tuklib_physmem(void)
 #elif defined(AMIGA) || defined(__AROS__)
        ret = AvailMem(MEMF_TOTAL);
 
+#elif defined(__QNX__)
+       const struct asinfo_entry *entries = SYSPAGE_ENTRY(asinfo);
+       size_t count = SYSPAGE_ENTRY_SIZE(asinfo) / sizeof(struct asinfo_entry);
+       const char *strings = SYSPAGE_ENTRY(strings)->data;
+
+       for (size_t i = 0; i < count; ++i)
+               if (strcmp(strings + entries[i].name, "ram") == 0)
+                       ret += entries[i].end - entries[i].start + 1;
+
 #elif defined(TUKLIB_PHYSMEM_AIX)
        ret = _system_configuration.physmem;