Review | endproc.c: Implement ProcessPage_OnEndProcessTree

Henri Verbeet hverbeet at gmail.com
Sun Apr 23 13:10:09 CDT 2017


On 20 April 2017 at 20:10, Akarsha Sehwag <akarsha15010 at iiitd.ac.in> wrote:
> Hi
> I hope this is more readable and easier to review.
>
It looks like your mail client wrapped the patch. When using webmail
in particular it's probably better to just attach the patch, although
using git send-email would be best.

I think the patch is largely ok, but do have a few comments.

> +static void init_process_list(process_list *list) {
> +    list->size = 4;            /*initialise size with 4. Will increase if
> necessary.*/
> +    list->pid = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, list->size *
> sizeof(*(list->pid)));
> +    list->count = 0;
> +}
HEAP_ZERO_MEMORY is unnecessary, since "pid" entries are always
initialised before being used in process_list_append().

> +static void increase_list_size(process_list *list) {
> +    list->size *= 2;
> +    list->pid = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, list->pid,
> list->size * sizeof(*(list->pid)));
> +}
Although unlikely, HeapReAlloc() can fail and return NULL. It would be
better to handle that possibility. Since increase_list_size() and
process_list_append() are both small functions, I think it's worth
considering merging increase_list_size() into process_list_append(),
since that would probably simplify handling HeapReAlloc() failures.
The comment about HEAP_ZERO_MEMORY in init_process_list() applies here
as well.

> @@ -125,20 +187,40 @@ void ProcessPage_OnEndProcessTree(void)
>      if (MessageBoxW(hMainWnd, wszWarnMsg, wszWarnTitle,
> MB_YESNO|MB_ICONWARNING) != IDYES)
>          return;
>
> -    hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId);
>
> -    if (!hProcess)
> -    {
> -        GetLastErrorText(wstrErrorText,
> sizeof(wstrErrorText)/sizeof(WCHAR));
> -        MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate,
> MB_OK|MB_ICONSTOP);
> +    init_process_list(&list);
> +
> +    if(list.pid == NULL)
>          return;
Although not necessarily wrong, I think checking "list.pid" here is a
little awkward, since the possibility of it being NULL is an
implementation detail of init_process_list(). I think it would be
better to either make init_process_list() return an error and handle
that here, or just inline init_process_list() and free_process_list()
into their callers.

> +    snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,
> 0);//TH32SNAPPROCESS
> +
> +    if(!snapshot)
> +        return;
CreateToolhelp32Snapshot() returns INVALID_HANDLE_VALUE instead of
NULL on failure. Returning here would leak "list.pid". Also, there
seems to be a leftover comment.

> +    for(i = 0; i < list.count; ++i) {
> +        hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, list.pid[i]);
> +
> +        if (!hProcess)
> +        {
> +            GetLastErrorText(wstrErrorText,
> sizeof(wstrErrorText)/sizeof(WCHAR));
> +            MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate,
> MB_OK|MB_ICONSTOP);
> +            break;
> +        }
> +
> +        if (!TerminateProcess(hProcess, 0))
> +        {
> +            GetLastErrorText(wstrErrorText,
> sizeof(wstrErrorText)/sizeof(WCHAR));
> +            MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate,
> MB_OK|MB_ICONSTOP);
> +        }
> +        CloseHandle(hProcess);
>      }
It may be worth considering introducing a function to terminate a
process here. I.e.:

    if (!kill_process(list.pid[i]))
    {
       GetLastErrorText(error_text, sizeof(error_text) / sizeof(*error_text));
       MessageBoxW(hMainWnd, error_text, wszUnable2Terminate, MB_OK |
MB_ICONSTOP);
       break;
    }

Such a function could be used by ProcessPage_OnEndProcess() as well.

Henri



More information about the wine-devel mailing list