source: git/Singular/sing_mp.cc @ 9bffb9c

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