| 1401 | | exectasks(mp, rmp, schtid) |
| 1402 | | struct pmsg *mp; |
| 1403 | | struct pmsg *rmp; |
| 1404 | | int schtid; |
| 1405 | | { |
| 1406 | | struct pmsg *mp2; |
| 1407 | | int i; |
| 1408 | | struct timeval now; |
| 1409 | | struct waitc_spawn *wxp; |
| 1410 | | int munge_tenv = 0; |
| 1411 | | char tmp[255]; |
| 1412 | | char *wd = 0; |
| 1413 | | char *savewd = 0; |
| 1414 | | |
| 1415 | | wxp = TALLOC(1, struct waitc_spawn, "waix");
|
| 1416 | | BZERO((char*)wxp, sizeof(struct waitc_spawn));
|
| 1417 | | |
| 1418 | | |
| 1419 | | |
| 1420 | | if (upkuint(mp, &wxp->w_ptid) |
| 1421 | | || upkstralloc(mp, &wxp->w_file) |
| 1422 | | || upkint(mp, &wxp->w_flags) |
| 1423 | | || upkint(mp, &wxp->w_veclen) |
| 1424 | | || upkint(mp, &wxp->w_argc)) |
| 1425 | | goto bad; |
| 1426 | | |
| 1427 | | if (wxp->w_veclen < 1) |
| 1428 | | goto bad; |
| 1429 | | wxp->w_vec = TALLOC(wxp->w_veclen, int, "tids");
|
| 1430 | | |
| 1431 | | wxp->w_argc += 2; |
| 1432 | | wxp->w_argv = TALLOC(wxp->w_argc + 1, char*, "argv");
|
| 1433 | | BZERO((char*)wxp->w_argv, (wxp->w_argc + 1) * sizeof(char*));
|
| 1434 | | wxp->w_argv++; |
| 1435 | | wxp->w_argv[0] = wxp->w_file; |
| 1436 | | wxp->w_file = 0; |
| 1437 | | wxp->w_argv[--wxp->w_argc] = 0; |
| 1438 | | for (i = 1; i < wxp->w_argc; i++) |
| 1439 | | if (upkstralloc(mp, &wxp->w_argv[i])) |
| 1440 | | goto bad; |
| 1441 | | |
| 1442 | | if (upkuint(mp, &wxp->w_outtid) |
| 1443 | | || upkuint(mp, &wxp->w_outctx) |
| 1444 | | || upkuint(mp, &wxp->w_outtag) |
| 1445 | | || upkuint(mp, &wxp->w_trctid) |
| 1446 | | || upkuint(mp, &wxp->w_trcctx) |
| 1447 | | || upkuint(mp, &wxp->w_trctag) |
| 1448 | | || upkuint(mp, &wxp->w_nenv)) |
| 1449 | | goto bad; |
| 1450 | | |
| 1451 | | wxp->w_hosttotal = wxp->w_veclen; |
| 1452 | | |
| 1453 | | if (pvmtracer.trctid) { |
| 1454 | | if (!(wxp->w_trctid) && pvmtracer.trctag) { |
| 1455 | | wxp->w_trctid = pvmtracer.trctid; |
| 1456 | | wxp->w_trcctx = pvmtracer.trcctx; |
| 1457 | | wxp->w_trctag = pvmtracer.trctag; |
| 1458 | | munge_tenv++; |
| 1459 | | } |
| 1460 | | } |
| 1461 | | |
| 1462 | | if (pvmtracer.outtid) { |
| 1463 | | if (!(wxp->w_outtid) && pvmtracer.outtag) { |
| 1464 | | wxp->w_outtid = pvmtracer.outtid; |
| 1465 | | wxp->w_outctx = pvmtracer.outctx; |
| 1466 | | wxp->w_outtag = pvmtracer.outtag; |
| 1467 | | } |
| 1468 | | } |
| 1469 | | |
| 1470 | | wxp->w_env = TALLOC((wxp->w_nenv + 1), char*, "env");
|
| 1471 | | BZERO(wxp->w_env, (wxp->w_nenv + 1) * sizeof(char*));
|
| 1472 | | |
| 1473 | | for (i = 0; i < wxp->w_nenv; i++) |
| 1474 | | if (upkstralloc(mp, &wxp->w_env[i])) |
| 1475 | | goto bad; |
| 1476 | | |
| 1477 | | if ( upkuint(mp, &wxp->w_instance) || upkuint(mp, &wxp->w_outof)) |
| 1478 | | goto bad; |
| 1479 | | |
| 1480 | | |
| 1481 | | |
| 1482 | | for (i = 0; i < wxp->w_nenv; i++) |
| 1483 | | if ( !strncmp( "PVMSPAWNWD=", wxp->w_env[i], |
| 1484 | | strlen("PVMSPAWNWD=") ) ) |
| 1485 | | wd = STRALLOC( wxp->w_env[i] + strlen("PVMSPAWNWD=") );
|
| 1486 | | |
| 1487 | | |
| 1488 | | |
| 1489 | | if ( munge_tenv ) { |
| 1490 | | sprintf( tmp, "PVMTMASK=%s", pvmtracer.tmask ); |
| 1491 | | pvmenvinsert( &(wxp->w_env), tmp ); |
| 1492 | | |
| 1493 | | sprintf( tmp, "PVMTRCBUF=%d", pvmtracer.trcbuf ); |
| 1494 | | pvmenvinsert( &(wxp->w_env), tmp ); |
| 1495 | | |
| 1496 | | sprintf( tmp, "PVMTRCOPT=%d", pvmtracer.trcopt ); |
| 1497 | | pvmenvinsert( &(wxp->w_env), tmp ); |
| 1498 | | |
| 1499 | | for ( wxp->w_nenv = 0 ; wxp->w_env[ wxp->w_nenv ] ; |
| 1500 | | (wxp->w_nenv)++ ); |
| 1501 | | } |
| 1502 | | |
| 1503 | | |
| 1504 | | |
| 1505 | | wxp->w_sched = schtid; |
| 1506 | | |
| 1507 | | |
| 1508 | | if (wd) { |
| 1509 | | savewd = (char *) getcwd( (char *) NULL, 255 );
|
| 1510 | | chdir( wd ); |
| 1511 | | } |
| 1512 | | |
| 1513 | | #if defined(IMA_PGON) || defined(IMA_SP2MPI) || defined(IMA_AIX4SP2) \ |
| 1514 | | || defined(IMA_AIX5SP2) || defined(IMA_BEOLIN) |
| 1515 | | if (!(wxp->w_flags & PvmMppFront)) |
| 1516 | | { |
| 1517 | | mpp_load(wxp); |
| 1518 | | } |
| 1519 | | else |
| 1520 | | #endif |
| 1521 | | { |
| 1522 | | ppi_load(wxp); |
| 1523 | | } |
| 1524 | | |
| 1525 | | |
| 1526 | | if (savewd) |
| 1527 | | chdir( savewd ); |
| 1528 | | |
| 1529 | | for (i = 0; i < wxp->w_veclen; i++) { |
| 1530 | | if (wxp->w_vec[i] > 0) { |
| 1531 | | if (wxp->w_trctid > 0) { |
| 1532 | | tev_send_newtask( |
| 1533 | | wxp->w_trctid, wxp->w_trcctx, wxp->w_trctag, |
| 1534 | | wxp->w_vec[i], wxp->w_ptid, wxp->w_flags, |
| 1535 | | wxp->w_argv[0] ); |
| 1536 | | } |
| 1537 | | if (wxp->w_outtid > 0) { |
| 1538 | | mp2 = mesg_new(0); |
| 1539 | | mp2->m_dst = wxp->w_outtid; |
| 1540 | | mp2->m_ctx = wxp->w_outctx; |
| 1541 | | mp2->m_tag = wxp->w_outtag; |
| 1542 | | pkint(mp2, wxp->w_vec[i]); |
| 1543 | | pkint(mp2, TO_NEW);
|
| 1544 | | pkint(mp2, wxp->w_ptid); |
| 1545 | | sendmessage(mp2); |
| 1546 | | } |
| 1547 | | } |
| 1548 | | } |
| 1549 | | |
| 1550 | | pkint(rmp, wxp->w_veclen); |
| 1551 | | for (i = 0; i < wxp->w_veclen; i++) |
| 1552 | | pkint(rmp, wxp->w_vec[i]); |
| 1553 | | sendmessage(rmp); |
| 1554 | | goto cleanup; |
| 1555 | | |
| 1556 | | bad: |
| 1557 | | pvmlogprintf("exectasks() from t%x bad msg format\n", mp->m_src); |
| 1558 | | |
| 1559 | | cleanup: |
| 1560 | | if (wxp->w_argv) |
| 1561 | | *--wxp->w_argv = 0; |
| 1562 | | free_wait_spawn(wxp); |
| 1563 | | if (wd) |
| 1564 | | PVM_FREE(wd);
|
| 1565 | | return 0; |
| 1566 | | } |