소스 검색

LibC+Kernel: Start implementing sysconf

For now, only the non-standard _SC_NPROCESSORS_CONF and
_SC_NPROCESSORS_ONLN are implemented.

Use them to make ninja pick a better default -j value.
While here, make the ninja package script not fail if
no other port has been built yet.
Nico Weber 5 년 전
부모
커밋
4eb967b5eb
9개의 변경된 파일34개의 추가작업 그리고 14개의 파일을 삭제
  1. 2 1
      Kernel/API/Syscall.h
  2. 2 0
      Kernel/Arch/i386/CPU.h
  3. 11 0
      Kernel/Process.cpp
  4. 1 0
      Kernel/Process.h
  5. 5 0
      Kernel/UnixTypes.h
  6. 6 0
      Libraries/LibC/unistd.cpp
  7. 6 0
      Libraries/LibC/unistd.h
  8. 1 0
      Ports/ninja/package.sh
  9. 0 13
      Ports/ninja/patches/nproc.patch

+ 2 - 1
Kernel/API/Syscall.h

@@ -191,7 +191,8 @@ namespace Kernel {
     __ENUMERATE_SYSCALL(ptrace)             \
     __ENUMERATE_SYSCALL(ptrace)             \
     __ENUMERATE_SYSCALL(minherit)           \
     __ENUMERATE_SYSCALL(minherit)           \
     __ENUMERATE_SYSCALL(sendfd)             \
     __ENUMERATE_SYSCALL(sendfd)             \
-    __ENUMERATE_SYSCALL(recvfd)
+    __ENUMERATE_SYSCALL(recvfd)             \
+    __ENUMERATE_SYSCALL(sysconf)
 
 
 namespace Syscall {
 namespace Syscall {
 
 

+ 2 - 0
Kernel/Arch/i386/CPU.h

@@ -744,6 +744,8 @@ public:
 
 
     static Processor& by_id(u32 cpu);
     static Processor& by_id(u32 cpu);
 
 
+    static size_t processor_count() { return processors().size(); }
+
     template<typename Callback>
     template<typename Callback>
     static inline IterationDecision for_each(Callback callback)
     static inline IterationDecision for_each(Callback callback)
     {
     {

+ 11 - 0
Kernel/Process.cpp

@@ -5308,4 +5308,15 @@ int Process::sys$recvfd(int sockfd)
     m_fds[new_fd].set(*received_descriptor_or_error.value(), 0);
     m_fds[new_fd].set(*received_descriptor_or_error.value(), 0);
     return new_fd;
     return new_fd;
 }
 }
+
+long Process::sys$sysconf(int name)
+{
+    switch (name) {
+    case _SC_NPROCESSORS_CONF:
+    case _SC_NPROCESSORS_ONLN:
+        return Processor::processor_count();
+    default:
+        return -EINVAL;
+    }
+}
 }
 }

+ 1 - 0
Kernel/Process.h

@@ -327,6 +327,7 @@ public:
     int sys$ptrace(const Syscall::SC_ptrace_params*);
     int sys$ptrace(const Syscall::SC_ptrace_params*);
     int sys$sendfd(int sockfd, int fd);
     int sys$sendfd(int sockfd, int fd);
     int sys$recvfd(int sockfd);
     int sys$recvfd(int sockfd);
+    long sys$sysconf(int name);
 
 
     template<bool sockname, typename Params>
     template<bool sockname, typename Params>
     int get_sock_or_peer_name(const Params&);
     int get_sock_or_peer_name(const Params&);

+ 5 - 0
Kernel/UnixTypes.h

@@ -55,6 +55,11 @@
 #define MS_RDONLY (1 << 4)
 #define MS_RDONLY (1 << 4)
 #define MS_REMOUNT (1 << 5)
 #define MS_REMOUNT (1 << 5)
 
 
+enum {
+    _SC_NPROCESSORS_CONF,
+    _SC_NPROCESSORS_ONLN,
+};
+
 #define PERF_EVENT_MALLOC 1
 #define PERF_EVENT_MALLOC 1
 #define PERF_EVENT_FREE 2
 #define PERF_EVENT_FREE 2
 
 

+ 6 - 0
Libraries/LibC/unistd.cpp

@@ -722,4 +722,10 @@ char* getpass(const char* prompt)
     dbg() << "FIXME: getpass(\"" << prompt << "\")";
     dbg() << "FIXME: getpass(\"" << prompt << "\")";
     ASSERT_NOT_REACHED();
     ASSERT_NOT_REACHED();
 }
 }
+
+long sysconf(int name)
+{
+    int rc = syscall(SC_sysconf, name);
+    __RETURN_WITH_ERRNO(rc, rc, -1);
+}
 }
 }

+ 6 - 0
Libraries/LibC/unistd.h

@@ -172,4 +172,10 @@ enum {
 #define _POSIX_PRIORITY_SCHEDULING
 #define _POSIX_PRIORITY_SCHEDULING
 #define _POSIX_VDISABLE '\0'
 #define _POSIX_VDISABLE '\0'
 
 
+enum {
+    _SC_NPROCESSORS_CONF,
+    _SC_NPROCESSORS_ONLN,
+};
+long sysconf(int name);
+
 __END_DECLS
 __END_DECLS

+ 1 - 0
Ports/ninja/package.sh

@@ -13,5 +13,6 @@ build() {
 }
 }
 
 
 install() {
 install() {
+    mkdir -p "${SERENITY_ROOT}/Build/Root/usr/local/bin"
     cp "${workdir}/ninja" "${SERENITY_ROOT}/Build/Root/usr/local/bin/ninja"
     cp "${workdir}/ninja" "${SERENITY_ROOT}/Build/Root/usr/local/bin/ninja"
 }
 }

+ 0 - 13
Ports/ninja/patches/nproc.patch

@@ -1,13 +0,0 @@
-diff --git a/src/util.cc b/src/util.cc
-index ae94d34..72cf501 100644
---- a/src/util.cc
-+++ b/src/util.cc
-@@ -476,7 +476,7 @@ int GetProcessorCount() {
-   GetNativeSystemInfo(&info);
-   return info.dwNumberOfProcessors;
- #else
--  return sysconf(_SC_NPROCESSORS_ONLN);
-+  return 1;  // FIXME: serenity way of saying sysconf(_SC_NPROCESSORS_ONLN);
- #endif
- }
-