1 /* Gearman Perl front end
2  * Copyright (C) 2009-2010 Dennis Schoen
3  * All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or modify
6  * it under the same terms as Perl itself, either Perl version 5.8.9 or,
7  * at your option, any later version of Perl 5 you may have available.
8  */
9 
10 #include "gearman_xs.h"
11 
12 static void
call_XS(pTHX_ void (* subaddr)(pTHX_ CV *),CV * cv,SV ** mark)13 call_XS ( pTHX_ void (*subaddr) (pTHX_ CV *), CV * cv, SV ** mark )
14 {
15  dSP;
16  PUSHMARK (mark);
17  (*subaddr) (aTHX_ cv);
18  PUTBACK;
19 }
20 
21 #define CALL_BOOT(name)	call_XS (aTHX_ name, cv, mark)
22 
_bless(const char * class,void * obj)23 SV *_bless(const char *class, void *obj) {
24   SV * ret = newSViv(0);
25   XS_STRUCT2OBJ(ret, class, obj);
26   return ret;
27 }
28 
_perl_free(void * ptr,void * arg)29 void _perl_free(void *ptr, void *arg)
30 {
31   PERL_UNUSED_VAR(arg);
32   Safefree(ptr);
33 }
34 
_perl_malloc(size_t size,void * arg)35 void *_perl_malloc(size_t size, void *arg)
36 {
37   PERL_UNUSED_VAR(arg);
38   return safemalloc(size);
39 }
40 
41 /* get the stringified version of the SV without a trailing NULL byte */
_get_string(SV * sv,size_t * size)42 void *_get_string(SV *sv, size_t *size)
43 {
44   void *string= NULL;
45   SvPV_nolen(sv); // this is necessary for SvCUR to get the stringified length
46   *size= SvCUR(sv);
47   Newxz(string, *size, char);
48   memcpy(string, SvPV_nolen(sv), *size);
49   return string;
50 }
51 
52 /* We need these declarations with "C" linkage */
53 
54 #ifdef __cplusplus
55 extern "C" {
56 #endif
57   XS(boot_Gearman__XS__Const);
58   XS(boot_Gearman__XS__Worker);
59   XS(boot_Gearman__XS__Task);
60   XS(boot_Gearman__XS__Client);
61   XS(boot_Gearman__XS__Job);
62 #ifdef __cplusplus
63 }
64 #endif
65 
66 MODULE = Gearman::XS    PACKAGE = Gearman::XS
67 
68 PROTOTYPES: ENABLE
69 
70 BOOT:
71   /* call other *.xs modules */
72   CALL_BOOT(boot_Gearman__XS__Const);
73   CALL_BOOT(boot_Gearman__XS__Worker);
74   CALL_BOOT(boot_Gearman__XS__Task);
75   CALL_BOOT(boot_Gearman__XS__Client);
76   CALL_BOOT(boot_Gearman__XS__Job);
77 
78 const char *
79 strerror(gearman_return_t rc)
80   CODE:
81     RETVAL = gearman_strerror(rc);
82   OUTPUT:
83     RETVAL
84