source: git/Singular/p_Procs_Dynamic.cc @ 48aa42

fieker-DuValspielwiese
Last change on this file since 48aa42 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.1 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/***************************************************************
5 *  File:    p_Procs_Dynamic.cc
6 *  Purpose: source for dynamically loaded version of p_Procs
7 *  Author:  obachman (Olaf Bachmann)
8 *  Created: 12/00
9 *  Version: $Id: p_Procs_Dynamic.cc,v 1.2 2000-12-12 08:44:49 obachman Exp $
10 *******************************************************************/
11#include "mod2.h"
12#include "structs.h"
13#include "p_polys.h"
14#include "ring.h"
15#include "p_Procs.h"
16#include "p_Numbers.h"
17#include "p_MemCmp.h"
18#include "p_MemAdd.h"
19#include "p_MemCopy.h"
20#include "kbuckets.h"
21#include "dError.h"
22
23BOOLEAN p_procs_dynamic = TRUE;
24
25#define WARN_MSG "Singular will work properly, but much slower."
26
27// need external linkage, so that dynl_sym works
28#undef LINKAGE
29#define LINKAGE extern "C"
30#define p_Procs_Kernel
31#include "p_Procs_Dynamic.inc"
32
33#include "p_Procs_Dynamic.h"
34// include general p_Proc stuff
35#include "p_Procs_Impl.h"
36#include "mod_raw.h"
37
38// define to bound for length of p_Proc name
39#define MAX_PROCNAME_LEN 200
40
41static void* p_procs_handle_FieldIndep = NULL;
42static void* p_procs_handle_FieldZp = NULL;
43static void* p_procs_handle_FieldQ = NULL;
44static void* p_procs_handle_FieldGeneral = NULL;
45
46static void* p_ProcInitHandle(void** handle, const char* module)
47{
48  if (*handle == NULL)
49  {
50    char name[25];
51    sprintf(name, "p_Procs_%s", module);
52    *handle = dynl_open_binary_warn(name, WARN_MSG);
53  }
54  return *handle;
55}
56
57static inline void* p_ProcGetHandle(p_Proc proc, p_Field field)
58{
59  const char* module =  p_ProcField_2_Module(proc, field);
60 
61  if (strcmp(module, "FieldIndep") == 0) 
62    return p_ProcInitHandle(&p_procs_handle_FieldIndep, module);
63  else if (strcmp(module, "FieldZp") == 0) 
64    return p_ProcInitHandle(&p_procs_handle_FieldZp, module);
65  else if (strcmp(module, "FieldQ") == 0) 
66    return p_ProcInitHandle(&p_procs_handle_FieldQ, module);
67  else if (strcmp(module, "FieldGeneral") == 0) 
68    return p_ProcInitHandle(&p_procs_handle_FieldGeneral, module);
69  else
70  {
71    assume(0);
72    return NULL;
73  }
74}
75
76 
77#define InitSetProcs(f, l, o) ((void)0)
78
79static void* GetGeneralProc(p_Proc proc)
80{
81  switch(proc)
82  {
83      case p_Copy_Proc: 
84        return p_Copy__FieldGeneral_LengthGeneral_OrdGeneral;
85      case p_Delete_Proc: 
86        return p_Delete__FieldGeneral_LengthGeneral_OrdGeneral;
87      case p_ShallowCopyDelete_Proc: 
88        return p_ShallowCopyDelete__FieldGeneral_LengthGeneral_OrdGeneral;
89      case p_Mult_nn_Proc: 
90        return p_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral;
91      case pp_Mult_nn_Proc: 
92        return pp_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral;
93      case pp_Mult_mm_Proc: 
94        return pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral;
95      case pp_Mult_mm_Noether_Proc: 
96        return pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral;
97      case p_Mult_mm_Proc: 
98        return p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral;
99      case p_Add_q_Proc: 
100        return p_Add_q__FieldGeneral_LengthGeneral_OrdGeneral;
101      case p_Minus_mm_Mult_qq_Proc: 
102        return p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral;
103      case p_Neg_Proc: 
104        return p_Neg__FieldGeneral_LengthGeneral_OrdGeneral;
105      case pp_Mult_Coeff_mm_DivSelect_Proc: 
106        return pp_Mult_Coeff_mm_DivSelect__FieldGeneral_LengthGeneral_OrdGeneral;
107      case p_Merge_q_Proc: 
108        return p_Merge_q__FieldGeneral_LengthGeneral_OrdGeneral;
109      case p_kBucketSetLm_Proc: 
110        return p_kBucketSetLm__FieldGeneral_LengthGeneral_OrdGeneral;
111      case p_Unknown_Proc:
112        break;
113  }
114  dReportBug("p_Unknown_Proc");
115  return NULL;
116}
117
118#ifdef RDEBUG
119#include "omalloc.h"
120
121static char* GetGeneralProcName(p_Proc proc)
122{
123  switch(proc)
124  {
125      case p_Copy_Proc: 
126        return "p_Copy__FieldGeneral_LengthGeneral_OrdGeneral";
127      case p_Delete_Proc: 
128        return "p_Delete__FieldGeneral_LengthGeneral_OrdGeneral";
129      case p_ShallowCopyDelete_Proc: 
130        return "p_ShallowCopyDelete__FieldGeneral_LengthGeneral_OrdGeneral";
131      case p_Mult_nn_Proc: 
132        return "p_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral";
133      case pp_Mult_nn_Proc: 
134        return "pp_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral";
135      case pp_Mult_mm_Proc: 
136        return "pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral";
137      case pp_Mult_mm_Noether_Proc: 
138        return "pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral";
139      case p_Mult_mm_Proc: 
140        return "p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral";
141      case p_Add_q_Proc: 
142        return "p_Add_q__FieldGeneral_LengthGeneral_OrdGeneral";
143      case p_Minus_mm_Mult_qq_Proc: 
144        return "p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral";
145      case p_Neg_Proc: 
146        return "p_Neg__FieldGeneral_LengthGeneral_OrdGeneral";
147      case pp_Mult_Coeff_mm_DivSelect_Proc: 
148        return "pp_Mult_Coeff_mm_DivSelect__FieldGeneral_LengthGeneral_OrdGeneral";
149      case p_Merge_q_Proc: 
150        return "p_Merge_q__FieldGeneral_LengthGeneral_OrdGeneral";
151      case p_kBucketSetLm_Proc: 
152        return "p_kBucketSetLm__FieldGeneral_LengthGeneral_OrdGeneral";
153      case p_Unknown_Proc:
154        break;
155  }
156  return "p_Unknown_Proc";
157}
158#endif
159
160
161static void* GetDynamicProc(const char* proc_s, p_Proc proc, 
162                            p_Field field, p_Length length, p_Ord ord
163#ifdef RDEBUG
164                     , int get_name = 0
165#endif
166                     )
167{
168  void* proc_ptr = NULL;
169  char proc_name[MAX_PROCNAME_LEN];
170  sprintf(proc_name, "%s__%s_%s_%s", proc_s, 
171          p_FieldEnum_2_String(field), 
172          p_LengthEnum_2_String(length), 
173          p_OrdEnum_2_String(ord));
174  // first, try to get the proc from the kernel
175  proc_ptr = dynl_sym(DYNL_KERNEL_HANDLE, proc_name);
176  if (proc_ptr == NULL)
177  {
178    proc_ptr = dynl_sym_warn(p_ProcGetHandle(proc, field), proc_name, WARN_MSG);
179    // last but not least use general proc
180    if (proc_ptr == NULL)
181    {
182      proc_ptr = GetGeneralProc(proc);
183#ifdef RDEBUG
184      sprintf(proc_name, GetGeneralProcName(proc));
185#endif     
186    }
187  }
188#ifdef RDEBUG
189  if (get_name)
190  {
191    char* name = omStrDup(proc_name);
192    omMarkAsStaticAddr(name);
193    return (void*) name;
194  }
195#endif
196  return  proc_ptr;
197}
198 
199
200#define DoReallySetProc(what, field, length, ord)           \
201  _p_procs->what = (what##_Proc_Ptr)                        \
202     GetDynamicProc(#what, what##_Proc, field, length, ord)
203
204#ifdef RDEBUG
205#define DoSetProc(what, field, length, ord)                         \
206do                                                                  \
207{                                                                   \
208  if (set_names)                                                    \
209    _p_procs->what = (what##_Proc_Ptr)                              \
210       GetDynamicProc(#what,  what##_Proc, field, length, ord, 1);  \
211  else                                                              \
212    DoReallySetProc(what, field, length, ord);                      \
213}                                                                   \
214while(0)
215#else
216#define DoSetProc DoReallySetProc
217#endif
218
219     
220#include "p_Procs_Set.h"
221
222
223
224
Note: See TracBrowser for help on using the repository browser.