source: git/Singular/mpsr_sl.cc @ 6b32990

spielwiese
Last change on this file since 6b32990 was 6b32990, checked in by Olaf Bachmann <obachman@…>, 23 years ago
* dynamic kernel modules for MP and DBM links * p_Procs improvements git-svn-id: file:///usr/local/Singular/svn/trunk@4865 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 12.1 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/***************************************************************
5 *  File:    mpsr_sl.cc
6 *  Purpose: implementation of sl_link routines for MP
7 *  Author:  obachman (Olaf Bachmann)
8 *  Created: 12/00
9 *  Version: $Id: mpsr_sl.cc,v 1.1 2000-12-12 08:44:49 obachman Exp $
10 *******************************************************************/
11
12#include "mod2.h"
13
14#ifdef HAVE_MPSR
15
16#include <stdio.h>
17#include <string.h>
18#include <unistd.h>
19#include "mpsr.h"
20#include "tok.h"
21#include "omalloc.h"
22#include "febase.h"
23#include "subexpr.h"
24#include "ipid.h"
25#include "silink.h"
26#include "feOpt.h"
27
28
29static int Batch_ReadEval(si_link silink);
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
39static MP_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    omFree(argv[i]);
47
48  if (argv) omFreeSize(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=omStrDup(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 **) omAlloc0(i*sizeof(char *));
83      if (appl != NULL) i -= 2;
84      if (i>0)
85      {
86        strcpy(s2,str);
87        *argv[0] = omStrDup(strtok(s2, " "));
88        for(j = 1; j <i; j++)
89          (*argv)[j] = omStrDup(strtok(NULL, " "));
90      }
91    }
92    else
93      *argv = NULL;
94
95    if (appl != NULL)
96    {
97      (*argv)[*argc -2] = omStrDup("--MPapplication");
98      (*argv)[*argc -1] = omStrDup(&(appl[15]));
99    }
100
101    omFree(s2);
102  }
103
104}
105
106/***************************************************************
107 *
108 * MPfile  specific stuff
109 *
110 ***************************************************************/
111LINKAGE 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 = omStrDup(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 || (MPT_Init(mp_Env) != MPT_Success))
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  omFree(l->mode);
161  l->mode = omStrDup(mode);
162  return FALSE;
163}
164
165/***************************************************************
166 *
167 * MPtcp  specific stuff
168 *
169 ***************************************************************/
170
171LINKAGE MP_Link_pt slOpenMPConnect(int n_argc, char **n_argv)
172{
173  char *argv[] = {"--MPtransp", "TCP", "--MPmode", "connect", "--MPport",
174                  "1025",  "--MPhost", "localhost"};
175
176  char *port = IMP_GetCmdlineArg(n_argc, n_argv, "--MPport");
177  char *host = IMP_GetCmdlineArg(n_argc, n_argv, "--MPhost");
178
179  if (port == NULL) port = (char*) feOptValue(FE_OPT_MPPORT);
180  if (host == NULL) host = (char*) feOptValue(FE_OPT_MPHOST);
181
182  if (port != NULL)
183    argv[5] = port;
184  if (host != NULL)
185    argv[7] = host;
186  else
187    argv[7] = mp_Env->thishost;
188
189  return MP_OpenLink(mp_Env, 8, argv);
190}
191
192LINKAGE MP_Link_pt slOpenMPListen(int n_argc, char **n_argv)
193{
194  char *argv[] = {"--MPtransp", "TCP", "--MPmode", "listen",
195                  "--MPport", "1025"};
196  char *port = IMP_GetCmdlineArg(n_argc, n_argv, "--MPport");
197
198  if (port == NULL) port = (char*) feOptValue(FE_OPT_MPHOST);
199
200  if (port != NULL) argv[5] = port;
201
202  return MP_OpenLink(mp_Env, 6, argv);
203}
204
205MP_Link_pt slOpenMPLaunch(int n_argc, char **n_argv)
206{
207  char *argv[] = {"--MPtransp", "TCP", "--MPmode", "launch",
208                  "--MPhost", "localhost",
209                  "--MPapplication", "Singular -bq  --no-warn --no-out --no-rc",
210                  "--MPrsh", "rsh"};
211  char *appl = IMP_GetCmdlineArg(n_argc, n_argv, "--MPapplication");
212  char *host = IMP_GetCmdlineArg(n_argc, n_argv, "--MPhost");
213  char *rsh = IMP_GetCmdlineArg(n_argc, n_argv, "--MPrsh");
214  char* nappl = NULL;
215  MP_Link_pt link;
216  int argc = 8;
217
218  if (appl == NULL && (host == NULL ||
219                       strcmp(host, "localhost") == 0))
220  {
221    appl = feResource("Singular");
222
223    if (appl != NULL)
224    {
225      nappl = (char*) omAlloc(MAXPATHLEN + 50);
226      strcpy(nappl, appl);
227      strcat(nappl, " -bq --no-warn --no-out --no-rc");
228      appl = nappl;
229    }
230  }
231
232  if ((host == NULL)||(strcmp(host, "localhost") == 0))
233  {
234    argv[5] = mp_Env->thishost;
235  }
236  else
237    argv[5] = host;
238
239  if (appl != NULL)
240    argv[7] = appl;
241
242
243  if (rsh != NULL)
244  {
245    argv[9] = rsh;
246    argc = 10;
247  }
248
249  link = MP_OpenLink(mp_Env, argc, argv);
250  if (nappl != NULL) omFreeSize(nappl, MAXPATHLEN + 50);
251  return link;
252}
253
254LINKAGE MP_Link_pt slOpenMPFork(si_link l, int n_argc, char **n_argv)
255{
256  MP_Link_pt link = NULL;
257  char *argv[] = {"--MPtransp", "TCP", "--MPmode", "fork", "--MPport", "1703"};
258  char *port = IMP_GetCmdlineArg(n_argc, n_argv, "--MPport");
259
260  if (port != NULL) argv[5] = port;
261
262  link = MP_OpenLink(mp_Env, 6, argv);
263  if (link != NULL)
264  {
265    if (MP_GetLinkStatus(link, MP_LinkIsParent))
266    {
267    /* parent's business */
268      if (l->name != NULL) omFree(l->name);
269      l->name = omStrDup("parent");
270      return link;
271    }
272    else
273    {
274      /* child's business -- go into batch mode */
275      if (l->name != NULL) omFree(l->name);
276      l->name = omStrDup("child");
277      MP_SET_LINK_OPTIONS(link);
278      SI_LINK_SET_RW_OPEN_P(l);
279      l->data = (void *) link;
280      fe_fgets_stdin=fe_fgets_dummy;
281      _exit(Batch_ReadEval(slCopy(l)));
282    }
283  }
284  else
285  {
286    /* only parent can get here */
287    return NULL;
288  }
289}
290
291
292
293LINKAGE BOOLEAN slOpenMPTcp(si_link l, short flag)
294{
295  MP_Link_pt link = NULL;
296  char **argv;
297  int argc;
298
299  GetCmdArgs(&argc, &argv, l->name);
300
301  if (mp_Env == NULL)
302    mp_Env = MP_InitializeEnv(MP_AllocateEnv());
303
304  if (mp_Env == NULL)
305  {
306    WerrorS("Open: Error in initialization of MP environment");
307    return TRUE;
308  }
309
310  if (strcmp(l->mode, "connect") == 0) link = slOpenMPConnect(argc, argv);
311  else if (strcmp(l->mode, "listen") == 0) link = slOpenMPListen(argc, argv);
312  else if (strcmp(l->mode, "launch") == 0) link = slOpenMPLaunch(argc, argv);
313  else
314  {
315    if (strcmp(l->mode, "fork") != 0)
316    {
317      if (l->mode != NULL) omFree(l->mode);
318      l->mode = omStrDup("fork");
319    }
320    link = slOpenMPFork(l, argc, argv);
321  }
322
323  FreeCmdArgs(argc, argv);
324
325  if (link != NULL)
326  {
327    MP_SET_LINK_OPTIONS(link);
328    SI_LINK_SET_RW_OPEN_P(l);
329    l->data = (void *) link;
330    return FALSE;
331  }
332  else return TRUE;
333}
334
335/***************************************************************
336 *
337 * MP general stuff
338 *
339 ***************************************************************/
340
341LINKAGE BOOLEAN slWriteMP(si_link l, leftv v)
342{
343  leftv next = (v != NULL ? v->next : (leftv) NULL);
344  mpsr_ClearError();
345
346  // writing is done with one leftv at a time
347  if (v != NULL) v->next = NULL; // hence, we need to set next to NULL
348  if (mpsr_PutMsg((MP_Link_pt) l->data, v) != mpsr_Success)
349  {
350    mpsr_PrintError((MP_Link_pt) l->data);
351    if (v != NULL) v->next = next;
352    return TRUE;
353  }
354
355  // take care of the remaining leftv's
356  while (next != NULL)
357  {
358    v->next = next;
359    v = next;
360    next = v->next;
361    v->next = NULL;
362    if (mpsr_PutMsg((MP_Link_pt) l->data, v) != mpsr_Success)
363    {
364      mpsr_PrintError((MP_Link_pt) l->data);
365      v->next = next;
366      return TRUE;
367    }
368  }
369  return FALSE;
370}
371
372LINKAGE leftv slReadMP(si_link l)
373{
374  leftv v = NULL;
375  mpsr_ClearError();
376  if (mpsr_GetMsg((MP_Link_pt) l->data, v) != mpsr_Success)
377  {
378    mpsr_PrintError((MP_Link_pt) l->data);
379    return NULL;
380  }
381  else
382    return v;
383}
384
385static void SentQuitMsg(si_link l)
386{
387  leftv v = (leftv) omAlloc0Bin(sleftv_bin);
388
389  v->rtyp = STRING_CMD;
390  v->data = (void *)MPSR_QUIT_STRING;
391  slWriteMP(l, v);
392  omFreeBin(v, sleftv_bin);
393}
394
395LINKAGE BOOLEAN slCloseMP(si_link l)
396{
397  if ((strcmp(l->mode, "launch") == 0 || strcmp(l->mode, "fork") == 0) &&
398      (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyWriting) == MP_TRUE))
399    SentQuitMsg(l);
400  MP_CloseLink((MP_Link_pt) l->data);
401  SI_LINK_SET_CLOSE_P(l);
402  return FALSE;
403}
404
405LINKAGE BOOLEAN slKillMP(si_link l)
406{
407  MP_KillLink((MP_Link_pt) l->data);
408  SI_LINK_SET_CLOSE_P(l);
409  return FALSE;
410}
411
412LINKAGE BOOLEAN slDumpMP(si_link l)
413{
414  mpsr_ClearError();
415  if (mpsr_PutDump((MP_Link_pt) l->data) != mpsr_Success)
416  {
417    mpsr_PrintError((MP_Link_pt) l->data);
418    return TRUE;
419  }
420  else
421    return FALSE;
422}
423
424LINKAGE BOOLEAN slGetDumpMP(si_link l)
425{
426  mpsr_ClearError();
427  if (mpsr_GetDump((MP_Link_pt) l->data) != mpsr_Success)
428  {
429    mpsr_PrintError((MP_Link_pt) l->data);
430    return TRUE;
431  }
432  else
433    return FALSE;
434}
435
436LINKAGE char* slStatusMP(si_link l, char* request)
437{
438  if (strcmp(request, "read") == 0)
439  {
440    if (SI_LINK_R_OPEN_P(l) &&
441        (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyReading) == MP_TRUE))
442        return "ready";
443    else return "not ready";
444  }
445  else if (strcmp(request, "write") == 0)
446  {
447    if (SI_LINK_W_OPEN_P(l) &&
448        (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyWriting) == MP_TRUE))
449        return "ready";
450    else return "not ready";
451  }
452  else return "unknown status request";
453}
454
455/***************************************************************
456 *
457 * MP batch stuff
458 *
459 ***************************************************************/
460
461static int Batch_ReadEval(si_link silink)
462{
463  leftv v = NULL;
464  // establish top-level identifier for link
465  idhdl id = enterid(omStrDup("mp_ll"), 0, LINK_CMD, &IDROOT, FALSE);
466  IDLINK(id) = silink;
467
468  // the main read-eval-write loop
469  loop
470  {
471    errorreported = FALSE;
472    v = slRead(silink, v);
473    if (feErrors != NULL && *feErrors != '\0')
474    {
475      if (v != NULL) v->CleanUp();
476      v = mpsr_InitLeftv(STRING_CMD, (void *) omStrDup(feErrors));
477      *feErrors = '\0';
478    }
479
480    // no need to evaluate -- it is done in the read
481    if (v->Typ() == STRING_CMD &&
482        (strcmp((char *)v->Data(), MPSR_QUIT_STRING)  == 0))
483    {
484      slKill(silink);
485      return 0;
486    }
487
488    slWriteMP(silink, v);
489
490    if (v != NULL)
491    {
492      v->CleanUp();
493      omFreeBin(v, sleftv_bin);
494      v = NULL;
495    }
496  }
497  // should never get here
498  return 1;
499}
500
501// #define MPSR_BATCH_DEBUG
502#ifdef MPSR_BATCH_DEBUG
503static BOOLEAN stop = 1;
504#endif
505
506
507LINKAGE int Batch_do(const char* port, const char* host)
508{
509#ifdef MPSR_BATCH_DEBUG
510  fprintf(stderr, "Was started with pid %d\n", getpid());
511  while (stop){};
512#endif
513  si_link silink = (si_link) omAlloc0Bin(sip_link_bin);
514  char *istr;
515
516  // parse argv to get port and host
517  if (port == NULL)
518  {
519    fprintf(stderr,
520            "Need '--MPport portnumber' command line argument in batch modus\n");
521    return 1;
522  }
523  if (host == NULL)
524  {
525    fprintf(stderr,
526            "Need '--MPhost hostname' command line argument in batch modus\n");
527    return 1;
528  }
529
530  // initialize si_link
531  istr = (char *) omAlloc((strlen(port) + strlen(host) + 40)*sizeof(char));
532  sprintf(istr, "MPtcp:connect --MPport %s --MPhost %s", port, host);
533  slInit(silink, istr);
534  omFree(istr);
535  // open link
536  if (slOpen(silink, SI_LINK_OPEN))
537  {
538    fprintf(stderr, "Batch side could not connect on port %s and host %s\n",
539            port, host);
540    return 1;
541  }
542
543  return Batch_ReadEval(silink);
544}
545#endif
Note: See TracBrowser for help on using the repository browser.