source: git/Singular/mpsr_sl.cc @ ed47aab

fieker-DuValspielwiese
Last change on this file since ed47aab was 6ce030f, checked in by Oleksandr Motsak <motsak@…>, 12 years ago
removal of the $Id$ svn tag from everywhere NOTE: the git SHA1 may be used instead (only on special places) NOTE: the libraries Singular/LIB/*.lib still contain the marker due to our current use of svn
  • Property mode set to 100644
File size: 13.0 KB
RevLine 
[0e1846]1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
[6b32990]4/***************************************************************
5 *  File:    mpsr_sl.cc
6 *  Purpose: implementation of sl_link routines for MP
7 *  Author:  obachman (Olaf Bachmann)
8 *  Created: 12/00
9 *******************************************************************/
[d754b7]10
[762407]11#include "config.h"
[b1dfaf]12#include <kernel/mod2.h>
[d754b7]13
14#ifdef HAVE_MPSR
[0e1846]15
16#include <stdio.h>
17#include <string.h>
[cc0296]18#include <unistd.h>
[50cbdc]19#ifdef HPUX_9
20#include <signal.h>
21#endif
[561aa2]22#include <sys/wait.h>
[599326]23#include <Singular/mpsr.h>
24#include <Singular/tok.h>
[b1dfaf]25#include <omalloc/omalloc.h>
[599326]26#include <kernel/febase.h>
27#include <Singular/subexpr.h>
28#include <Singular/ipid.h>
29#include <Singular/silink.h>
[98918e]30#include <Singular/cntrlc.h>
[9680805]31#include "feOpt.h"
[0e1846]32
[6b32990]33
[4e595a7]34static int Batch_ReadEval(si_link silink);
35
[0e1846]36#ifdef MPSR_DEBUG
37#define MP_SET_LINK_OPTIONS(link) \
[d754b7]38  if (link != NULL) \
39     MP_SetLinkOption(link,MP_LINK_LOG_MASK_OPT,MP_LOG_ALL_EVENTS)
[0e1846]40#else
41#define MP_SET_LINK_OPTIONS(link) ((void *) 0)
42#endif
43
[8c35ba]44static MP_Env_pt mp_Env=NULL;
45extern void (*MP_Exit_Env_Ptr)();
[0e1846]46
[d754b7]47/* =============== general utilities ====================================== */
[8c35ba]48static void MP_Exit_Env_sl()
49{ MP_ReleaseEnv(mp_Env); mp_Env=NULL; }
[4e595a7]50static void FreeCmdArgs(int argc, char** argv)
[0e1846]51{
52  int i;
[d754b7]53  for (i=0; i<argc; i++)
[c232af]54    omFree(argv[i]);
[d754b7]55
[c232af]56  if (argv) omFreeSize(argv, argc*sizeof(char *));
[0e1846]57}
58
[4e595a7]59static void GetCmdArgs(int *argc, char ***argv, char *str)
[0e1846]60{
[d754b7]61  if (str == NULL || str[0] == '\0')
[0e1846]62  {
[d754b7]63    *argc = 0;
64    *argv = NULL;
[0e1846]65  }
[d754b7]66  else
[0e1846]67  {
[d754b7]68    int i = 0, sl = strlen(str)+1, j;
[c232af]69    char *s2=omStrDup(str);
[0e1846]70
[eea2b0]71    char *appl = strstr(s2, "--MPapplication");
[d754b7]72    if (appl != NULL)
[e6969d]73    {
[d754b7]74      if (appl != s2) *(appl-1) = '\0';
75      i = 2;
[e6969d]76    }
77
[d754b7]78    if (appl != s2)
[e6969d]79    {
[d754b7]80      if (strtok(s2, " ") != NULL)
81      {
82        i++;
83        while (strtok(NULL," ") != NULL) i++;
84      }
[e6969d]85    }
[f11262]86
[d754b7]87    *argc = i;
88    if (i>0)
[e6969d]89    {
[c232af]90      *argv = (char **) omAlloc0(i*sizeof(char *));
[d754b7]91      if (appl != NULL) i -= 2;
92      if (i>0)
[e6969d]93      {
[d754b7]94        strcpy(s2,str);
[c232af]95        *argv[0] = omStrDup(strtok(s2, " "));
[d754b7]96        for(j = 1; j <i; j++)
[c232af]97          (*argv)[j] = omStrDup(strtok(NULL, " "));
[e6969d]98      }
99    }
100    else
[d754b7]101      *argv = NULL;
102
103    if (appl != NULL)
104    {
[c232af]105      (*argv)[*argc -2] = omStrDup("--MPapplication");
106      (*argv)[*argc -1] = omStrDup(&(appl[15]));
[d754b7]107    }
108
[c232af]109    omFree(s2);
[0e1846]110  }
[f11262]111
[0e1846]112}
113
[d754b7]114/***************************************************************
115 *
116 * MPfile  specific stuff
117 *
118 ***************************************************************/
[0a001f]119LINKAGE BOOLEAN slOpenMPFile(si_link l, short flag, leftv u)
[0e1846]120{
[a0db9e]121  const char *argv[] = {"--MPtransp", "FILE", "--MPmode", "append",
122                        "--MPfile", "/tmp/mpout"};
123  const char *mode;
[f11262]124
[d754b7]125  MP_Link_pt link = NULL;
[f11262]126
[d754b7]127  if (flag == SI_LINK_OPEN)
[0e1846]128  {
[d754b7]129   if (l->mode[0] != '\0' && (strcmp(l->mode, "r") == 0))
130      flag = SI_LINK_READ;
131    else flag = SI_LINK_WRITE;
[0e1846]132  }
133
[d754b7]134  if (l->name[0] != '\0') argv[5] = l->name;
[c232af]135  else l->name = omStrDup(argv[5]);
[f11262]136
[0e1846]137
[d754b7]138  if (flag == SI_LINK_READ)
139  {
140    argv[3] = "read";
141    mode = "r";
142  }
143  else if (strcmp(l->mode, "w") == 0)
144  {
145    argv[3] = "write";
146    mode = "w";
147  }
148  else
[0e1846]149  {
[d754b7]150    mode = "a";
[0e1846]151  }
[d754b7]152
[0e1846]153  if (mp_Env == NULL)
154    mp_Env = MP_InitializeEnv(MP_AllocateEnv());
155
[4a8d95]156  if (mp_Env == NULL || (MPT_Init(mp_Env) != MPT_Success))
[0e1846]157  {
[da97958]158    WerrorS("Open: Error in initialization of MP environment");
[0e1846]159    return TRUE;
160  }
[8c35ba]161  MP_Exit_Env_Ptr=MP_Exit_Env_sl;
162
[0e1846]163
164  if ((link = MP_OpenLink(mp_Env, 6, argv)) == NULL)
165    return TRUE;
166
[d754b7]167  MP_SET_LINK_OPTIONS(link);
[0e1846]168  l->data = (void *) link;
[d754b7]169  SI_LINK_SET_OPEN_P(l, flag);
[c232af]170  omFree(l->mode);
171  l->mode = omStrDup(mode);
[0e1846]172  return FALSE;
173}
174
[d754b7]175/***************************************************************
176 *
177 * MPtcp  specific stuff
178 *
179 ***************************************************************/
180
[6b32990]181LINKAGE MP_Link_pt slOpenMPConnect(int n_argc, char **n_argv)
[0e1846]182{
[a0db9e]183  const char *argv[] = {"--MPtransp", "TCP", "--MPmode", "connect", "--MPport",
184                       "1025",  "--MPhost", "localhost","--MPrsh","ssh"};
[0e1846]185
[a0db9e]186  const char *port = IMP_GetCmdlineArg(n_argc, n_argv, "--MPport");
187  const char *host = IMP_GetCmdlineArg(n_argc, n_argv, "--MPhost");
188  const char *rsh = IMP_GetCmdlineArg(n_argc, n_argv, "--MPrsh");
[0e1846]189
[ca18d3]190  if (port == NULL) port = (char*) feOptValue(FE_OPT_MPPORT);
191  if (host == NULL) host = (char*) feOptValue(FE_OPT_MPHOST);
[d2f3863]192  if (rsh == NULL) rsh = (char*) feOptValue(FE_OPT_MPRSH);
[0e1846]193
[f11262]194  if (port != NULL)
[eea2b0]195    argv[5] = port;
196  if (host != NULL)
[d754b7]197    argv[7] = host;
[eea2b0]198  else
199    argv[7] = mp_Env->thishost;
[d2f3863]200  if (rsh != NULL)
201    argv[9] = rsh;
[f11262]202
[d2f3863]203  return MP_OpenLink(mp_Env, 10, argv);
[0e1846]204}
205
[6b32990]206LINKAGE MP_Link_pt slOpenMPListen(int n_argc, char **n_argv)
[0e1846]207{
[a0db9e]208  const char *argv[] = {"--MPtransp", "TCP", "--MPmode", "listen",
209                       "--MPport", "1025"};
[eea2b0]210  char *port = IMP_GetCmdlineArg(n_argc, n_argv, "--MPport");
211
[ca18d3]212  if (port == NULL) port = (char*) feOptValue(FE_OPT_MPHOST);
[0e1846]213
[bde08b]214  if (port != NULL) argv[5] = port;
[0e1846]215
[d754b7]216  return MP_OpenLink(mp_Env, 6, argv);
[0e1846]217}
218
[6b32990]219MP_Link_pt slOpenMPLaunch(int n_argc, char **n_argv)
[0e1846]220{
[a0db9e]221  const char *argv[] = {"--MPtransp", "TCP", "--MPmode", "launch",
222                       "--MPhost", "localhost",
223                       "--MPapplication", "Singular -bq  --no-warn --no-out --no-rc",
224                       "--MPrsh", "rsh"};
225  const char *appl = IMP_GetCmdlineArg(n_argc, n_argv, "--MPapplication");
226  const char *host = IMP_GetCmdlineArg(n_argc, n_argv, "--MPhost");
227  const char *rsh = IMP_GetCmdlineArg(n_argc, n_argv, "--MPrsh");
[eea2b0]228  char* nappl = NULL;
229  MP_Link_pt link;
[ec3675]230  int argc = 8;
[0e1846]231
[f11262]232  if (appl == NULL && (host == NULL ||
[eea2b0]233                       strcmp(host, "localhost") == 0))
234  {
[9c35ef]235    appl = feResource("Singular");
[f11262]236
[eea2b0]237    if (appl != NULL)
238    {
[c232af]239      nappl = (char*) omAlloc(MAXPATHLEN + 50);
[eea2b0]240      strcpy(nappl, appl);
[ec3675]241      strcat(nappl, " -bq --no-warn --no-out --no-rc");
[eea2b0]242      appl = nappl;
243    }
244  }
[f11262]245
246  if ((host == NULL)||(strcmp(host, "localhost") == 0))
[0e1846]247  {
[d754b7]248    argv[5] = mp_Env->thishost;
[0e1846]249  }
250  else
[d754b7]251    argv[5] = host;
[0e1846]252
[f11262]253  if (appl != NULL)
[ec3675]254    argv[7] = appl;
255
256
[80419f]257  if (rsh != NULL)
258  {
[ec3675]259    argv[9] = rsh;
260    argc = 10;
[80419f]261  }
262
[ec3675]263  link = MP_OpenLink(mp_Env, argc, argv);
[c232af]264  if (nappl != NULL) omFreeSize(nappl, MAXPATHLEN + 50);
[eea2b0]265  return link;
[0e1846]266}
267
[6b32990]268LINKAGE MP_Link_pt slOpenMPFork(si_link l, int n_argc, char **n_argv)
[4e595a7]269{
270  MP_Link_pt link = NULL;
[a0db9e]271  const char *argv[] = {"--MPtransp", "TCP", "--MPmode", "fork", "--MPport", "1703"};
[78e1d6]272  char *port = IMP_GetCmdlineArg(n_argc, n_argv, (char *)"--MPport");
[4e595a7]273
274  if (port != NULL) argv[5] = port;
275
[f11262]276  link = MP_OpenLink(mp_Env, 6, argv);
[4e595a7]277  if (link != NULL)
278  {
279    if (MP_GetLinkStatus(link, MP_LinkIsParent))
280    {
281    /* parent's business */
[c232af]282      if (l->name != NULL) omFree(l->name);
283      l->name = omStrDup("parent");
[4e595a7]284      return link;
285    }
286    else
287    {
288      /* child's business -- go into batch mode */
[c232af]289      if (l->name != NULL) omFree(l->name);
290      l->name = omStrDup("child");
[4e595a7]291      MP_SET_LINK_OPTIONS(link);
292      SI_LINK_SET_RW_OPEN_P(l);
293      l->data = (void *) link;
[f4edee]294      fe_fgets_stdin=fe_fgets_dummy;
[854405]295      WerrorS_callback=WerrorS_batch;
[98918e]296      singular_in_batchmode=TRUE;
[19ae2d1]297      //myynest=0;
[4e595a7]298      _exit(Batch_ReadEval(slCopy(l)));
299    }
300  }
301  else
302  {
303    /* only parent can get here */
304    return NULL;
305  }
306}
307
[f11262]308
309
[0a001f]310LINKAGE BOOLEAN slOpenMPTcp(si_link l, short flag, leftv u)
[0e1846]311{
[cc0296]312  MP_Link_pt link = NULL;
[d754b7]313  char **argv;
314  int argc;
[f11262]315
[d754b7]316  GetCmdArgs(&argc, &argv, l->name);
[f11262]317
[0e1846]318  if (mp_Env == NULL)
319    mp_Env = MP_InitializeEnv(MP_AllocateEnv());
320
321  if (mp_Env == NULL)
322  {
[da97958]323    WerrorS("Open: Error in initialization of MP environment");
[0e1846]324    return TRUE;
325  }
[8c35ba]326  MP_Exit_Env_Ptr=MP_Exit_Env_sl;
[0e1846]327
[d754b7]328  if (strcmp(l->mode, "connect") == 0) link = slOpenMPConnect(argc, argv);
329  else if (strcmp(l->mode, "listen") == 0) link = slOpenMPListen(argc, argv);
[4e595a7]330  else if (strcmp(l->mode, "launch") == 0) link = slOpenMPLaunch(argc, argv);
[0e1846]331  else
332  {
[4e595a7]333    if (strcmp(l->mode, "fork") != 0)
[d754b7]334    {
[c232af]335      if (l->mode != NULL) omFree(l->mode);
336      l->mode = omStrDup("fork");
[d754b7]337    }
[4e595a7]338    link = slOpenMPFork(l, argc, argv);
[0e1846]339  }
340
[d754b7]341  FreeCmdArgs(argc, argv);
[f11262]342
[d754b7]343  if (link != NULL)
[0e1846]344  {
[d754b7]345    MP_SET_LINK_OPTIONS(link);
346    SI_LINK_SET_RW_OPEN_P(l);
347    l->data = (void *) link;
348    return FALSE;
[0e1846]349  }
[d754b7]350  else return TRUE;
[0e1846]351}
352
[d754b7]353/***************************************************************
354 *
355 * MP general stuff
356 *
357 ***************************************************************/
358
[6b32990]359LINKAGE BOOLEAN slWriteMP(si_link l, leftv v)
[0e1846]360{
[91882f7]361  leftv next = (v != NULL ? v->next : (leftv) NULL);
[0e1846]362  mpsr_ClearError();
[feaddd]363
364  // writing is done with one leftv at a time
365  if (v != NULL) v->next = NULL; // hence, we need to set next to NULL
[0e1846]366  if (mpsr_PutMsg((MP_Link_pt) l->data, v) != mpsr_Success)
367  {
[d754b7]368    mpsr_PrintError((MP_Link_pt) l->data);
[feaddd]369    if (v != NULL) v->next = next;
[0e1846]370    return TRUE;
371  }
[feaddd]372
[f11262]373  // take care of the remaining leftv's
[feaddd]374  while (next != NULL)
375  {
376    v->next = next;
377    v = next;
378    next = v->next;
[04d4de]379    v->next = NULL;
[feaddd]380    if (mpsr_PutMsg((MP_Link_pt) l->data, v) != mpsr_Success)
381    {
382      mpsr_PrintError((MP_Link_pt) l->data);
383      v->next = next;
384      return TRUE;
385    }
386  }
387  return FALSE;
[0e1846]388}
389
[6b32990]390LINKAGE leftv slReadMP(si_link l)
[0e1846]391{
392  leftv v = NULL;
393  mpsr_ClearError();
394  if (mpsr_GetMsg((MP_Link_pt) l->data, v) != mpsr_Success)
395  {
[286bd57]396    mpsr_PrintError((MP_Link_pt) l->data);
[0e1846]397    return NULL;
398  }
399  else
400    return v;
401}
[d754b7]402
403static void SentQuitMsg(si_link l)
[0e1846]404{
[c232af]405  leftv v = (leftv) omAlloc0Bin(sleftv_bin);
[d754b7]406
407  v->rtyp = STRING_CMD;
[9bffb9c]408  v->data = (void *)MPSR_QUIT_STRING;
[d754b7]409  slWriteMP(l, v);
[c232af]410  omFreeBin(v, sleftv_bin);
[d754b7]411}
412
[6b32990]413LINKAGE BOOLEAN slCloseMP(si_link l)
[d754b7]414{
[50cbdc]415#ifdef HPUX_9
416  signal(SIGCHLD, (void (*)(int))SIG_DFL);
[3937ab]417#endif
[4e595a7]418  if ((strcmp(l->mode, "launch") == 0 || strcmp(l->mode, "fork") == 0) &&
[d754b7]419      (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyWriting) == MP_TRUE))
[561aa2]420  {
[d754b7]421    SentQuitMsg(l);
[561aa2]422    //wait(NULL);
423  }
[d754b7]424  MP_CloseLink((MP_Link_pt) l->data);
[50cbdc]425#ifdef HPUX_9
426  signal(SIGCHLD, (void (*)(int))SIG_IGN);
[3937ab]427#endif
[d754b7]428  SI_LINK_SET_CLOSE_P(l);
429  return FALSE;
[0e1846]430}
[286bd57]431
[6b32990]432LINKAGE BOOLEAN slKillMP(si_link l)
[80419f]433{
434  MP_KillLink((MP_Link_pt) l->data);
435  SI_LINK_SET_CLOSE_P(l);
436  return FALSE;
437}
[d754b7]438
[6b32990]439LINKAGE BOOLEAN slDumpMP(si_link l)
[286bd57]440{
441  mpsr_ClearError();
442  if (mpsr_PutDump((MP_Link_pt) l->data) != mpsr_Success)
443  {
444    mpsr_PrintError((MP_Link_pt) l->data);
445    return TRUE;
446  }
447  else
448    return FALSE;
449}
450
[6b32990]451LINKAGE BOOLEAN slGetDumpMP(si_link l)
[286bd57]452{
453  mpsr_ClearError();
454  if (mpsr_GetDump((MP_Link_pt) l->data) != mpsr_Success)
455  {
456    mpsr_PrintError((MP_Link_pt) l->data);
457    return TRUE;
458  }
459  else
460    return FALSE;
461}
462
[579451]463LINKAGE const char* slStatusMP(si_link l, const char* request)
[0e1846]464{
[d754b7]465  if (strcmp(request, "read") == 0)
466  {
467    if (SI_LINK_R_OPEN_P(l) &&
468        (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyReading) == MP_TRUE))
469        return "ready";
470    else return "not ready";
471  }
472  else if (strcmp(request, "write") == 0)
473  {
474    if (SI_LINK_W_OPEN_P(l) &&
475        (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyWriting) == MP_TRUE))
476        return "ready";
477    else return "not ready";
478  }
479  else return "unknown status request";
[0e1846]480}
481
[d754b7]482/***************************************************************
483 *
484 * MP batch stuff
485 *
486 ***************************************************************/
[0e1846]487
[6b32990]488static int Batch_ReadEval(si_link silink)
[4e595a7]489{
490  leftv v = NULL;
491  // establish top-level identifier for link
[b65d1d]492  idhdl id = enterid(omStrDup("link_ll"), 0, LINK_CMD, &IDROOT, FALSE);
[4e595a7]493  IDLINK(id) = silink;
494
495  // the main read-eval-write loop
[0d3f08]496  loop
[4e595a7]497  {
[12310e]498    errorreported = FALSE;
[4e595a7]499    v = slRead(silink, v);
[12310e]500    if (feErrors != NULL && *feErrors != '\0')
[4e595a7]501    {
502      if (v != NULL) v->CleanUp();
[c232af]503      v = mpsr_InitLeftv(STRING_CMD, (void *) omStrDup(feErrors));
[12310e]504      *feErrors = '\0';
[4e595a7]505    }
506
507    // no need to evaluate -- it is done in the read
508    if (v->Typ() == STRING_CMD &&
509        (strcmp((char *)v->Data(), MPSR_QUIT_STRING)  == 0))
510    {
511      slKill(silink);
512      return 0;
513    }
514
515    slWriteMP(silink, v);
516
517    if (v != NULL)
518    {
519      v->CleanUp();
[c232af]520      omFreeBin(v, sleftv_bin);
[4e595a7]521      v = NULL;
522    }
523  }
524  // should never get here
525  return 1;
526}
527
[d754b7]528// #define MPSR_BATCH_DEBUG
[cc0296]529#ifdef MPSR_BATCH_DEBUG
[286bd57]530static BOOLEAN stop = 1;
[cc0296]531#endif
532
[f11262]533
[6b32990]534LINKAGE int Batch_do(const char* port, const char* host)
[0e1846]535{
[cc0296]536#ifdef MPSR_BATCH_DEBUG
537  fprintf(stderr, "Was started with pid %d\n", getpid());
538  while (stop){};
539#endif
[c232af]540  si_link silink = (si_link) omAlloc0Bin(sip_link_bin);
[d754b7]541  char *istr;
542
543  // parse argv to get port and host
544  if (port == NULL)
545  {
546    fprintf(stderr,
[eea2b0]547            "Need '--MPport portnumber' command line argument in batch modus\n");
[d754b7]548    return 1;
549  }
550  if (host == NULL)
551  {
552    fprintf(stderr,
[eea2b0]553            "Need '--MPhost hostname' command line argument in batch modus\n");
[d754b7]554    return 1;
555  }
556
557  // initialize si_link
[c232af]558  istr = (char *) omAlloc((strlen(port) + strlen(host) + 40)*sizeof(char));
[eea2b0]559  sprintf(istr, "MPtcp:connect --MPport %s --MPhost %s", port, host);
[d754b7]560  slInit(silink, istr);
[c232af]561  omFree(istr);
[d754b7]562  // open link
[b5f276e]563  if (slOpen(silink, SI_LINK_OPEN,NULL))
[d754b7]564  {
565    fprintf(stderr, "Batch side could not connect on port %s and host %s\n",
566            port, host);
[0e1846]567    return 1;
[d754b7]568  }
569
[4e595a7]570  return Batch_ReadEval(silink);
[0e1846]571}
[d754b7]572#endif
Note: See TracBrowser for help on using the repository browser.