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