My Project  UNKNOWN_GIT_VERSION
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/monomials/ring.h"
18 
19 #include "polys/kbuckets.h"
20 
22 
27 
28 
29 #ifdef HAVE_DL
31 
32 #define WARN_MSG "Singular will work properly, but much slower."
33 
34 // need external linkage, so that dynl_sym works
35 #undef LINKAGE
36 #define LINKAGE extern "C"
37 #define p_Procs_Kernel
38 
39 #include "templates/p_Procs.inc"
40 
42 // include general p_Proc stuff
43 #include "templates/p_Procs_Impl.h"
44 
45 #include "mod_raw.h"
46 
47 // define to bound for length of p_Proc name
48 #define MAX_PROCNAME_LEN 200
49 
52 static void* p_procs_handle_FieldQ = NULL;
54 
55 static void* p_ProcInitHandle(void** handle, const char* module)
56 {
57  if (*handle == NULL)
58  {
59  char name[25];
60  sprintf(name, "p_Procs_%s", module);
62  }
63  return *handle;
64 }
65 
66 static inline void* p_ProcGetHandle(p_Proc proc, p_Field field)
67 {
68  const char* module = p_ProcField_2_Module(proc, field);
69 
70  if (strcmp(module, "FieldIndep") == 0)
72  else if (strcmp(module, "FieldZp") == 0)
74  else if (strcmp(module, "FieldQ") == 0)
75  return p_ProcInitHandle(&p_procs_handle_FieldQ, module);
76  else if (strcmp(module, "FieldGeneral") == 0)
78  else
79  {
80  assume(0);
81  return NULL;
82  }
83 }
84 
85 
86 static void* GetGeneralProc(p_Proc proc)
87 {
88  switch(proc)
89  {
90  case p_Copy_Proc:
91  return cast_A_to_vptr(p_Copy__FieldGeneral_LengthGeneral_OrdGeneral);
92  case p_Delete_Proc:
93  return cast_A_to_vptr(p_Delete__FieldGeneral_LengthGeneral_OrdGeneral);
95  return cast_A_to_vptr(p_ShallowCopyDelete__FieldGeneral_LengthGeneral_OrdGeneral);
96  case p_Add_q_Proc:
97  return cast_A_to_vptr(p_Add_q__FieldGeneral_LengthGeneral_OrdGeneral);
98  case p_Neg_Proc:
99  return cast_A_to_vptr(p_Neg__FieldGeneral_LengthGeneral_OrdGeneral);
100  case p_Merge_q_Proc:
101  return cast_A_to_vptr(p_Merge_q__FieldGeneral_LengthGeneral_OrdGeneral);
102  case p_kBucketSetLm_Proc:
103  return cast_A_to_vptr(p_kBucketSetLm__FieldGeneral_LengthGeneral_OrdGeneral);
104 #ifdef HAVE_RINGS
105  case p_Mult_nn_Proc:
106  return cast_A_to_vptr(p_Mult_nn__RingGeneral_LengthGeneral_OrdGeneral);
107  case pp_Mult_nn_Proc:
108  return cast_A_to_vptr(pp_Mult_nn__RingGeneral_LengthGeneral_OrdGeneral);
109  case pp_Mult_mm_Proc:
110  return cast_A_to_vptr(pp_Mult_mm__RingGeneral_LengthGeneral_OrdGeneral);
112  return cast_A_to_vptr(pp_Mult_mm_Noether__RingGeneral_LengthGeneral_OrdGeneral);
113  case p_Mult_mm_Proc:
114  return cast_A_to_vptr(p_Mult_mm__RingGeneral_LengthGeneral_OrdGeneral);
116  return cast_A_to_vptr(p_Minus_mm_Mult_qq__RingGeneral_LengthGeneral_OrdGeneral);
118  return cast_A_to_vptr(pp_Mult_Coeff_mm_DivSelect__RingGeneral_LengthGeneral_OrdGeneral);
120  return cast_A_to_vptr(pp_Mult_Coeff_mm_DivSelectMult__RingGeneral_LengthGeneral_OrdGeneral);
121 #else
122  case p_Mult_nn_Proc:
123  return cast_A_to_vptr(p_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral);
124  case pp_Mult_nn_Proc:
125  return cast_A_to_vptr(pp_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral);
126  case pp_Mult_mm_Proc:
127  return cast_A_to_vptr(pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral);
129  return cast_A_to_vptr(pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral);
130  case p_Mult_mm_Proc:
131  return cast_A_to_vptr(p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral);
133  return cast_A_to_vptr(p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral);
135  return cast_A_to_vptr(pp_Mult_Coeff_mm_DivSelect__FieldGeneral_LengthGeneral_OrdGeneral);
137  return cast_A_to_vptr(pp_Mult_Coeff_mm_DivSelectMult__FieldGeneral_LengthGeneral_OrdGeneral);
138 #endif
139  case p_Unknown_Proc:
140  break;
141  }
142  dReportBug("p_Unknown_Proc");
143  return NULL;
144 }
145 
146 #ifdef RDEBUG
147 #include "omalloc/omalloc.h"
148 
149 static const char* GetGeneralProcName(p_Proc proc)
150 {
151  switch(proc)
152  {
153  case p_Copy_Proc:
154  return "p_Copy__FieldGeneral_LengthGeneral_OrdGeneral";
155  case p_Delete_Proc:
156  return "p_Delete__FieldGeneral_LengthGeneral_OrdGeneral";
158  return "p_ShallowCopyDelete__FieldGeneral_LengthGeneral_OrdGeneral";
159  case p_Add_q_Proc:
160  return "p_Add_q__FieldGeneral_LengthGeneral_OrdGeneral";
161  case p_Neg_Proc:
162  return "p_Neg__FieldGeneral_LengthGeneral_OrdGeneral";
163  case p_Merge_q_Proc:
164  return "p_Merge_q__FieldGeneral_LengthGeneral_OrdGeneral";
165  case p_kBucketSetLm_Proc:
166  return "p_kBucketSetLm__FieldGeneral_LengthGeneral_OrdGeneral";
167  case p_Unknown_Proc:
168  break;
169 #ifdef HAVE_RINGS
170  case p_Mult_nn_Proc:
171  return "p_Mult_nn__RingGeneral_LengthGeneral_OrdGeneral";
172  case pp_Mult_nn_Proc:
173  return "pp_Mult_nn__RingGeneral_LengthGeneral_OrdGeneral";
174  case pp_Mult_mm_Proc:
175  return "pp_Mult_mm__RingGeneral_LengthGeneral_OrdGeneral";
177  return "pp_Mult_mm_Noether__RingGeneral_LengthGeneral_OrdGeneral";
178  case p_Mult_mm_Proc:
179  return "p_Mult_mm__RingGeneral_LengthGeneral_OrdGeneral";
181  return "p_Minus_mm_Mult_qq__RingGeneral_LengthGeneral_OrdGeneral";
183  return "pp_Mult_Coeff_mm_DivSelect__RingGeneral_LengthGeneral_OrdGeneral";
185  return "pp_Mult_Coeff_mm_DivSelectMult__RingGeneral_LengthGeneral_OrdGeneral";
186 #else
187  case p_Mult_nn_Proc:
188  return "p_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral";
189  case pp_Mult_nn_Proc:
190  return "pp_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral";
191  case pp_Mult_mm_Proc:
192  return "pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral";
194  return "pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral";
195  case p_Mult_mm_Proc:
196  return "p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral";
198  return "p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral";
200  return "pp_Mult_Coeff_mm_DivSelect__FieldGeneral_LengthGeneral_OrdGeneral";
202  return "pp_Mult_Coeff_mm_DivSelectMult__FieldGeneral_LengthGeneral_OrdGeneral";
203 #endif
204  }
205  return "p_Unknown_Proc";
206 }
207 #endif
208 
209 
210 static void* GetDynamicProc(const char* proc_s, p_Proc proc,
211  p_Field field, p_Length length, p_Ord ord
212 #ifdef RDEBUG
213  , int get_name = 0
214 #endif
215  )
216 {
217  void* proc_ptr = NULL;
218  char proc_name[MAX_PROCNAME_LEN];
219  sprintf(proc_name, "%s__%s_%s_%s", proc_s,
220  p_FieldEnum_2_String(field),
222  p_OrdEnum_2_String(ord));
223  // printf("set %s\n",proc_name);
224  // first, try to get the proc from the kernel
225  proc_ptr = dynl_sym(DYNL_KERNEL_HANDLE, proc_name);
226  if (proc_ptr == NULL)
227  {
228  proc_ptr = dynl_sym_warn(p_ProcGetHandle(proc, field), proc_name, WARN_MSG);
229  // last but not least use general proc
230  if (proc_ptr == NULL)
231  {
232  proc_ptr = GetGeneralProc(proc);
233 #ifdef RDEBUG
234  sprintf(proc_name,"%s", GetGeneralProcName(proc));
235 #endif
236  }
237  }
238 #ifdef RDEBUG
239  if (get_name)
240  {
241  char* name = omStrDup(proc_name);
242 #if (!defined(SING_NDEBUG)) && (!defined(OM_NDEBUG))
244 #endif
245  return (void*) name;
246  }
247 #endif
248  return proc_ptr;
249 }
250 
251 
252 #define DoReallySetProc(what, field, length, ord) \
253  _p_procs->what = cast_vptr_to_A<what##_Proc_Ptr>( \
254  GetDynamicProc(#what, what##_Proc, field, length, ord))
255 
256 #ifdef RDEBUG
257 #define DoSetProc(what, field, length, ord) \
258 do \
259 { \
260  if (set_names) \
261  _p_procs->what = cast_vptr_to_A<what##_Proc_Ptr>( \
262  GetDynamicProc(#what, what##_Proc, field, length, ord, 1)); \
263  else \
264  DoReallySetProc(what, field, length, ord); \
265 } \
266 while(0)
267 #else
268 #define DoSetProc DoReallySetProc
269 #endif
270 
271 #include "templates/p_Procs_Set.h"
272 
273 #endif
274 
p_Delete_Proc
Definition: p_Procs_Impl.h:176
mod_raw.h
omalloc.h
p_Procs.h
p_Mult_mm_Proc
Definition: p_Procs_Impl.h:182
RDEBUG
#define RDEBUG
Definition: mod2.h:305
cast_A_to_vptr
void * cast_A_to_vptr(A a)
Definition: auxiliary.h:398
p_Unknown_Proc
Definition: p_Procs_Impl.h:190
p_kBucketSetLm_Proc
Definition: p_Procs_Impl.h:189
p_Ord
p_Ord
Definition: p_Procs_Impl.h:130
p_procs_handle_FieldGeneral
static void * p_procs_handle_FieldGeneral
Definition: p_Procs_Dynamic.cc:53
p_ProcField_2_Module
static const char * p_ProcField_2_Module(p_Proc proc, p_Field field)
Definition: p_Procs_Impl.h:326
length
static BOOLEAN length(leftv result, leftv arg)
Definition: interval.cc:263
omStrDup
#define omStrDup(s)
Definition: omAllocDecl.h:261
p_LengthEnum_2_String
static const char * p_LengthEnum_2_String(p_Length length)
Definition: p_Procs_Impl.h:214
p_MemAdd.h
p_Procs_Dynamic.h
auxiliary.h
dynl_sym_warn
void * dynl_sym_warn(void *handle, const char *proc, const char *msg)
Definition: mod_raw.cc:99
reporter.h
GetGeneralProc
static void * GetGeneralProc(p_Proc proc)
Definition: p_Procs_Dynamic.cc:86
p_OrdEnum_2_String
static const char * p_OrdEnum_2_String(p_Ord ord)
Definition: p_Procs_Impl.h:232
p_Field
p_Field
Definition: p_Procs_Impl.h:101
p_procs_handle_FieldIndep
static void * p_procs_handle_FieldIndep
Definition: p_Procs_Dynamic.cc:50
TRUE
#define TRUE
Definition: auxiliary.h:98
BOOLEAN
int BOOLEAN
Definition: auxiliary.h:85
p_Numbers.h
pp_Mult_mm_Proc
Definition: p_Procs_Impl.h:180
p_procs_handle_FieldQ
static void * p_procs_handle_FieldQ
Definition: p_Procs_Dynamic.cc:52
WARN_MSG
#define WARN_MSG
Definition: p_Procs_Dynamic.cc:32
dReportBug
#define dReportBug(s)
Definition: reporter.h:111
GetDynamicProc
static void * GetDynamicProc(const char *proc_s, p_Proc proc, p_Field field, p_Length length, p_Ord ord, int get_name=0)
Definition: p_Procs_Dynamic.cc:210
p_MemCopy.h
p_polys.h
p_Copy_Proc
Definition: p_Procs_Impl.h:175
pp_Mult_Coeff_mm_DivSelect_Proc
Definition: p_Procs_Impl.h:186
p_Minus_mm_Mult_qq_Proc
Definition: p_Procs_Impl.h:184
p_Add_q_Proc
Definition: p_Procs_Impl.h:183
MAX_PROCNAME_LEN
#define MAX_PROCNAME_LEN
Definition: p_Procs_Dynamic.cc:48
p_ProcGetHandle
static void * p_ProcGetHandle(p_Proc proc, p_Field field)
Definition: p_Procs_Dynamic.cc:66
p_Proc
p_Proc
Definition: p_Procs_Impl.h:173
kbuckets.h
ring.h
p_Procs_Set.h
omMarkAsStaticAddr
void omMarkAsStaticAddr(void *addr)
p_Merge_q_Proc
Definition: p_Procs_Impl.h:188
p_Length
p_Length
Definition: p_Procs_Impl.h:117
name
char name(const Variable &v)
Definition: factory.h:180
p_ShallowCopyDelete_Proc
Definition: p_Procs_Impl.h:177
dynl_sym
void * dynl_sym(void *handle, const char *symbol)
Definition: mod_raw.cc:165
p_ProcInitHandle
static void * p_ProcInitHandle(void **handle, const char *module)
Definition: p_Procs_Dynamic.cc:55
p_Procs_Impl.h
p_Neg_Proc
Definition: p_Procs_Impl.h:185
assume
#define assume(x)
Definition: mod2.h:384
dynl_open_binary_warn
void * dynl_open_binary_warn(const char *binary_name, const char *msg)
Definition: mod_raw.cc:55
NULL
#define NULL
Definition: omList.c:9
DYNL_KERNEL_HANDLE
#define DYNL_KERNEL_HANDLE
Definition: mod_raw.h:31
p_procs_handle_FieldZp
static void * p_procs_handle_FieldZp
Definition: p_Procs_Dynamic.cc:51
pp_Mult_Coeff_mm_DivSelectMult_Proc
Definition: p_Procs_Impl.h:187
p_FieldEnum_2_String
static const char * p_FieldEnum_2_String(p_Field field)
Definition: p_Procs_Impl.h:193
p_Mult_nn_Proc
Definition: p_Procs_Impl.h:178
GetGeneralProcName
static const char * GetGeneralProcName(p_Proc proc)
Definition: p_Procs_Dynamic.cc:149
pp_Mult_nn_Proc
Definition: p_Procs_Impl.h:179
pp_Mult_mm_Noether_Proc
Definition: p_Procs_Impl.h:181
proc
unsigned char * proc[NUM_PROC]
Definition: checklibs.c:16
p_procs_dynamic
const BOOLEAN p_procs_dynamic
Definition: p_Procs_Dynamic.cc:30
p_MemCmp.h