source: git/kernel/p_Procs_Dynamic.cc @ 83bde7

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