Thanks Mathi and Anders, I'll update with your review comments, and I guess it 
is ok to push this then./Thanks HansN

-----Original Message-----
From: Anders Widell 
Sent: den 9 april 2015 16:09
To: Hans Nordebäck; mathi.naic...@oracle.com
Cc: opensaf-devel@lists.sourceforge.net
Subject: Re: [PATCH 1 of 1] nid: cleanup should generate a core dump #1300

Ack with comments.

1) Maybe you should use osaf_nanosleep() instead of sleep() here?
2) Agree with Mathi that you should handle EINTR
3) When I read the man page for waitpid(), I think it is a bit unclear if the 
status variable has a defined value when waitipid() returns zero. 
Maybe it would be safer to treat the status variable as undefined in this case?
4) You need to add the following includes:

#include <signal.h> // for kill()
#include <sys/wait.h> // for waitpid()
#include <stdint.h> // for uint32_t

/ Anders Widell

On 04/02/2015 02:17 PM, Hans Nordeback wrote:
>   osaf/services/infrastructure/nid/nodeinit.c |  24 ++++++++++++++++++++++++
>   1 files changed, 24 insertions(+), 0 deletions(-)
>
>
> diff --git a/osaf/services/infrastructure/nid/nodeinit.c 
> b/osaf/services/infrastructure/nid/nodeinit.c
> --- a/osaf/services/infrastructure/nid/nodeinit.c
> +++ b/osaf/services/infrastructure/nid/nodeinit.c
> @@ -1108,6 +1108,30 @@ void cleanup(NID_SPAWN_INFO *service)
>       nid_close_ipc();
>       select_fd = -1;
>   
> +     pid_t w_pid;
> +     int status;
> +     uint32_t no_of_retries = 0;
> +     const uint32_t MAX_NO_RETRIES = 5;
> +
> +     if (check_process(service)) {
> +             // send abort signal to process to generate a core dump
> +             LOG_ER("Sending SIGABRT to %s, pid=%d", service->serv_name, 
> service->pid);
> +             if (kill(service->pid, SIGABRT) >= 0) {
> +                     // wait a short period for process to exit
> +                     do {
> +                             w_pid = waitpid(service->pid, &status, WNOHANG);
> +                             if (w_pid < 0) {
> +                                     break;
> +                             } else {
> +                                     if (!WIFEXITED(status) && 
> !WIFSIGNALED(status)) {
> +                                             sleep(1);
> +                                     }
> +                             }
> +                     } while (!WIFEXITED(status) && !WIFSIGNALED(status) && 
> ++no_of_retries < MAX_NO_RETRIES);
> +             }
> +     }
> +
> +     // if sending abort signal did not succeed, fallback to sigkill
>       if (check_process(service)) {
>               LOG_ER("Sending SIGKILL to %s, pid=%d", service->serv_name, 
> service->pid);
>               kill(service->pid, SIGKILL);


------------------------------------------------------------------------------
BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT
Develop your own process in accordance with the BPMN 2 standard
Learn Process modeling best practices with Bonita BPM through live exercises
http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_
source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to