source: git/kernel/p_Procs_Dynamic.cc @ 19370c

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