[PD-cvs] pd/src m_pd.h, 1.4.4.11.2.14, 1.4.4.11.2.15 s_loader.c, 1.4.4.5.2.2, 1.4.4.5.2.3

Thomas Grill xovo at users.sourceforge.net
Thu Nov 24 12:14:45 CET 2005


Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24902/src

Modified Files:
      Tag: devel_0_39
	m_pd.h s_loader.c 
Log Message:
class loader hook mechanism

Index: s_loader.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_loader.c,v
retrieving revision 1.4.4.5.2.2
retrieving revision 1.4.4.5.2.3
diff -C2 -d -r1.4.4.5.2.2 -r1.4.4.5.2.3
*** s_loader.c	14 Jul 2005 23:17:33 -0000	1.4.4.5.2.2
--- s_loader.c	24 Nov 2005 11:14:43 -0000	1.4.4.5.2.3
***************
*** 47,51 ****
  void class_set_extern_dir(t_symbol *s);
  
! int sys_load_lib(char *dirname, char *classname)
  {
      char symname[MAXPDSTRING], filename[MAXPDSTRING], dirbuf[MAXPDSTRING],
--- 47,51 ----
  void class_set_extern_dir(t_symbol *s);
  
! static int sys_load_lib_internal(char *dirname, char *classname)
  {
      char symname[MAXPDSTRING], filename[MAXPDSTRING], dirbuf[MAXPDSTRING],
***************
*** 54,58 ****
      t_xxx makeout = NULL;
      int fd;
-     int dspstate = canvas_suspend_dsp();
  #ifdef MSW
      HINSTANCE ntdll;
--- 54,57 ----
***************
*** 74,78 ****
              dirbuf, &nameptr, MAXPDSTRING, 1)) < 0)
          {
- 			canvas_resume_dsp(dspstate);
  			return (0);
          }
--- 73,76 ----
***************
*** 121,125 ****
          post("%s: couldn't load", filename);
          class_set_extern_dir(&s_);
- 		canvas_resume_dsp(dspstate);
          return (0);
      }
--- 119,122 ----
***************
*** 147,151 ****
              post("%s: couldn't load (%s)", filename,errcode);
              class_set_extern_dir(&s_);
- 			canvas_resume_dsp(dspstate);
              return 0;
          }
--- 144,147 ----
***************
*** 161,165 ****
          	NSLinkEditError(&c, &err, &fname, &errt);
          	post("link error %d %s %s", err, fname, errt);
- 			canvas_resume_dsp(dspstate);
          	return 0;
          }
--- 157,160 ----
***************
*** 175,193 ****
          post("load_object: Symbol \"%s\" not found", symname);
          class_set_extern_dir(&s_);
- 		canvas_resume_dsp(dspstate);
  		return 0;
      }
      (*makeout)();
      class_set_extern_dir(&s_);
- 	canvas_resume_dsp(dspstate);
      return (1);
  }
  
  
  
  
  
  
  
! 
  
--- 170,231 ----
          post("load_object: Symbol \"%s\" not found", symname);
          class_set_extern_dir(&s_);
  		return 0;
      }
+ #if _MSC_VER
+     __try {
+ #endif
      (*makeout)();
+ #if _MSC_VER
+     }
+     __except(EXCEPTION_EXECUTE_HANDLER) {
+ //        EXCEPTION_POINTERS *ep = GetExceptionInformation();
+         post("an exception occurred loading %s", classname);
+         class_set_extern_dir(&s_);
+         return 0;
+     }
+ #endif
      class_set_extern_dir(&s_);
      return (1);
  }
  
+ /* callback type definition */
+ typedef int (*loader_t)(char *dirname, char *classname);
  
+ /* linked list of loaders */
+ typedef struct loader_queue {
+     loader_t loader;
+     struct loader_queue *next;
+ } loader_queue_t;
  
+ static loader_queue_t loaders = {sys_load_lib_internal,NULL};
  
+ /* register class loader function */
+ void sys_loader(loader_t loader)
+ {
+     loader_queue_t *q = &loaders;
+     for(;;) {
+         if(q->next) 
+             q = q->next;
+         else {
+             q->next = (loader_queue_t *)getbytes(sizeof(loader_queue_t));
+             q->next->loader = loader;
+             q->next->next = NULL;
+             break;
+         }
+     }   
+ }
  
+ /* this is the "classic" pd loader function */
+ int sys_load_lib(char *dirname, char *classname)
+ {
+     int dspstate = canvas_suspend_dsp();
  
+     int ok = 0;
+     loader_queue_t *q;
+     for(q = &loaders; q; q = q->next)
+         if(ok = q->loader(dirname,classname)) break;
  
! 	canvas_resume_dsp(dspstate);
!     return ok;
! }
  

Index: m_pd.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_pd.h,v
retrieving revision 1.4.4.11.2.14
retrieving revision 1.4.4.11.2.15
diff -C2 -d -r1.4.4.11.2.14 -r1.4.4.11.2.15
*** m_pd.h	15 Nov 2005 23:30:59 -0000	1.4.4.11.2.14
--- m_pd.h	24 Nov 2005 11:14:42 -0000	1.4.4.11.2.15
***************
*** 498,501 ****
--- 498,504 ----
  EXTERN  int class_getfieldindex(t_class *x, const char *s);
  
+ /* grrrr: register class loader */
+ EXTERN void sys_loader(int (*callback) (char *dirname,char *classname));
+ 
  /* ------------   printing --------------------------------- */
  EXTERN void post(const char *fmt, ...);





More information about the Pd-cvs mailing list