PageRenderTime 285ms CodeModel.GetById 26ms RepoModel.GetById 4ms app.codeStats 0ms

/fpm/fpm_trace_mach.c

http://github.com/dreamcat4/php-fpm
C | 102 lines | 72 code | 28 blank | 2 comment | 11 complexity | db8dee392b65c1c2ca4129cc0bf39301 MD5 | raw file
  1. /* $Id: fpm_trace_mach.c,v 1.4 2008/08/26 15:09:15 anight Exp $ */
  2. /* (c) 2007,2008 Andrei Nigmatulin */
  3. #include "fpm_config.h"
  4. #include <mach/mach.h>
  5. #include <mach/mach_vm.h>
  6. #include <unistd.h>
  7. #include "fpm_trace.h"
  8. #include "fpm_process_ctl.h"
  9. #include "fpm_unix.h"
  10. #include "zlog.h"
  11. static mach_port_name_t target;
  12. static vm_offset_t target_page_base;
  13. static vm_offset_t local_page;
  14. static mach_msg_type_number_t local_size;
  15. static void fpm_mach_vm_deallocate()
  16. {
  17. if (local_page) {
  18. mach_vm_deallocate(mach_task_self(), local_page, local_size);
  19. target_page_base = 0;
  20. local_page = 0;
  21. local_size = 0;
  22. }
  23. }
  24. static int fpm_mach_vm_read_page(vm_offset_t page)
  25. {
  26. kern_return_t kr;
  27. kr = mach_vm_read(target, page, fpm_pagesize, &local_page, &local_size);
  28. if (kr != KERN_SUCCESS) {
  29. zlog(ZLOG_STUFF, ZLOG_ERROR, "mach_vm_read() failed: %s (%d)", mach_error_string(kr), kr);
  30. return -1;
  31. }
  32. return 0;
  33. }
  34. int fpm_trace_signal(pid_t pid)
  35. {
  36. if (0 > fpm_pctl_kill(pid, FPM_PCTL_STOP)) {
  37. zlog(ZLOG_STUFF, ZLOG_SYSERROR, "kill(SIGSTOP) failed");
  38. return -1;
  39. }
  40. return 0;
  41. }
  42. int fpm_trace_ready(pid_t pid)
  43. {
  44. kern_return_t kr;
  45. kr = task_for_pid(mach_task_self(), pid, &target);
  46. if (kr != KERN_SUCCESS) {
  47. char *msg = "";
  48. if (kr == KERN_FAILURE) {
  49. msg = " It seems that master process does not have enough privileges to trace processes.";
  50. }
  51. zlog(ZLOG_STUFF, ZLOG_ERROR, "task_for_pid() failed: %s (%d)%s", mach_error_string(kr), kr, msg);
  52. return -1;
  53. }
  54. return 0;
  55. }
  56. int fpm_trace_close(pid_t pid)
  57. {
  58. fpm_mach_vm_deallocate();
  59. target = 0;
  60. return 0;
  61. }
  62. int fpm_trace_get_long(long addr, long *data)
  63. {
  64. size_t offset = ((uintptr_t) (addr) % fpm_pagesize);
  65. vm_offset_t base = (uintptr_t) (addr) - offset;
  66. if (base != target_page_base) {
  67. fpm_mach_vm_deallocate();
  68. if (0 > fpm_mach_vm_read_page(base)) {
  69. return -1;
  70. }
  71. }
  72. *data = * (long *) (local_page + offset);
  73. return 0;
  74. }