|
64 | 64 | #define RDWR_BUF_SIZE 4096
|
65 | 65 | #define EQ(a,b) (strcmp(a,b) == 0)
|
66 | 66 |
|
| 67 | +static void* args_mem = NULL; |
| 68 | +static char** process_argv = NULL; |
| 69 | +static int process_argc = 0; |
| 70 | +static char* process_title_ptr = NULL; |
| 71 | + |
67 | 72 | int uv__platform_loop_init(uv_loop_t* loop) {
|
68 | 73 | loop->fs_fd = -1;
|
69 | 74 |
|
@@ -753,6 +758,13 @@ static void uv__ahafs_event(uv_loop_t* loop, uv__io_t* event_watch, unsigned int
|
753 | 758 |
|
754 | 759 | assert((bytes >= 0) && "uv__ahafs_event - Error reading monitor file");
|
755 | 760 |
|
| 761 | + /* In file / directory move cases, AIX Event infrastructure |
| 762 | + * produces a second event with no data. |
| 763 | + * Ignore it and return gracefully. |
| 764 | + */ |
| 765 | + if(bytes == 0) |
| 766 | + return; |
| 767 | + |
756 | 768 | /* Parse the data */
|
757 | 769 | if(bytes > 0)
|
758 | 770 | rc = uv__parse_data(result_data, &events, handle);
|
@@ -881,24 +893,94 @@ void uv__fs_event_close(uv_fs_event_t* handle) {
|
881 | 893 |
|
882 | 894 |
|
883 | 895 | char** uv_setup_args(int argc, char** argv) {
|
884 |
| - return argv; |
| 896 | + char** new_argv; |
| 897 | + size_t size; |
| 898 | + char* s; |
| 899 | + int i; |
| 900 | + |
| 901 | + if (argc <= 0) |
| 902 | + return argv; |
| 903 | + |
| 904 | + /* Save the original pointer to argv. |
| 905 | + * AIX uses argv to read the process name. |
| 906 | + * (Not the memory pointed to by argv[0..n] as on Linux.) |
| 907 | + */ |
| 908 | + process_argv = argv; |
| 909 | + process_argc = argc; |
| 910 | + |
| 911 | + /* Calculate how much memory we need for the argv strings. */ |
| 912 | + size = 0; |
| 913 | + for (i = 0; i < argc; i++) |
| 914 | + size += strlen(argv[i]) + 1; |
| 915 | + |
| 916 | + /* Add space for the argv pointers. */ |
| 917 | + size += (argc + 1) * sizeof(char*); |
| 918 | + |
| 919 | + new_argv = uv__malloc(size); |
| 920 | + if (new_argv == NULL) |
| 921 | + return argv; |
| 922 | + args_mem = new_argv; |
| 923 | + |
| 924 | + /* Copy over the strings and set up the pointer table. */ |
| 925 | + s = (char*) &new_argv[argc + 1]; |
| 926 | + for (i = 0; i < argc; i++) { |
| 927 | + size = strlen(argv[i]) + 1; |
| 928 | + memcpy(s, argv[i], size); |
| 929 | + new_argv[i] = s; |
| 930 | + s += size; |
| 931 | + } |
| 932 | + new_argv[i] = NULL; |
| 933 | + |
| 934 | + return new_argv; |
885 | 935 | }
|
886 | 936 |
|
887 | 937 |
|
888 | 938 | int uv_set_process_title(const char* title) {
|
| 939 | + char* new_title; |
| 940 | + |
| 941 | + /* We cannot free this pointer when libuv shuts down, |
| 942 | + * the process may still be using it. |
| 943 | + */ |
| 944 | + new_title = uv__strdup(title); |
| 945 | + if (new_title == NULL) |
| 946 | + return -ENOMEM; |
| 947 | + |
| 948 | + /* If this is the first time this is set, |
| 949 | + * don't free and set argv[1] to NULL. |
| 950 | + */ |
| 951 | + if (process_title_ptr != NULL) |
| 952 | + uv__free(process_title_ptr); |
| 953 | + |
| 954 | + process_title_ptr = new_title; |
| 955 | + |
| 956 | + process_argv[0] = process_title_ptr; |
| 957 | + if (process_argc > 1) |
| 958 | + process_argv[1] = NULL; |
| 959 | + |
889 | 960 | return 0;
|
890 | 961 | }
|
891 | 962 |
|
892 | 963 |
|
893 | 964 | int uv_get_process_title(char* buffer, size_t size) {
|
| 965 | + size_t len; |
| 966 | + len = strlen(process_argv[0]); |
894 | 967 | if (buffer == NULL || size == 0)
|
895 | 968 | return -EINVAL;
|
| 969 | + else if (size <= len) |
| 970 | + return -ENOBUFS; |
| 971 | + |
| 972 | + memcpy(buffer, process_argv[0], len + 1); |
896 | 973 |
|
897 |
| - buffer[0] = '\0'; |
898 | 974 | return 0;
|
899 | 975 | }
|
900 | 976 |
|
901 | 977 |
|
| 978 | +UV_DESTRUCTOR(static void free_args_mem(void)) { |
| 979 | + uv__free(args_mem); /* Keep valgrind happy. */ |
| 980 | + args_mem = NULL; |
| 981 | +} |
| 982 | + |
| 983 | + |
902 | 984 | int uv_resident_set_memory(size_t* rss) {
|
903 | 985 | char pp[64];
|
904 | 986 | psinfo_t psinfo;
|
|
0 commit comments