1 /*****************************************************************************
2  *                                                                           *
3  *  Elmer, A Finite Element Software for Multiphysical Problems              *
4  *                                                                           *
5  *  Copyright 1st April 1995 - , CSC - IT Center for Science Ltd., Finland    *
6  *                                                                           *
7  *  This program is free software; you can redistribute it and/or            *
8  *  modify it under the terms of the GNU General Public License              *
9  *  as published by the Free Software Foundation; either version 2           *
10  *  of the License, or (at your option) any later version.                   *
11  *                                                                           *
12  *  This program is distributed in the hope that it will be useful,          *
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
15  *  GNU General Public License for more details.                             *
16  *                                                                           *
17  *  You should have received a copy of the GNU General Public License        *
18  *  along with this program (in file fem/GPL-2); if not, write to the        *
19  *  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,         *
20  *  Boston, MA 02110-1301, USA.                                              *
21  *                                                                           *
22  *****************************************************************************/
23 
24 /*****************************************************************************
25  *                                                                           *
26  *  ElmerGUI checkmpi                                                        *
27  *                                                                           *
28  *****************************************************************************
29  *                                                                           *
30  *  Authors: Mikko Lyly, Juha Ruokolainen and Peter R�back                   *
31  *  Email:   Juha.Ruokolainen@csc.fi                                         *
32  *  Web:     http://www.csc.fi/elmer                                         *
33  *  Address: CSC - IT Center for Science Ltd.                                 *
34  *           Keilaranta 14                                                   *
35  *           02101 Espoo, Finland                                            *
36  *                                                                           *
37  *  Original Date: 15 Mar 2008                                               *
38  *                                                                           *
39  *****************************************************************************/
40 
41 #include <iostream>
42 #include "checkmpi.h"
43 
44 using namespace std;
45 
CheckMpi()46 CheckMpi::CheckMpi()
47 {
48 }
49 
~CheckMpi()50 CheckMpi::~CheckMpi()
51 {
52 }
53 
findSmpd()54 int CheckMpi::findSmpd()
55 {
56   // Check if there is an instance of smpd running:
57 
58 #ifdef WIN32
59 
60   unsigned int i;
61   TCHAR szProcessName[50] = TEXT("");
62   DWORD ProcessesIDs[MAX_PROCIDS], cbNeeded, cProcesses;
63   bool found = false;
64 
65   cout << "Checking whether smpd is running... ";
66 
67   if(!EnumProcesses(ProcessesIDs, sizeof(ProcessesIDs), &cbNeeded)) {
68     cout << "unable to enumerate processes - disabling parallel features" << endl;
69     return -1;
70   }
71 
72   cProcesses = cbNeeded / sizeof(DWORD);
73 
74   for(i = 0; i < cProcesses; i++) {
75     HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
76 				   PROCESS_VM_READ, FALSE,
77 				   ProcessesIDs[i] );
78 
79     if(hProcess != NULL)
80       GetModuleBaseName(hProcess, NULL, szProcessName,
81 			sizeof(szProcessName)/sizeof(TCHAR));
82     //if(!wcscmp(szProcessName, TEXT("smpd.exe"))) {
83     if(!_tcscmp(szProcessName, TEXT("smpd.exe"))) {
84       found = true;
85       cout << "yes (PID " << ProcessesIDs[i] << ")" << endl;
86     }
87 
88     CloseHandle(hProcess);
89   }
90 
91   if(!found) {
92     cout << "no - disabling parallel features" << endl;
93     return -1;
94   }
95 
96 #endif
97 
98   return 0;
99 }
100