source: git/Singular/mod_raw.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: 7.9 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: mod_raw.cc,v 1.10 2000-12-12 08:44:48 obachman Exp $ */
5/*
6 * ABSTRACT: machine depend code for dynamic modules
7 *
8 * Provides: dynl_open()
9 *           dynl_sym()
10 *           dynl_error()
11 *           dunl_close()
12*/
13
14#include <stdio.h>
15
16#include "mod2.h"
17#include "static.h"
18#ifdef HAVE_STATIC
19#undef HAVE_DL
20#endif
21
22#if defined(HAVE_DL)
23#include "mod_raw.h"
24#include "febase.h"
25
26/*****************************************************************************
27 *
28 * General section
29 * These are just wrappers around the repsective dynl_* calls
30 * which look for the binary in the bin_dir of Singular and ommit warnings if
31 * somethings goes wrong
32 *
33 *****************************************************************************/
34static BOOLEAN warn_handle = FALSE;
35static BOOLEAN warn_proc = FALSE;
36#ifndef DL_TAIL
37#define DL_TAIL "so"
38#endif
39
40void* dynl_open_binary_warn(char* binary_name, const char* msg)
41{
42  void* handle = NULL;
43  const char* bin_dir = feGetResource('b');
44  if (bin_dir != NULL)
45  {
46    char path_name[MAXPATHLEN];
47    sprintf(path_name, "%s%s%s.%s", bin_dir, DIR_SEPP, binary_name, 
48            DL_TAIL);
49    handle = dynl_open(path_name);
50    if (handle == NULL && ! warn_handle)
51    {
52      Warn("Could not open dynamic library: %s", path_name);
53      Warn("Error message from system: %s", dynl_error());
54      if (msg != NULL) Warn("%s", msg);
55      Warn("See the INSTALL section in the Singular manual for details.");
56      warn_handle = TRUE;
57    }
58  }
59  return  handle;
60}
61
62void* dynl_sym_warn(void* handle, char* proc, const char* msg)
63{
64  void *proc_ptr = NULL;
65  if (handle != NULL)
66  {
67    proc_ptr = dynl_sym(handle, proc);
68    if (proc_ptr == NULL && ! warn_proc)
69    {
70      Warn("Could load a procedure from a dynamic library");
71      Warn("Error message from system: %s", dynl_error());
72      if (msg != NULL) Warn("%s", msg);
73      Warn("See the INSTALL section in the Singular manual for details.");
74      warn_proc = TRUE;
75    }
76  }
77  return proc_ptr;
78}
79
80
81/*****************************************************************************
82 * SECTION ix86-linux / alpha-linux                                          *
83 *****************************************************************************/
84#if defined(ix86_Linux) || defined(DecAlpha_Linux) || defined(ix86_Linux_libc5)
85#include <dlfcn.h>
86
87static void* kernel_handle = NULL;
88void *dynl_open(
89  char *filename    /* I: filename to load */
90  )
91{
92  return(dlopen(filename, RTLD_NOW|RTLD_GLOBAL));
93}
94
95void *dynl_sym(void *handle, char *symbol)
96{
97  if (handle == DYNL_KERNEL_HANDLE)
98  {
99    if (kernel_handle == NULL)
100      kernel_handle = dynl_open(NULL);
101    handle = kernel_handle;
102  }
103  return(dlsym(handle, symbol));
104}
105
106int dynl_close (void *handle)
107{
108  return(dlclose (handle));
109}
110
111const char *dynl_error()
112{
113  return(dlerror());
114}
115#endif /* ix86_Linux */
116
117/*****************************************************************************
118 * SECTION HPUX-9/10                                                         *
119 *****************************************************************************/
120#if defined(HPUX_9) || defined(HPUX_10)
121#include <dl.h>
122
123typedef char *((*func_ptr) ());
124
125void *dynl_open(char *filename)
126{
127  shl_t           handle = shl_load(filename, BIND_DEFERRED, 0);
128
129  return ((void *) handle);
130}
131
132void *dynl_sym(void *handle, char *symbol)
133{
134  func_ptr        f;
135
136  if (shl_findsym((shl_t *) & handle, symbol, TYPE_PROCEDURE, &f) == -1)
137  {
138    if (shl_findsym((shl_t *) & handle, symbol, TYPE_UNDEFINED, &f) == -1)
139    {
140      f = (func_ptr) NULL;
141    }
142  }
143  return (f);
144}
145
146int dynl_close (void *handle)
147{
148  shl_unload((shl_t) handle);
149  return(0);
150}
151
152const char *dynl_error()
153{
154  static char errmsg[] = "shl_load failed";
155
156  return errmsg;
157}
158#endif /* HPUX_9  or HPUX_10 */
159
160/*****************************************************************************
161 * SECTION 68k-MPW                                                           *
162 *****************************************************************************/
163#ifdef 68k_MPW
164/* #    include <> */
165
166void *dynl_open(char *filename)
167{
168  return(NULL);
169}
170
171void *dynl_sym(void *handle, char *symbol)
172{
173  return(NULL);
174}
175
176int dynl_close (void *handle)
177{
178  return(0);
179}
180
181const char *dynl_error()
182{
183  static char errmsg[] = "support for dynamic loading not implemented";
184
185  return errmsg;
186}
187#  endif /* 68k_MPW */
188
189
190/*****************************************************************************
191 * SECTION AIX-4                                                             *
192 *****************************************************************************/
193#ifdef AIX_4
194/* #    include <> */
195
196void *dynl_open(char *filename)
197{
198  return(NULL);
199}
200
201void *dynl_sym(void *handle, char *symbol)
202{
203  return(NULL);
204}
205
206int dynl_close (void *handle)
207{
208  return(0);
209}
210
211const char *dynl_error()
212{
213  static char errmsg[] = "support for dynamic loading not implemented";
214
215  return errmsg;
216}
217#  endif /* AIX_4 */
218
219/*****************************************************************************
220 * SECTION IRIX-6                                                            *
221 *****************************************************************************/
222#ifdef IRIX_6
223/* #    include <> */
224
225void *dynl_open(char *filename)
226{
227  return(NULL);
228}
229
230void *dynl_sym(void *handle, char *symbol)
231{
232  return(NULL);
233}
234
235int dynl_close (void *handle)
236{
237  return(0);
238}
239
240const char *dynl_error()
241{
242  static char errmsg[] = "support for dynamic loading not implemented";
243
244  return errmsg;
245}
246#  endif /* IRIX_6 */
247
248/*****************************************************************************
249 * SECTION Sun3OS-4                                                          *
250 *****************************************************************************/
251#ifdef Sun3OS_4
252/* #    include <> */
253
254void *dynl_open(char *filename)
255{
256  return(NULL);
257}
258
259void *dynl_sym(void *handle, char *symbol)
260{
261  return(NULL);
262}
263
264int dynl_close (void *handle)
265{
266  return(0);
267}
268
269const char *dynl_error()
270{
271  static char errmsg[] = "support for dynamic loading not implemented";
272
273  return errmsg;
274}
275#endif /* Sun3OS_4 */
276
277/*****************************************************************************
278 * SECTION SunOS-4/5                                                         *
279 *****************************************************************************/
280#if defined(SunOS_4) || defined(SunOS_5)
281/* #    include <> */
282
283void *dynl_open(char *filename)
284{
285  return(NULL);
286}
287
288void *dynl_sym(void *handle, char *symbol)
289{
290  return(NULL);
291}
292
293int dynl_close (void *handle)
294{
295  return(0);
296}
297
298const char *dynl_error()
299{
300  static char errmsg[] = "support for dynamic loading not implemented";
301
302  return errmsg;
303}
304#endif /* SunOS_4 or SunOS_5 */
305
306/*****************************************************************************
307 * SECTION ix86-win                                                          *
308 *****************************************************************************/
309#ifdef ix86_win
310/* #    include <> */
311
312void *dynl_open(char *filename)
313{
314  return(NULL);
315}
316
317void *dynl_sym(void *handle, char *symbol)
318{
319  return(NULL);
320}
321
322int dynl_close (void *handle)
323{
324  return(0);
325}
326
327const char *dynl_error()
328{
329  static char errmsg[] = "support for dynamic loading not implemented";
330
331  return errmsg;
332}
333#endif /* ix86_win */
334
335/*****************************************************************************
336 * SECTION ppc-MPW                                                           *
337 *****************************************************************************/
338#ifdef ppc_MPW
339/* #    include <> */
340
341void *dynl_open(char *filename)
342{
343  return(NULL);
344}
345
346void *dynl_sym(void *handle, char *symbol)
347{
348  return(NULL);
349}
350
351int dynl_close (void *handle)
352{
353  return(0);
354}
355
356const char *dynl_error()
357{
358  static char errmsg[] = "support for dynamic loading not implemented";
359  return errmsg;
360}
361#  endif /* ppc_MPW */
362
363
364#endif /* HAVE_DL */
Note: See TracBrowser for help on using the repository browser.