source: git/Singular/sing_mp.cc @ f4edee

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