Re: [ovs-dev] [PATCH 4/7] process: Retrieve process status.

2017-04-03 Thread Bodireddy, Bhanuprakash
>-Original Message-
>From: Aaron Conole [mailto:acon...@redhat.com]
>Sent: Monday, April 3, 2017 2:00 AM
>To: Bodireddy, Bhanuprakash <bhanuprakash.bodire...@intel.com>
>Cc: d...@openvswitch.org
>Subject: Re: [ovs-dev] [PATCH 4/7] process: Retrieve process status.
>
>Bhanuprakash Bodireddy <bhanuprakash.bodire...@intel.com> writes:
>
>> Implement function to retrieve the process status. This will be used
>> by Keepalive monitoring thread for detecting false alarms.
>>
>> Signed-off-by: Bhanuprakash Bodireddy
>> <bhanuprakash.bodire...@intel.com>
>> ---
>>  lib/process.c | 60
>>
>+++
>>  lib/process.h | 10 ++
>>  2 files changed, 70 insertions(+)
>>
>> diff --git a/lib/process.c b/lib/process.c index e9d0ba9..e0601dd
>> 100644
>> --- a/lib/process.c
>> +++ b/lib/process.c
>> @@ -50,6 +50,20 @@ struct process {
>>  int status;
>>  };
>>
>> +struct pstate2Num {
>> +char *tidState;
>> +int num;
>> +};
>> +
>> +const struct pstate2Num pstate_map[] = {
>> +{ "S", STOPPED_STATE },
>> +{ "R", ACTIVE_STATE },
>> +{ "t", TRACED_STATE },
>> +{ "Z", DEFUNC_STATE },
>> +{ "D", UNINTERRUPTIBLE_SLEEP_STATE },
>> +{ "NULL", UNUSED_STATE },
>> +};
>> +
>>  /* Pipe used to signal child termination. */  static int fds[2];
>>
>> @@ -390,6 +404,52 @@ process_run(void)  #endif  }
>>
>> +int
>> +get_process_status(int tid, int *pstate) { #ifndef _WIN32
>
>The following is Linux specific.  Please use an '#if LINUX' - there are 
>examples
>in the code for this.

That's right. I would do this in v2.

- Bhanuprakash
___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


Re: [ovs-dev] [PATCH 4/7] process: Retrieve process status.

2017-04-02 Thread Aaron Conole
Bhanuprakash Bodireddy  writes:

> Implement function to retrieve the process status. This will be used by
> Keepalive monitoring thread for detecting false alarms.
>
> Signed-off-by: Bhanuprakash Bodireddy 
> ---
>  lib/process.c | 60 
> +++
>  lib/process.h | 10 ++
>  2 files changed, 70 insertions(+)
>
> diff --git a/lib/process.c b/lib/process.c
> index e9d0ba9..e0601dd 100644
> --- a/lib/process.c
> +++ b/lib/process.c
> @@ -50,6 +50,20 @@ struct process {
>  int status;
>  };
>  
> +struct pstate2Num {
> +char *tidState;
> +int num;
> +};
> +
> +const struct pstate2Num pstate_map[] = {
> +{ "S", STOPPED_STATE },
> +{ "R", ACTIVE_STATE },
> +{ "t", TRACED_STATE },
> +{ "Z", DEFUNC_STATE },
> +{ "D", UNINTERRUPTIBLE_SLEEP_STATE },
> +{ "NULL", UNUSED_STATE },
> +};
> +
>  /* Pipe used to signal child termination. */
>  static int fds[2];
>  
> @@ -390,6 +404,52 @@ process_run(void)
>  #endif
>  }
>  
> +int
> +get_process_status(int tid, int *pstate)
> +{
> +#ifndef _WIN32

The following is Linux specific.  Please use an '#if LINUX' - there are
examples in the code for this.

> +static char process_name[20];
> +FILE *stream;
> +char line[75];
> +char Name[15], value[5], status[20];
> +int i, ln;
> +
> +snprintf(process_name, sizeof(process_name),
> + "/proc/%d/status", tid);
> +stream = fopen(process_name, "r");
> +if (stream == NULL) {
> +VLOG_WARN_ONCE("%s: open failed: %s", process_name,
> +ovs_strerror(errno));
> +return errno;
> +}
> +
> +ln=0;
> +while (fgets(line, sizeof line, stream)) {
> +if (!ovs_scan(line,
> +  "%6s %2s %14s\n",
> +   Name, value, status)) {
> +VLOG_WARN_ONCE("%s: could not parse line %d: %s",
> +process_name, ln, line);
> +continue;
> +}
> +if (!strcmp(Name, "State:")) {
> +for (i=0; pstate_map[i].tidState != NULL; i++) {
> +if (strcmp(pstate_map[i].tidState, value) == 0) {
> +VLOG_INFO("The state is %s, status is %d\n",
> +pstate_map[i].tidState, pstate_map[i].num);
> +*pstate = pstate_map[i].num;
> +break;
> +}
> +}
> +break;
> +}
> +ln++;
> +   }
> +   return 0;
> +#else
> +   return ENOSYS;
> +#endif
> +}
>  
>  /* Causes the next call to poll_block() to wake up when process 'p' has
>   * exited. */
> diff --git a/lib/process.h b/lib/process.h
> index 3feac7e..8a5513e 100644
> --- a/lib/process.h
> +++ b/lib/process.h
> @@ -20,6 +20,15 @@
>  #include 
>  #include 
>  
> +enum process_states {
> +UNUSED_STATE,
> +STOPPED_STATE,
> +ACTIVE_STATE,
> +TRACED_STATE,
> +DEFUNC_STATE,
> +UNINTERRUPTIBLE_SLEEP_STATE
> +};
> +
>  struct process;
>  
>  /* Starting and monitoring subprocesses.
> @@ -38,6 +47,7 @@ bool process_exited(struct process *);
>  int process_status(const struct process *);
>  void process_run(void);
>  void process_wait(struct process *);
> +int get_process_status(int, int *);
>  
>  /* These functions are thread-safe. */
>  char *process_status_msg(int);
___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


