source: git/Singular/sing_mp.cc @ 35fff9

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