ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/iom_perl.h
Revision: 1.4
Committed: Sat Dec 16 02:06:57 2006 UTC (17 years, 5 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-8_2, rel-8_4, rel-8_3
Changes since 1.3: +10 -4 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.2 typedef int IOM_CHAINED;
2    
3 root 1.4 static SV *
4     iom_new_ref (HV *hv, const char *klass)
5     {
6     return sv_bless (newRV ((SV *)hv), gv_stashpv (klass, 1));
7     }
8    
9 root 1.1 /////////////////////////////////////////////////////////////////////////////
10    
11     #define SvWATCHER(sv) (perl_watcher *)SvPTR (sv, IOM_CLASS "::watcher")
12    
13     struct perl_watcher
14     {
15     SV *cbsv;
16     HV *self;
17    
18     perl_watcher ()
19     : cbsv (0)
20     {
21     }
22    
23     ~perl_watcher ()
24     {
25     SvREFCNT_dec (cbsv);
26     }
27    
28     void cb (SV *cb)
29     {
30     SvREFCNT_dec (cbsv);
31     cbsv = newSVsv (cb);
32     }
33    
34     void invoke (const char *type, SV *self, int arg = -1);
35     };
36    
37     void
38     perl_watcher::invoke (const char *type, SV *self, int arg)
39     {
40     dSP;
41    
42     ENTER;
43     SAVETMPS;
44    
45     PUSHMARK (SP);
46    
47     XPUSHs (sv_2mortal (self));
48    
49     if (arg >= 0)
50     XPUSHs (sv_2mortal (newSViv (arg)));
51    
52     PUTBACK;
53     call_sv (cbsv, G_VOID | G_EVAL | G_DISCARD);
54     SPAGAIN;
55    
56     PUTBACK;
57     FREETMPS;
58     LEAVE;
59    
60     if (SvTRUE (ERRSV))
61 root 1.3 IOM_WARN ("%s callback evaluation error: %s", type, SvPV_nolen (ERRSV));
62 root 1.1 }
63    
64 root 1.4 #define newSVtimer(timer) iom_new_ref ((timer)->self, IOM_CLASS "::timer")
65 root 1.1 #define SvTIMER(sv) (timer *)(perl_watcher *)SvPTR ((sv), IOM_CLASS "::timer")
66    
67     struct timer : perl_watcher, time_watcher
68     {
69     tstamp interval;
70    
71     timer ()
72     : time_watcher (this, &timer::execute)
73     {
74     }
75    
76     void execute (time_watcher &w)
77     {
78     if (interval)
79     start (at + interval);
80    
81     invoke (IOM_CLASS "::timer", newSVtimer (this));
82     }
83     };
84    
85 root 1.4 #define newSViow(iow) iom_new_ref ((iow)->self, IOM_CLASS "::iow")
86 root 1.1 #define SvIOW(sv) (iow *)(perl_watcher *)SvPTR ((sv), IOM_CLASS "::iow")
87    
88     struct iow : perl_watcher, io_watcher
89     {
90     iow ()
91     : io_watcher (this, &iow::execute)
92     {
93     }
94    
95     void execute (io_watcher &w, short revents)
96     {
97     invoke (IOM_CLASS "::iow", newSViow (this), revents);
98     }
99     };
100    
101 root 1.4 #define newSViw(iw) iom_new_ref ((iw)->self, IOM_CLASS "::iw")
102 root 1.1 #define SvIW(sv) (iw *)(perl_watcher *)SvPTR ((sv), IOM_CLASS "::iw")
103    
104     struct iw : perl_watcher, idle_watcher
105     {
106     iw ()
107     : idle_watcher (this, &iw::execute)
108     {
109     }
110    
111     void execute (idle_watcher &w)
112     {
113     invoke (IOM_CLASS "::iw", newSViw (this));
114     }
115     };
116    
117 root 1.4 #define newSVpw(pw) iom_new_ref ((pw)->self, IOM_CLASS "::pw")
118 root 1.1 #define SvPW(sv) (pw *)(perl_watcher *)SvPTR ((sv), IOM_CLASS "::pw")
119    
120     struct pw : perl_watcher, child_watcher
121     {
122     pw ()
123     : child_watcher (this, &pw::execute)
124     {
125     }
126    
127     void execute (child_watcher &w, int status)
128     {
129     invoke (IOM_CLASS "::pw", newSVpw (this), status);
130     }
131     };
132