_resource_build.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. from cffi import FFI
  2. ffi = FFI()
  3. # Note: we don't directly expose 'struct timeval' or 'struct rlimit'
  4. rlimit_consts = '''
  5. RLIMIT_CPU
  6. RLIMIT_FSIZE
  7. RLIMIT_DATA
  8. RLIMIT_STACK
  9. RLIMIT_CORE
  10. RLIMIT_NOFILE
  11. RLIMIT_OFILE
  12. RLIMIT_VMEM
  13. RLIMIT_AS
  14. RLIMIT_RSS
  15. RLIMIT_NPROC
  16. RLIMIT_MEMLOCK
  17. RLIMIT_SBSIZE
  18. RLIM_INFINITY
  19. RUSAGE_SELF
  20. RUSAGE_CHILDREN
  21. RUSAGE_BOTH
  22. '''.split()
  23. rlimit_consts = ['#ifdef %s\n\t{"%s", %s},\n#endif\n' % (s, s, s)
  24. for s in rlimit_consts]
  25. ffi.set_source("_resource_cffi", """
  26. #include <sys/types.h>
  27. #include <sys/time.h>
  28. #include <sys/resource.h>
  29. #include <sys/wait.h>
  30. static const struct my_rlimit_def {
  31. const char *name;
  32. long long value;
  33. } my_rlimit_consts[] = {
  34. $RLIMIT_CONSTS
  35. { NULL, 0 }
  36. };
  37. #define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001)
  38. static double my_utime(struct rusage *input)
  39. {
  40. return doubletime(input->ru_utime);
  41. }
  42. static double my_stime(struct rusage *input)
  43. {
  44. return doubletime(input->ru_stime);
  45. }
  46. static int my_getrlimit(int resource, long long result[2])
  47. {
  48. struct rlimit rl;
  49. if (getrlimit(resource, &rl) == -1)
  50. return -1;
  51. result[0] = rl.rlim_cur;
  52. result[1] = rl.rlim_max;
  53. return 0;
  54. }
  55. static int my_setrlimit(int resource, long long cur, long long max)
  56. {
  57. struct rlimit rl;
  58. rl.rlim_cur = cur & RLIM_INFINITY;
  59. rl.rlim_max = max & RLIM_INFINITY;
  60. return setrlimit(resource, &rl);
  61. }
  62. """.replace('$RLIMIT_CONSTS', ''.join(rlimit_consts)))
  63. ffi.cdef("""
  64. #define RLIM_NLIMITS ...
  65. const struct my_rlimit_def {
  66. const char *name;
  67. long long value;
  68. } my_rlimit_consts[];
  69. struct rusage {
  70. long ru_maxrss;
  71. long ru_ixrss;
  72. long ru_idrss;
  73. long ru_isrss;
  74. long ru_minflt;
  75. long ru_majflt;
  76. long ru_nswap;
  77. long ru_inblock;
  78. long ru_oublock;
  79. long ru_msgsnd;
  80. long ru_msgrcv;
  81. long ru_nsignals;
  82. long ru_nvcsw;
  83. long ru_nivcsw;
  84. ...;
  85. };
  86. static double my_utime(struct rusage *);
  87. static double my_stime(struct rusage *);
  88. void getrusage(int who, struct rusage *result);
  89. int my_getrlimit(int resource, long long result[2]);
  90. int my_setrlimit(int resource, long long cur, long long max);
  91. int wait3(int *status, int options, struct rusage *rusage);
  92. int wait4(int pid, int *status, int options, struct rusage *rusage);
  93. """)
  94. if __name__ == "__main__":
  95. ffi.compile()