Running multiple instances of a map in parallel

This example shows how to create multiple instances of map objects and how to run these map instances in parallel.

#include "dtxpi.h"

#ifdef WIN32
#include <windows.h>
#include <process.h>

#define CRITICAL_SECTION CRITICAL_SECTION
#define INITIALIZE_CRITICAL_SECTION(x) InitializeCriticalSection(x)
#define ENTER_CRITICAL_SECTION(x) EnterCriticalSection(x)
#define LEAVE_CRITICAL_SECTION(x) LeaveCriticalSection(x)
#define DELETE_CRITICAL_SECTION(x) DeleteCriticalSection(x)
#define CREATE_THREAD(a,b) _beginthread((a),0,(b))
#define SLEEP(x) Sleep(x)

void RunMap(HMPIMAP hMap);

#else /* UNIX defines */
#include <pthread.h>
#include <unistd.h>
#include <stropts.h>
#include <poll.h>

pthread_t tid;

#define CRITICAL_SECTION pthread_mutex_t
#define INITIALIZE_CRITICAL_SECTION(x) pthread_mutex_init((x),NULL)
#define ENTER_CRITICAL_SECTION(x) pthread_mutex_lock(x)
#define LEAVE_CRITICAL_SECTION(x) pthread_mutex_unlock(x)
#define DELETE_CRITICAL_SECTION(x) pthread_mutex_destroy(x)
#define CREATE_THREAD(a,b) pthread_create(&tid,NULL,
(void*(*)(void*))(a),(void*)(b))
#define SLEEP(x) poll(NULL,NULL,(x))

void* RunMap(HMPIMAP hMap);
#endif
CRITICAL_SECTION     crit_sec;
int num_maps;

#define CHECK_ERR(rc) if(MPIRC_FAILED(rc))
{ printf("Last error is: %s\n",mpiErrorGetText(rc)); return -1;}

int main()
{
const char     *szMsg;
int            iRC;
HMPIMAP        hMap1;
HMPIMAP        hMap2;
MPIRC          rc;

INITIALIZE_CRITICAL_SECTION( &crit_sec);

rc = mpiInitAPI(NULL);
CHECK_ERR(rc);

rc = mpiMapLoadFile (&hMap1, "test2.mmc");
CHECK_ERR(rc);
rc = mpiMapLoadFile (&hMap2, "test2.mmc");   
/* This 2nd call will not read the MMC file.*/
CHECK_ERR(rc);

num_maps = 1;
CREATE_THREAD(RunMap,hMap1);

ENTER_CRITICAL_SECTION(&crit_sec);
num_maps++;
LEAVE_CRITICAL_SECTION(&crit_sec);

CREATE_THREAD(RunMap,hMap2);

/* Wait for map threads to complete */
while(num_maps)
SLEEP(100);

rc = mpiPropertyGetText (hMap1, MPIP_OBJECT_ERROR_MSG, 0, &szMsg, NULL);
CHECK_ERR(rc);
rc = mpiPropertyGetInteger (hMap1, MPIP_OBJECT_ERROR_CODE, 0, &iRC);
CHECK_ERR(rc);
printf("Map status: %s (%d)\n", szMsg, iRC);

rc = mpiPropertyGetText (hMap2, MPIP_OBJECT_ERROR_MSG, 0, &szMsg, NULL);
CHECK_ERR(rc);
rc = mpiPropertyGetInteger (hMap2, MPIP_OBJECT_ERROR_CODE, 0, &iRC);
CHECK_ERR(rc);
printf("Map status: %s (%d)\n", szMsg, iRC);

rc = mpiMapUnload (hMap1);
CHECK_ERR(rc);
rc = mpiMapUnload (hMap2);
CHECK_ERR(rc);

rc = mpiTermAPI();
CHECK_ERR(rc);

DELETE_CRITICAL_SECTION(&crit_sec);
return 0;

}
#ifdef WIN32
void RunMap(HMPIMAP hMap)
#else /* UNIX version of the function */
void* RunMap(HMPIMAP hMap)
#endif
{
MPIRC rc;

rc = mpiMapRun (hMap);

ENTER_CRITICAL_SECTION(&crit_sec);
num_maps--;
LEAVE_CRITICAL_SECTION(&crit_sec);

#ifdef WIN32
return;
#else
return NULL;
#endif

}