source: git/libpolys/polys/templates/p_Procs_Dynamic.cc @ 6ce030f

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