p_Procs_Dynamic.cc
Go to the documentation of this file.
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  *******************************************************************/
10 #include <misc/auxiliary.h>
11 
12 #include <factory/factory.h>
13 
14 #include <reporter/reporter.h>
15 
16 // #include <polys/structs.h>
17 #include <polys/monomials/ring.h>
19 
20 #include <polys/kbuckets.h>
21 
23 
28 
29 
30 #ifdef HAVE_DL
32 
33 #define WARN_MSG "Singular will work properly, but much slower."
34 
35 // need external linkage, so that dynl_sym works
36 #undef LINKAGE
37 #define LINKAGE extern "C"
38 #define p_Procs_Kernel
39 
40 #include "templates/p_Procs.inc"
41 
43 // include general p_Proc stuff
44 #include "templates/p_Procs_Impl.h"
45 
46 #include "mod_raw.h"
47 
48 // define to bound for length of p_Proc name
49 #define MAX_PROCNAME_LEN 200
50 
53 static void* p_procs_handle_FieldQ = NULL;
55 
56 static void* p_ProcInitHandle(void** handle, const char* module)
57 {
58  if (*handle == NULL)
59  {
60  char name[25];
61  sprintf(name, "p_Procs_%s", module);
62  *handle = dynl_open_binary_warn(name, WARN_MSG);
63  }
64  return *handle;
65 }
66 
67 static inline void* p_ProcGetHandle(p_Proc proc, p_Field field)
68 {
69  const char* module = p_ProcField_2_Module(proc, field);
70 
71  if (strcmp(module, "FieldIndep") == 0)
73  else if (strcmp(module, "FieldZp") == 0)
75  else if (strcmp(module, "FieldQ") == 0)
76  return p_ProcInitHandle(&p_procs_handle_FieldQ, module);
77  else if (strcmp(module, "FieldGeneral") == 0)
79  else
80  {
81  assume(0);
82  return NULL;
83  }
84 }
85 
86 
87 static void* GetGeneralProc(p_Proc proc)
88 {
89  switch(proc)
90  {
91  case p_Copy_Proc:
92  return cast_A_to_vptr(p_Copy__FieldGeneral_LengthGeneral_OrdGeneral);
93  case p_Delete_Proc:
94  return cast_A_to_vptr(p_Delete__FieldGeneral_LengthGeneral_OrdGeneral);
96  return cast_A_to_vptr(p_ShallowCopyDelete__FieldGeneral_LengthGeneral_OrdGeneral);
97  case p_Mult_nn_Proc:
98  return cast_A_to_vptr(p_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral);
99  case pp_Mult_nn_Proc:
100  return cast_A_to_vptr(pp_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral);
101  case pp_Mult_mm_Proc:
102  return cast_A_to_vptr(pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral);
104  return cast_A_to_vptr(pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral);
105  case p_Mult_mm_Proc:
106  return cast_A_to_vptr(p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral);
107  case p_Add_q_Proc:
108  return cast_A_to_vptr(p_Add_q__FieldGeneral_LengthGeneral_OrdGeneral);
110  return cast_A_to_vptr(p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral);
111  case p_Neg_Proc:
112  return cast_A_to_vptr(p_Neg__FieldGeneral_LengthGeneral_OrdGeneral);
114  return cast_A_to_vptr(pp_Mult_Coeff_mm_DivSelect__FieldGeneral_LengthGeneral_OrdGeneral);
116  return cast_A_to_vptr(pp_Mult_Coeff_mm_DivSelectMult__FieldGeneral_LengthGeneral_OrdGeneral);
117  case p_Merge_q_Proc:
118  return cast_A_to_vptr(p_Merge_q__FieldGeneral_LengthGeneral_OrdGeneral);
119  case p_kBucketSetLm_Proc:
120  return cast_A_to_vptr(p_kBucketSetLm__FieldGeneral_LengthGeneral_OrdGeneral);
121  case p_Unknown_Proc:
122  break;
123  }
124  dReportBug("p_Unknown_Proc");
125  return NULL;
126 }
127 
128 #ifdef RDEBUG
129 #include <omalloc/omalloc.h>
130 
131 static const char* GetGeneralProcName(p_Proc proc)
132 {
133  switch(proc)
134  {
135  case p_Copy_Proc:
136  return "p_Copy__FieldGeneral_LengthGeneral_OrdGeneral";
137  case p_Delete_Proc:
138  return "p_Delete__FieldGeneral_LengthGeneral_OrdGeneral";
140  return "p_ShallowCopyDelete__FieldGeneral_LengthGeneral_OrdGeneral";
141  case p_Mult_nn_Proc:
142  return "p_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral";
143  case pp_Mult_nn_Proc:
144  return "pp_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral";
145  case pp_Mult_mm_Proc:
146  return "pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral";
148  return "pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral";
149  case p_Mult_mm_Proc:
150  return "p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral";
151  case p_Add_q_Proc:
152  return "p_Add_q__FieldGeneral_LengthGeneral_OrdGeneral";
154  return "p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral";
155  case p_Neg_Proc:
156  return "p_Neg__FieldGeneral_LengthGeneral_OrdGeneral";
158  return "pp_Mult_Coeff_mm_DivSelect__FieldGeneral_LengthGeneral_OrdGeneral";
160  return "pp_Mult_Coeff_mm_DivSelectMult__FieldGeneral_LengthGeneral_OrdGeneral";
161  case p_Merge_q_Proc:
162  return "p_Merge_q__FieldGeneral_LengthGeneral_OrdGeneral";
163  case p_kBucketSetLm_Proc:
164  return "p_kBucketSetLm__FieldGeneral_LengthGeneral_OrdGeneral";
165  case p_Unknown_Proc:
166  break;
167  }
168  return "p_Unknown_Proc";
169 }
170 #endif
171 
172 
173 static void* GetDynamicProc(const char* proc_s, p_Proc proc,
174  p_Field field, p_Length length, p_Ord ord
175 #ifdef RDEBUG
176  , int get_name = 0
177 #endif
178  )
179 {
180  void* proc_ptr = NULL;
181  char proc_name[MAX_PROCNAME_LEN];
182  sprintf(proc_name, "%s__%s_%s_%s", proc_s,
183  p_FieldEnum_2_String(field),
184  p_LengthEnum_2_String(length),
185  p_OrdEnum_2_String(ord));
186  // printf("set %s\n",proc_name);
187  // first, try to get the proc from the kernel
188  proc_ptr = dynl_sym(DYNL_KERNEL_HANDLE, proc_name);
189  if (proc_ptr == NULL)
190  {
191  proc_ptr = dynl_sym_warn(p_ProcGetHandle(proc, field), proc_name, WARN_MSG);
192  // last but not least use general proc
193  if (proc_ptr == NULL)
194  {
195  proc_ptr = GetGeneralProc(proc);
196 #ifdef RDEBUG
197  sprintf(proc_name,"%s", GetGeneralProcName(proc));
198 #endif
199  }
200  }
201 #ifdef RDEBUG
202  if (get_name)
203  {
204  char* name = omStrDup(proc_name);
205 #if (!defined(SING_NDEBUG)) && (!defined(OM_NDEBUG))
206  omMarkAsStaticAddr(name);
207 #endif
208  return (void*) name;
209  }
210 #endif
211  return proc_ptr;
212 }
213 
214 
215 #define DoReallySetProc(what, field, length, ord) \
216  _p_procs->what = cast_vptr_to_A<what##_Proc_Ptr>( \
217  GetDynamicProc(#what, what##_Proc, field, length, ord))
218 
219 #ifdef RDEBUG
220 #define DoSetProc(what, field, length, ord) \
221 do \
222 { \
223  if (set_names) \
224  _p_procs->what = cast_vptr_to_A<what##_Proc_Ptr>( \
225  GetDynamicProc(#what, what##_Proc, field, length, ord, 1)); \
226  else \
227  DoReallySetProc(what, field, length, ord); \
228 } \
229 while(0)
230 #else
231 #define DoSetProc DoReallySetProc
232 #endif
233 
234 #include "templates/p_Procs_Set.h"
235 
236 #endif
237 
static void * p_ProcInitHandle(void **handle, const char *module)
static void * p_procs_handle_FieldIndep
void * dynl_open_binary_warn(const char *binary_name, const char *msg)
Definition: mod_raw.cc:60
static void * p_procs_handle_FieldGeneral
static const char * p_OrdEnum_2_String(p_Ord ord)
Definition: p_Procs_Impl.h:244
#define TRUE
Definition: auxiliary.h:144
static void * GetDynamicProc(const char *proc_s, p_Proc proc, p_Field field, p_Length length, p_Ord ord, int get_name=0)
void * dynl_sym(void *handle, const char *symbol)
Definition: mod_raw.cc:171
void * dynl_sym_warn(void *handle, const char *proc, const char *msg)
Definition: mod_raw.cc:104
p_Length
Definition: p_Procs_Impl.h:127
p_Proc
Definition: p_Procs_Impl.h:183
#define WARN_MSG
#define RDEBUG
Definition: mod2.h:325
static void * p_ProcGetHandle(p_Proc proc, p_Field field)
static void * GetGeneralProc(p_Proc proc)
#define assume(x)
Definition: mod2.h:405
p_Field
Definition: p_Procs_Impl.h:109
static void * p_procs_handle_FieldZp
All the auxiliary stuff.
#define dReportBug(s)
Definition: reporter.h:110
static const char * p_LengthEnum_2_String(p_Length length)
Definition: p_Procs_Impl.h:226
char name(const Variable &v)
Definition: variable.h:95
p_Ord
Definition: p_Procs_Impl.h:140
static void * p_procs_handle_FieldQ
#define NULL
Definition: omList.c:10
void * cast_A_to_vptr(A a)
Definition: auxiliary.h:442
const BOOLEAN p_procs_dynamic
static const char * p_ProcField_2_Module(p_Proc proc, p_Field field)
Definition: p_Procs_Impl.h:338
static const char * GetGeneralProcName(p_Proc proc)
#define DYNL_KERNEL_HANDLE
Definition: mod_raw.h:32
void omMarkAsStaticAddr(void *addr)
#define MAX_PROCNAME_LEN
int BOOLEAN
Definition: auxiliary.h:131
static const char * p_FieldEnum_2_String(p_Field field)
Definition: p_Procs_Impl.h:203
#define omStrDup(s)
Definition: omAllocDecl.h:263