source: git/libpolys/polys/templates/p_Procs_Dynamic.cc @ 5a4b26

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