source: git/libpolys/polys/templates/p_Procs_Dynamic.cc @ a40080

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