source: git/Singular/sing_mp.cc @ 907274

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