source: git/Singular/mpsr_sl.cc @ d2f3863

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