[ovs-dev] [PATCH 4/7] process: Retrieve process status.

2017-04-01 Thread Bhanuprakash Bodireddy
Implement function to retrieve the process status. This will be used by
Keepalive monitoring thread for detecting false alarms.

Signed-off-by: Bhanuprakash Bodireddy 
---
 lib/process.c | 60 +++
 lib/process.h | 10 ++
 2 files changed, 70 insertions(+)

diff --git a/lib/process.c b/lib/process.c
index e9d0ba9..e0601dd 100644
--- a/lib/process.c
+++ b/lib/process.c
@@ -50,6 +50,20 @@ struct process {
 int status;
 };
 
+struct pstate2Num {
+char *tidState;
+int num;
+};
+
+const struct pstate2Num pstate_map[] = {
+{ "S", STOPPED_STATE },
+{ "R", ACTIVE_STATE },
+{ "t", TRACED_STATE },
+{ "Z", DEFUNC_STATE },
+{ "D", UNINTERRUPTIBLE_SLEEP_STATE },
+{ "NULL", UNUSED_STATE },
+};
+
 /* Pipe used to signal child termination. */
 static int fds[2];
 
@@ -390,6 +404,52 @@ process_run(void)
 #endif
 }
 
+int
+get_process_status(int tid, int *pstate)
+{
+#ifndef _WIN32
+static char process_name[20];
+FILE *stream;
+char line[75];
+char Name[15], value[5], status[20];
+int i, ln;
+
+snprintf(process_name, sizeof(process_name),
+ "/proc/%d/status", tid);
+stream = fopen(process_name, "r");
+if (stream == NULL) {
+VLOG_WARN_ONCE("%s: open failed: %s", process_name,
+ovs_strerror(errno));
+return errno;
+}
+
+ln=0;
+while (fgets(line, sizeof line, stream)) {
+if (!ovs_scan(line,
+  "%6s %2s %14s\n",
+   Name, value, status)) {
+VLOG_WARN_ONCE("%s: could not parse line %d: %s",
+process_name, ln, line);
+continue;
+}
+if (!strcmp(Name, "State:")) {
+for (i=0; pstate_map[i].tidState != NULL; i++) {
+if (strcmp(pstate_map[i].tidState, value) == 0) {
+VLOG_INFO("The state is %s, status is %d\n",
+pstate_map[i].tidState, pstate_map[i].num);
+*pstate = pstate_map[i].num;
+break;
+}
+}
+break;
+}
+ln++;
+   }
+   return 0;
+#else
+   return ENOSYS;
+#endif
+}
 
 /* Causes the next call to poll_block() to wake up when process 'p' has
  * exited. */
diff --git a/lib/process.h b/lib/process.h
index 3feac7e..8a5513e 100644
--- a/lib/process.h
+++ b/lib/process.h
@@ -20,6 +20,15 @@
 #include 
 #include 
 
+enum process_states {
+UNUSED_STATE,
+STOPPED_STATE,
+ACTIVE_STATE,
+TRACED_STATE,
+DEFUNC_STATE,
+UNINTERRUPTIBLE_SLEEP_STATE
+};
+
 struct process;
 
 /* Starting and monitoring subprocesses.
@@ -38,6 +47,7 @@ bool process_exited(struct process *);
 int process_status(const struct process *);
 void process_run(void);
 void process_wait(struct process *);
+int get_process_status(int, int *);
 
 /* These functions are thread-safe. */
 char *process_status_msg(int);
-- 
2.4.11

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev