source: git/libpolys/polys/templates/p_Procs_Dynamic.cc @ 50b874

spielwiese
Last change on this file since 50b874 was 50b874, checked in by Oleksandr Motsak <motsak@…>, 13 years ago
FIX: further issues due to the use of Debugging stuff in Release version
  • Property mode set to 100644
File size: 7.8 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$
10 *******************************************************************/
11#include "config.h"
12#include <misc/auxiliary.h>
13
14#ifdef HAVE_FACTORY
15#include <factory/factory.h>
16#endif
17
18// #include <polys/structs.h>
19#include <polys/monomials/ring.h>
20#include <polys/monomials/p_polys.h>
21#include <polys/templates/p_Procs.h>
22#include <polys/templates/p_Numbers.h>
23#include <polys/templates/p_MemCmp.h>
24#include <polys/templates/p_MemAdd.h>
25#include <polys/templates/p_MemCopy.h>
26#include <polys/kbuckets.h>
27#include <reporter/reporter.h>
28
29#ifdef HAVE_DL
30const BOOLEAN p_procs_dynamic = TRUE;
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
41#include "templates/p_Procs_Dynamic.h"
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
50static void* p_procs_handle_FieldIndep = NULL;
51static void* p_procs_handle_FieldZp = NULL;
52static void* p_procs_handle_FieldQ = NULL;
53static void* p_procs_handle_FieldGeneral = NULL;
54
55static 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);
61    *handle = dynl_open_binary_warn(name, WARN_MSG);
62  }
63  return *handle;
64}
65
66static 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)
71    return p_ProcInitHandle(&p_procs_handle_FieldIndep, module);
72  else if (strcmp(module, "FieldZp") == 0)
73    return p_ProcInitHandle(&p_procs_handle_FieldZp, module);
74  else if (strcmp(module, "FieldQ") == 0)
75    return p_ProcInitHandle(&p_procs_handle_FieldQ, module);
76  else if (strcmp(module, "FieldGeneral") == 0)
77    return p_ProcInitHandle(&p_procs_handle_FieldGeneral, module);
78  else
79  {
80    assume(0);
81    return NULL;
82  }
83}
84
85
86static void* GetGeneralProc(p_Proc proc)
87{
88  switch(proc)
89  {
90      case p_Copy_Proc:
91        return (void *)p_Copy__FieldGeneral_LengthGeneral_OrdGeneral;
92      case p_Delete_Proc:
93        return (void *)p_Delete__FieldGeneral_LengthGeneral_OrdGeneral;
94      case p_ShallowCopyDelete_Proc:
95        return (void *)p_ShallowCopyDelete__FieldGeneral_LengthGeneral_OrdGeneral;
96      case p_Mult_nn_Proc:
97        return (void *)p_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral;
98      case pp_Mult_nn_Proc:
99        return (void *)pp_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral;
100      case pp_Mult_mm_Proc:
101        return (void *)pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral;
102      case pp_Mult_mm_Noether_Proc:
103        return (void *)pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral;
104      case p_Mult_mm_Proc:
105        return (void *)p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral;
106      case p_Add_q_Proc:
107        return (void *)p_Add_q__FieldGeneral_LengthGeneral_OrdGeneral;
108      case p_Minus_mm_Mult_qq_Proc:
109        return (void *)p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral;
110      case p_Neg_Proc:
111        return (void *)p_Neg__FieldGeneral_LengthGeneral_OrdGeneral;
112      case pp_Mult_Coeff_mm_DivSelect_Proc:
113        return (void *)pp_Mult_Coeff_mm_DivSelect__FieldGeneral_LengthGeneral_OrdGeneral;
114      case pp_Mult_Coeff_mm_DivSelectMult_Proc:
115        return (void *)pp_Mult_Coeff_mm_DivSelectMult__FieldGeneral_LengthGeneral_OrdGeneral;
116      case p_Merge_q_Proc:
117        return (void *)p_Merge_q__FieldGeneral_LengthGeneral_OrdGeneral;
118      case p_kBucketSetLm_Proc:
119        return (void *)p_kBucketSetLm__FieldGeneral_LengthGeneral_OrdGeneral;
120      case p_Unknown_Proc:
121        break;
122  }
123  dReportBug("p_Unknown_Proc");
124  return NULL;
125}
126
127#ifdef RDEBUG
128#include <omalloc/omalloc.h>
129
130static const char* GetGeneralProcName(p_Proc proc)
131{
132  switch(proc)
133  {
134      case p_Copy_Proc:
135        return "p_Copy__FieldGeneral_LengthGeneral_OrdGeneral";
136      case p_Delete_Proc:
137        return "p_Delete__FieldGeneral_LengthGeneral_OrdGeneral";
138      case p_ShallowCopyDelete_Proc:
139        return "p_ShallowCopyDelete__FieldGeneral_LengthGeneral_OrdGeneral";
140      case p_Mult_nn_Proc:
141        return "p_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral";
142      case pp_Mult_nn_Proc:
143        return "pp_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral";
144      case pp_Mult_mm_Proc:
145        return "pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral";
146      case pp_Mult_mm_Noether_Proc:
147        return "pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral";
148      case p_Mult_mm_Proc:
149        return "p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral";
150      case p_Add_q_Proc:
151        return "p_Add_q__FieldGeneral_LengthGeneral_OrdGeneral";
152      case p_Minus_mm_Mult_qq_Proc:
153        return "p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral";
154      case p_Neg_Proc:
155        return "p_Neg__FieldGeneral_LengthGeneral_OrdGeneral";
156      case pp_Mult_Coeff_mm_DivSelect_Proc:
157        return "pp_Mult_Coeff_mm_DivSelect__FieldGeneral_LengthGeneral_OrdGeneral";
158      case pp_Mult_Coeff_mm_DivSelectMult_Proc:
159        return "pp_Mult_Coeff_mm_DivSelectMult__FieldGeneral_LengthGeneral_OrdGeneral";
160      case p_Merge_q_Proc:
161        return "p_Merge_q__FieldGeneral_LengthGeneral_OrdGeneral";
162      case p_kBucketSetLm_Proc:
163        return "p_kBucketSetLm__FieldGeneral_LengthGeneral_OrdGeneral";
164      case p_Unknown_Proc:
165        break;
166  }
167  return "p_Unknown_Proc";
168}
169#endif
170
171
172static void* GetDynamicProc(const char* proc_s, p_Proc proc,
173                            p_Field field, p_Length length, p_Ord ord
174#ifdef RDEBUG
175                     , int get_name = 0
176#endif
177                     )
178{
179  void* proc_ptr = NULL;
180  char proc_name[MAX_PROCNAME_LEN];
181  sprintf(proc_name, "%s__%s_%s_%s", proc_s,
182          p_FieldEnum_2_String(field),
183          p_LengthEnum_2_String(length),
184          p_OrdEnum_2_String(ord));
185  // printf("set %s\n",proc_name);
186  // first, try to get the proc from the kernel
187  proc_ptr = dynl_sym(DYNL_KERNEL_HANDLE, proc_name);
188  if (proc_ptr == NULL)
189  {
190    proc_ptr = dynl_sym_warn(p_ProcGetHandle(proc, field), proc_name, WARN_MSG);
191    // last but not least use general proc
192    if (proc_ptr == NULL)
193    {
194      proc_ptr = GetGeneralProc(proc);
195#ifdef RDEBUG
196      sprintf(proc_name,"%s", GetGeneralProcName(proc));
197#endif
198    }
199  }
200#ifdef RDEBUG
201  if (get_name)
202  {
203    char* name = omStrDup(proc_name);
204#if (!defined(NDEBUG)) && (!defined(OM_NDEBUG)) && defined(HAVE_CONFIG_H)
205    omMarkAsStaticAddr(name);
206#endif
207    return (void*) name;
208  }
209#endif
210  return  proc_ptr;
211}
212
213
214#define DoReallySetProc(what, field, length, ord)           \
215  _p_procs->what = (what##_Proc_Ptr)                        \
216     GetDynamicProc(#what, what##_Proc, field, length, ord)
217
218#ifdef RDEBUG
219#define DoSetProc(what, field, length, ord)                         \
220do                                                                  \
221{                                                                   \
222  if (set_names)                                                    \
223    _p_procs->what = (what##_Proc_Ptr)                              \
224       GetDynamicProc(#what,  what##_Proc, field, length, ord, 1);  \
225  else                                                              \
226    DoReallySetProc(what, field, length, ord);                      \
227}                                                                   \
228while(0)
229#else
230#define DoSetProc DoReallySetProc
231#endif
232
233#include "templates/p_Procs_Set.h"
234
235#endif
236
Note: See TracBrowser for help on using the repository browser.