source: git/Singular/sing_mp.cc @ 3a20c1

fieker-DuValspielwiese
Last change on this file since 3a20c1 was bde08b, checked in by Olaf Bachmann <obachman@…>, 27 years ago
Wed Jun 11 09:56:05 1997 Olaf Bachmann <obachman@ratchwum.mathematik.uni-kl.de (Olaf Bachmann)> * longrat.[cc,h], tesths.cc, Makefile.in, configure.in: added support for smallgmp Tue Jun 10 17:25:28 1997 Olaf Bachmann <obachman@ratchwum.mathematik.uni-kl.de (Olaf Bachmann)> * sing_mp.cc: Got rid off warnings, when incomplete link specs git-svn-id: file:///usr/local/Singular/svn/trunk@382 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 11.5 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: sing_mp.cc,v 1.14 1997-06-11 08:00:15 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#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)
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 ***************************************************************/
166
167static MP_Link_pt slOpenMPConnect(int n_argc, char **n_argv)
168{
169  char *argv[] = {"-MPtransp", "TCP", "-MPmode", "connect", "-MPport",
170                  "1025",  "-MPhost", "localhost"};
171  char *port = IMP_GetCmdlineArg(n_argc, n_argv, "-MPport");
172  char *host = IMP_GetCmdlineArg(n_argc, n_argv, "-MPhost");
173
174
175  if (port != NULL) argv[5] = port;
176
177  if (host == NULL)
178  {
179    argv[7] = mp_Env->thishost;
180  }
181  else
182    argv[7] = host;
183
184  return MP_OpenLink(mp_Env, 8, argv);
185}
186
187static MP_Link_pt slOpenMPListen(int n_argc, char **n_argv)
188{
189  char *argv[] = {"-MPtransp", "TCP", "-MPmode", "listen", "-MPport", "1025"};
190  char *port = IMP_GetCmdlineArg(n_argc, n_argv, "-MPport");
191
192  if (port != NULL) argv[5] = port;
193
194  return MP_OpenLink(mp_Env, 6, argv);
195}
196
197static MP_Link_pt slOpenMPLaunch(int n_argc, char **n_argv)
198{
199  char *argv[] = {"-MPtransp", "TCP", "-MPmode", "launch",
200                  "-MPhost", "localhost", "-MPapplication", "Singular -b"};
201  char *appl = IMP_GetCmdlineArg(n_argc, n_argv, "-MPapplication");
202  char *host = IMP_GetCmdlineArg(n_argc, n_argv, "-MPhost");
203
204
205  if (appl != NULL) argv[7] = appl;
206
207  if (host == NULL)
208  {
209    argv[5] = mp_Env->thishost;
210  }
211  else
212    argv[5] = host;
213
214  return MP_OpenLink(mp_Env, 8, argv);
215}
216
217static MP_Link_pt slOpenMPFork(si_link l, int n_argc, char **n_argv)
218{
219  MP_Link_pt link = NULL;
220  char *argv[] = {"-MPtransp", "TCP", "-MPmode", "fork", "-MPport", "1703"};
221  char *port = IMP_GetCmdlineArg(n_argc, n_argv, "-MPport");
222
223  if (port != NULL) argv[5] = port;
224
225  link = MP_OpenLink(mp_Env, 6, argv);   
226  if (link != NULL)
227  {
228    if (MP_GetLinkStatus(link, MP_LinkIsParent))
229    {
230    /* parent's business */
231      if (l->name != NULL) FreeL(l->name);
232      l->name = mstrdup("parent");
233      return link;
234    }
235    else
236    {
237      /* child's business -- go into batch mode */
238      if (l->name != NULL) FreeL(l->name);
239      l->name = mstrdup("child");
240      MP_SET_LINK_OPTIONS(link);
241      SI_LINK_SET_RW_OPEN_P(l);
242      l->data = (void *) link;
243      feBatch=TRUE;
244      _exit(Batch_ReadEval(slCopy(l)));
245    }
246  }
247  else
248  {
249    /* only parent can get here */
250    return NULL;
251  }
252}
253
254   
255                               
256static BOOLEAN slOpenMPTcp(si_link l, short flag)
257{
258  MP_Link_pt link = NULL;
259  char **argv;
260  int argc;
261 
262  GetCmdArgs(&argc, &argv, l->name);
263 
264  if (mp_Env == NULL)
265    mp_Env = MP_InitializeEnv(MP_AllocateEnv());
266
267  if (mp_Env == NULL)
268  {
269    WerrorS("Open: Error in initialization of MP environment");
270    return TRUE;
271  }
272
273  if (strcmp(l->mode, "connect") == 0) link = slOpenMPConnect(argc, argv);
274  else if (strcmp(l->mode, "listen") == 0) link = slOpenMPListen(argc, argv);
275  else if (strcmp(l->mode, "launch") == 0) link = slOpenMPLaunch(argc, argv);
276  else
277  {
278    if (strcmp(l->mode, "fork") != 0)
279    {
280      if (l->mode != NULL) FreeL(l->mode);
281      l->mode = mstrdup("fork");
282    }
283    link = slOpenMPFork(l, argc, argv);
284  }
285
286  FreeCmdArgs(argc, argv);
287 
288  if (link != NULL)
289  {
290    MP_SET_LINK_OPTIONS(link);
291    SI_LINK_SET_RW_OPEN_P(l);
292    l->data = (void *) link;
293    return FALSE;
294  }
295  else return TRUE;
296}
297
298/***************************************************************
299 *
300 * MP general stuff
301 *
302 ***************************************************************/
303
304static BOOLEAN slWriteMP(si_link l, leftv v)
305{
306  leftv next = (v != NULL ? v->next : (leftv) NULL);
307  mpsr_ClearError();
308
309  // writing is done with one leftv at a time
310  if (v != NULL) v->next = NULL; // hence, we need to set next to NULL
311  if (mpsr_PutMsg((MP_Link_pt) l->data, v) != mpsr_Success)
312  {
313    mpsr_PrintError((MP_Link_pt) l->data);
314    if (v != NULL) v->next = next;
315    return TRUE;
316  }
317
318  // take care of the remaining leftv's
319  while (next != NULL)
320  {
321    v->next = next;
322    v = next;
323    next = v->next;
324    v->next = NULL;
325    if (mpsr_PutMsg((MP_Link_pt) l->data, v) != mpsr_Success)
326    {
327      mpsr_PrintError((MP_Link_pt) l->data);
328      v->next = next;
329      return TRUE;
330    }
331  }
332  return FALSE;
333}
334
335leftv slReadMP(si_link l)
336{
337  leftv v = NULL;
338  mpsr_ClearError();
339  if (mpsr_GetMsg((MP_Link_pt) l->data, v) != mpsr_Success)
340  {
341    mpsr_PrintError((MP_Link_pt) l->data);
342    return NULL;
343  }
344  else
345    return v;
346}
347
348static void SentQuitMsg(si_link l)
349{
350  leftv v = (leftv) Alloc0(sizeof(sleftv));
351
352  v->rtyp = STRING_CMD;
353  v->data = MPSR_QUIT_STRING;
354  slWriteMP(l, v);
355  Free(v, sizeof(sleftv));
356}
357
358static BOOLEAN slCloseMP(si_link l)
359{
360  if ((strcmp(l->mode, "launch") == 0 || strcmp(l->mode, "fork") == 0) &&
361      (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyWriting) == MP_TRUE))
362    SentQuitMsg(l);
363  MP_CloseLink((MP_Link_pt) l->data);
364  SI_LINK_SET_CLOSE_P(l);
365  return FALSE;
366}
367
368
369static BOOLEAN slDumpMP(si_link l)
370{
371  mpsr_ClearError();
372  if (mpsr_PutDump((MP_Link_pt) l->data) != mpsr_Success)
373  {
374    mpsr_PrintError((MP_Link_pt) l->data);
375    return TRUE;
376  }
377  else
378    return FALSE;
379}
380
381static BOOLEAN slGetDumpMP(si_link l)
382{
383  mpsr_ClearError();
384  if (mpsr_GetDump((MP_Link_pt) l->data) != mpsr_Success)
385  {
386    mpsr_PrintError((MP_Link_pt) l->data);
387    return TRUE;
388  }
389  else
390    return FALSE;
391}
392
393static char* slStatusMP(si_link l, char* request)
394{
395  if (strcmp(request, "read") == 0)
396  {
397    if (SI_LINK_R_OPEN_P(l) &&
398        (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyReading) == MP_TRUE))
399        return "ready";
400    else return "not ready";
401  }
402  else if (strcmp(request, "write") == 0)
403  {
404    if (SI_LINK_W_OPEN_P(l) &&
405        (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyWriting) == MP_TRUE))
406        return "ready";
407    else return "not ready";
408  }
409  else return "unknown status request";
410}
411
412/***************************************************************
413 *
414 * MP batch stuff
415 *
416 ***************************************************************/
417
418int Batch_ReadEval(si_link silink)
419{
420  leftv v = NULL;
421  // establish top-level identifier for link
422  idhdl id = enterid(mstrdup("mp_ll"), 0, LINK_CMD, &idroot, FALSE);
423  IDLINK(id) = silink;
424
425  // the main read-eval-write loop
426  while(1)
427  {
428    v = slRead(silink, v);
429    if (feErrors != NULL)
430    {
431      if (v != NULL) v->CleanUp();
432      v = mpsr_InitLeftv(STRING_CMD, (void *) feErrors);
433      feErrors = NULL;
434    }
435
436    // no need to evaluate -- it is done in the read
437    if (v->Typ() == STRING_CMD &&
438        (strcmp((char *)v->Data(), MPSR_QUIT_STRING)  == 0))
439    {
440      slKill(silink);
441      return 0;
442    }
443
444    slWriteMP(silink, v);
445
446    if (v != NULL)
447    {
448      v->CleanUp();
449      Free(v, sizeof(sleftv));
450      v = NULL;
451    }
452  }
453  // should never get here
454  return 1;
455}
456
457// #define MPSR_BATCH_DEBUG
458#ifdef MPSR_BATCH_DEBUG
459static BOOLEAN stop = 1;
460#endif
461
462int Batch_do(int argc, char **argv)
463{
464#ifdef MPSR_BATCH_DEBUG
465  fprintf(stderr, "Was started with pid %d\n", getpid());
466  while (stop){};
467#endif
468  si_link silink = (si_link) Alloc0(sizeof(sip_link));
469  char *port = IMP_GetCmdlineArg(argc, argv, "-MPport");
470  char *host = IMP_GetCmdlineArg(argc, argv, "-MPhost");
471  char *istr;
472
473  // parse argv to get port and host
474  if (port == NULL)
475  {
476    fprintf(stderr,
477            "Need '-MPport portnumber' command line argument in batch modus\n");
478    return 1;
479  }
480  if (host == NULL)
481  {
482    fprintf(stderr,
483            "Need '-MPhost hostname' command line argument in batch modus\n");
484    return 1;
485  }
486
487  // initialize si_link
488  istr = (char *) AllocL((strlen(port) + strlen(host) + 40)*sizeof(char));
489  sprintf(istr, "MPtcp:connect -MPport %s -MPhost %s", port, host);
490  slInit(silink, istr);
491  FreeL(istr);
492  // open link
493  if (slOpen(silink, SI_LINK_OPEN))
494  {
495    fprintf(stderr, "Batch side could not connect on port %s and host %s\n",
496            port, host);
497    return 1;
498  }
499
500  return Batch_ReadEval(silink);
501}
502
503
504/***************************************************************
505 *
506 * MP link Extension inits
507 *
508 ***************************************************************/
509
510void slInitMPFileExtension(si_link_extension s)
511{
512  s->Open=slOpenMPFile;
513  s->Close=slCloseMP;
514  s->Read=slReadMP;
515  //s->Read2=NULL;
516  s->Dump=slDumpMP;
517  s->GetDump=slGetDumpMP;
518  s->Write=slWriteMP;
519  s->Status=slStatusMP;
520  s->type="MPfile";
521}
522
523void slInitMPTcpExtension(si_link_extension s)
524{
525  s->Open=slOpenMPTcp;
526  s->Close=slCloseMP;
527  s->Read=slReadMP;
528  //s->Read2=NULL;
529  s->Dump=slDumpMP;
530  s->GetDump=slGetDumpMP;
531  s->Write=slWriteMP;
532  s->Status=slStatusMP;
533  s->type="MPtcp";
534}
535
536#endif
537
Note: See TracBrowser for help on using the repository browser.