>>>>> "P" == Paul Brannan <pbrannan / atdesk.com> writes:

P> I do not understand you.  Or perhaps you do not understand me, or maybe
P> both.

 Well, from dl.c

 ------------------------------------------------------------

  entry = -1;
  for (i=0; i < MAX_CALLBACK; i++) {
    if (rb_hash_aref(DLFuncTable, rb_assoc_new(INT2NUM(rettype), INT2NUM(i))) == Qnil) {
      entry = i;
      break;
    }
  }
  if (entry < 0) {
    rb_raise(rb_eDLError, "too many callbacks are defined.");
  }

  rb_hash_aset(DLFuncTable,
               rb_assoc_new(INT2NUM(rettype),INT2NUM(entry)),
               rb_assoc_new(type,proc));
  sprintf(fname, "rb_dl_callback_func_%d_%d", rettype, entry);
  return rb_dlsym_new((void (*)())rb_dl_callback_table[rettype][entry],
                      fname, RSTRING(type)->ptr);
 ------------------------------------------------------------

 rb_dlsym_new() will return a data struct

 You see the limitation with MAX_CALLBACK

 Then it's used in callback.func

 ------------------------------------------------------------

  obj = rb_hash_aref(DLFuncTable, rb_assoc_new(INT2NUM(0),INT2NUM(0)));
  proto = rb_ary_entry(obj, 0);
  proc  = rb_ary_entry(obj, 1);
  Check_Type(proto, T_STRING);
  if( RSTRING(proto)->len >= 15 )
    rb_raise(rb_eArgError, "too many arguments");
  rb_dl_scan_callback_args(buff, RSTRING(proto)->ptr, &argc, argv);
  retval = rb_funcall2(proc, id_call, argc, argv);

 ------------------------------------------------------------

 The hash DLFuncTable is used to retrieve `bloc' and `proto'

 The name of the function give the key for DLFuncTable, because it's
 hardcoded at compile time.

P> That function pointer must be unique, else dl does not know which
P> ruby callback object to call.

 That function don't need to be unique, if `bloc' and `proto' are *not*
 stored in DLFunctable, and indexed by the name of the function (sort of). 

 Look at rb_dl_callback_func_0_0() and rb_dl_callback_func_0_1() they do
 *exactly* the same thing except for these lines

  obj = rb_hash_aref(DLFuncTable, rb_assoc_new(INT2NUM(0),INT2NUM(0)));

  obj = rb_hash_aref(DLFuncTable, rb_assoc_new(INT2NUM(0),INT2NUM(1)));

 The problem with dl is that it has stored [bloc, proto] in an *external*
 structure (DLFuncTable) and it use the name of the function to retrieve
 the data.


Guy Decoux