source: git/Singular/sing_mp.cc @ 33471f8

fieker-DuValspielwiese
Last change on this file since 33471f8 was 12310e, checked in by Olaf Bachmann <obachman@…>, 26 years ago
* merged in changes from version 1.2.2 * mpsr stuff changes to reflect changes in MP git-svn-id: file:///usr/local/Singular/svn/trunk@2573 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 12.5 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: sing_mp.cc,v 1.21 1998-10-15 11:46:06 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)
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",  "--MPrsh", "rsh",
211                  "--MPapplication", "Singular -bq  --no-stdlib --no-rc"};
212  char *appl = IMP_GetCmdlineArg(n_argc, n_argv, "--MPapplication");
213  char *host = IMP_GetCmdlineArg(n_argc, n_argv, "--MPhost");
214  char *rsh = IMP_GetCmdlineArg(n_argc, n_argv, "--MPrsh");
215  char* nappl = NULL;
216  MP_Link_pt link;
217
218
219  if (appl == NULL && (host == NULL || 
220                       strcmp(host, "localhost") == 0))
221  {
222    appl = feGetExpandedExecutable();
223   
224    if (appl != NULL)
225    {
226      nappl = (char*) Alloc(MAXPATHLEN + 24);
227      strcpy(nappl, appl);
228      strcat(nappl, " -bq");
229      appl = nappl;
230    }
231  }
232 
233  if (appl != NULL) 
234    argv[9] = appl;
235
236  if (host == NULL)
237  {
238    argv[5] = mp_Env->thishost;
239  }
240  else
241    argv[5] = host;
242
243  if (rsh != NULL)
244  {
245    argv[7] = rsh;
246  }
247
248  link = MP_OpenLink(mp_Env, 10, argv);
249  if (nappl != NULL) Free(nappl, MAXPATHLEN + 24);
250  return link;
251}
252
253static MP_Link_pt slOpenMPFork(si_link l, int n_argc, char **n_argv)
254{
255  MP_Link_pt link = NULL;
256  char *argv[] = {"--MPtransp", "TCP", "--MPmode", "fork", "--MPport", "1703"};
257  char *port = IMP_GetCmdlineArg(n_argc, n_argv, "--MPport");
258
259  if (port != NULL) argv[5] = port;
260
261  link = MP_OpenLink(mp_Env, 6, argv);   
262  if (link != NULL)
263  {
264    if (MP_GetLinkStatus(link, MP_LinkIsParent))
265    {
266    /* parent's business */
267      if (l->name != NULL) FreeL(l->name);
268      l->name = mstrdup("parent");
269      return link;
270    }
271    else
272    {
273      /* child's business -- go into batch mode */
274      if (l->name != NULL) FreeL(l->name);
275      l->name = mstrdup("child");
276      MP_SET_LINK_OPTIONS(link);
277      SI_LINK_SET_RW_OPEN_P(l);
278      l->data = (void *) link;
279      feBatch=TRUE;
280      _exit(Batch_ReadEval(slCopy(l)));
281    }
282  }
283  else
284  {
285    /* only parent can get here */
286    return NULL;
287  }
288}
289
290   
291                               
292static BOOLEAN slOpenMPTcp(si_link l, short flag)
293{
294  MP_Link_pt link = NULL;
295  char **argv;
296  int argc;
297 
298  GetCmdArgs(&argc, &argv, l->name);
299 
300  if (mp_Env == NULL)
301    mp_Env = MP_InitializeEnv(MP_AllocateEnv());
302
303  if (mp_Env == NULL)
304  {
305    WerrorS("Open: Error in initialization of MP environment");
306    return TRUE;
307  }
308
309  if (strcmp(l->mode, "connect") == 0) link = slOpenMPConnect(argc, argv);
310  else if (strcmp(l->mode, "listen") == 0) link = slOpenMPListen(argc, argv);
311  else if (strcmp(l->mode, "launch") == 0) link = slOpenMPLaunch(argc, argv);
312  else
313  {
314    if (strcmp(l->mode, "fork") != 0)
315    {
316      if (l->mode != NULL) FreeL(l->mode);
317      l->mode = mstrdup("fork");
318    }
319    link = slOpenMPFork(l, argc, argv);
320  }
321
322  FreeCmdArgs(argc, argv);
323 
324  if (link != NULL)
325  {
326    MP_SET_LINK_OPTIONS(link);
327    SI_LINK_SET_RW_OPEN_P(l);
328    l->data = (void *) link;
329    return FALSE;
330  }
331  else return TRUE;
332}
333
334/***************************************************************
335 *
336 * MP general stuff
337 *
338 ***************************************************************/
339
340static BOOLEAN slWriteMP(si_link l, leftv v)
341{
342  leftv next = (v != NULL ? v->next : (leftv) NULL);
343  mpsr_ClearError();
344
345  // writing is done with one leftv at a time
346  if (v != NULL) v->next = NULL; // hence, we need to set next to NULL
347  if (mpsr_PutMsg((MP_Link_pt) l->data, v) != mpsr_Success)
348  {
349    mpsr_PrintError((MP_Link_pt) l->data);
350    if (v != NULL) v->next = next;
351    return TRUE;
352  }
353
354  // take care of the remaining leftv's
355  while (next != NULL)
356  {
357    v->next = next;
358    v = next;
359    next = v->next;
360    v->next = NULL;
361    if (mpsr_PutMsg((MP_Link_pt) l->data, v) != mpsr_Success)
362    {
363      mpsr_PrintError((MP_Link_pt) l->data);
364      v->next = next;
365      return TRUE;
366    }
367  }
368  return FALSE;
369}
370
371leftv slReadMP(si_link l)
372{
373  leftv v = NULL;
374  mpsr_ClearError();
375  if (mpsr_GetMsg((MP_Link_pt) l->data, v) != mpsr_Success)
376  {
377    mpsr_PrintError((MP_Link_pt) l->data);
378    return NULL;
379  }
380  else
381    return v;
382}
383
384static void SentQuitMsg(si_link l)
385{
386  leftv v = (leftv) Alloc0(sizeof(sleftv));
387
388  v->rtyp = STRING_CMD;
389  v->data = MPSR_QUIT_STRING;
390  slWriteMP(l, v);
391  Free(v, sizeof(sleftv));
392}
393
394static BOOLEAN slCloseMP(si_link l)
395{
396  if ((strcmp(l->mode, "launch") == 0 || strcmp(l->mode, "fork") == 0) &&
397      (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyWriting) == MP_TRUE))
398    SentQuitMsg(l);
399  MP_CloseLink((MP_Link_pt) l->data);
400  SI_LINK_SET_CLOSE_P(l);
401  return FALSE;
402}
403
404static BOOLEAN slKillMP(si_link l)
405{
406  MP_KillLink((MP_Link_pt) l->data);
407  SI_LINK_SET_CLOSE_P(l);
408  return FALSE;
409}
410
411static BOOLEAN slDumpMP(si_link l)
412{
413  mpsr_ClearError();
414  if (mpsr_PutDump((MP_Link_pt) l->data) != mpsr_Success)
415  {
416    mpsr_PrintError((MP_Link_pt) l->data);
417    return TRUE;
418  }
419  else
420    return FALSE;
421}
422
423static BOOLEAN slGetDumpMP(si_link l)
424{
425  mpsr_ClearError();
426  if (mpsr_GetDump((MP_Link_pt) l->data) != mpsr_Success)
427  {
428    mpsr_PrintError((MP_Link_pt) l->data);
429    return TRUE;
430  }
431  else
432    return FALSE;
433}
434
435static char* slStatusMP(si_link l, char* request)
436{
437  if (strcmp(request, "read") == 0)
438  {
439    if (SI_LINK_R_OPEN_P(l) &&
440        (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyReading) == MP_TRUE))
441        return "ready";
442    else return "not ready";
443  }
444  else if (strcmp(request, "write") == 0)
445  {
446    if (SI_LINK_W_OPEN_P(l) &&
447        (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyWriting) == MP_TRUE))
448        return "ready";
449    else return "not ready";
450  }
451  else return "unknown status request";
452}
453
454/***************************************************************
455 *
456 * MP batch stuff
457 *
458 ***************************************************************/
459
460int Batch_ReadEval(si_link silink)
461{
462  leftv v = NULL;
463  // establish top-level identifier for link
464  idhdl id = enterid(mstrdup("mp_ll"), 0, LINK_CMD, &IDROOT, FALSE);
465  IDLINK(id) = silink;
466
467  // the main read-eval-write loop
468  while(1)
469  {
470    errorreported = FALSE;
471    v = slRead(silink, v);
472    if (feErrors != NULL && *feErrors != '\0')
473    {
474      if (v != NULL) v->CleanUp();
475      v = mpsr_InitLeftv(STRING_CMD, (void *) mstrdup(feErrors));
476      *feErrors = '\0';
477    }
478
479    // no need to evaluate -- it is done in the read
480    if (v->Typ() == STRING_CMD &&
481        (strcmp((char *)v->Data(), MPSR_QUIT_STRING)  == 0))
482    {
483      slKill(silink);
484      return 0;
485    }
486
487    slWriteMP(silink, v);
488
489    if (v != NULL)
490    {
491      v->CleanUp();
492      Free(v, sizeof(sleftv));
493      v = NULL;
494    }
495  }
496  // should never get here
497  return 1;
498}
499
500// #define MPSR_BATCH_DEBUG
501#ifdef MPSR_BATCH_DEBUG
502static BOOLEAN stop = 1;
503#endif
504
505 
506int Batch_do(const char* port, const char* host)
507{
508#ifdef MPSR_BATCH_DEBUG
509  fprintf(stderr, "Was started with pid %d\n", getpid());
510  while (stop){};
511#endif
512  si_link silink = (si_link) Alloc0(sizeof(sip_link));
513  char *istr;
514
515  // parse argv to get port and host
516  if (port == NULL)
517  {
518    fprintf(stderr,
519            "Need '--MPport portnumber' command line argument in batch modus\n");
520    return 1;
521  }
522  if (host == NULL)
523  {
524    fprintf(stderr,
525            "Need '--MPhost hostname' command line argument in batch modus\n");
526    return 1;
527  }
528
529  // initialize si_link
530  istr = (char *) AllocL((strlen(port) + strlen(host) + 40)*sizeof(char));
531  sprintf(istr, "MPtcp:connect --MPport %s --MPhost %s", port, host);
532  slInit(silink, istr);
533  FreeL(istr);
534  // open link
535  if (slOpen(silink, SI_LINK_OPEN))
536  {
537    fprintf(stderr, "Batch side could not connect on port %s and host %s\n",
538            port, host);
539    return 1;
540  }
541
542  return Batch_ReadEval(silink);
543}
544
545/***************************************************************
546 *
547 * MP link Extension inits
548 *
549 ***************************************************************/
550
551void slInitMPFileExtension(si_link_extension s)
552{
553  s->Open=slOpenMPFile;
554  s->Close=slCloseMP;
555  s->Close=slKillMP;
556  s->Read=slReadMP;
557  //s->Read2=NULL;
558  s->Dump=slDumpMP;
559  s->GetDump=slGetDumpMP;
560  s->Write=slWriteMP;
561  s->Status=slStatusMP;
562  s->type="MPfile";
563}
564
565void slInitMPTcpExtension(si_link_extension s)
566{
567  s->Open=slOpenMPTcp;
568  s->Close=slCloseMP;
569  s->Kill=slKillMP;
570  s->Read=slReadMP;
571  //s->Read2=NULL;
572  s->Dump=slDumpMP;
573  s->GetDump=slGetDumpMP;
574  s->Write=slWriteMP;
575  s->Status=slStatusMP;
576  s->type="MPtcp";
577}
578
579#endif
580
Note: See TracBrowser for help on using the repository browser.