[Pidgin] #11431: Signals no longer work in Perl plugins

Pidgin trac at pidgin.im
Thu Feb 25 15:48:18 EST 2010

#11431: Signals no longer work in Perl plugins
 Reporter:  dharding  |        Owner:  MarkDoliner
     Type:  defect    |       Status:  new        
Milestone:  2.7.0     |    Component:  plugins    
  Version:  2.6.6     |   Resolution:             
 Keywords:  perl      |  

Comment(by dharding):

 The root problem is that va_list is an array type on some platforms, which
 causes problems when trying to have a va_list* parameter for a function.
 Yet on other platforms va_list is a pointer, which we want to be modified
 by a called function in such a way that the caller sees the modification.
 Thus on these platforms passing it by value doesn't work - we need pass by
 reference.  I have attached a patch which I think may provide a solution
 without requiring messy #ifdefs around the function prototype.  I created
 a struct, va_list_wrapper, which simply has one member, a va_list.
 purple_perl_sv_from_vargs now takes a va_list_wrapper* in place of a
 va_list or va_list*, allowing it to mutate the caller's copy of the
 struct.  The caller, perl_signal_cb, creates a va_list_wrapper struct on
 the stack and uses the G_VA_COPY macro to copy the args va_list into that
 struct before calling purple_perl_sv_from_vargs.  Not the prettiest
 perhaps, but the best I have been able to come up with so far without
 resorting to #ifdefs.  Tested successfully on mingw/x86.

Ticket URL: <http://developer.pidgin.im/ticket/11431#comment:5>
Pidgin <http://pidgin.im>

More information about the Tracker mailing list