xref: /openbsd-src/gnu/usr.bin/perl/ext/Amiga-Exec/Exec.xs (revision b8851fcc53cbe24fd20b090f26dd149e353f6174)
1*b8851fccSafresh1 #include "EXTERN.h"
2*b8851fccSafresh1 #include "perl.h"
3*b8851fccSafresh1 #include "XSUB.h"
4*b8851fccSafresh1 
5*b8851fccSafresh1 #undef __USE_INLINE__
6*b8851fccSafresh1 #include <exec/types.h>
7*b8851fccSafresh1 #include <utility/tagitem.h>
8*b8851fccSafresh1 #include <dos/dos.h>
9*b8851fccSafresh1 #include <proto/exec.h>
10*b8851fccSafresh1 #include <proto/intuition.h>
11*b8851fccSafresh1 #include <proto/utility.h>
12*b8851fccSafresh1 
13*b8851fccSafresh1 
14*b8851fccSafresh1 
15*b8851fccSafresh1 struct TimeRequest *
OpenTimer(void)16*b8851fccSafresh1 OpenTimer(void)
17*b8851fccSafresh1 {
18*b8851fccSafresh1 	struct MsgPort *port = IExec->AllocSysObjectTags(ASOT_PORT, TAG_END);
19*b8851fccSafresh1 	if (port == NULL)
20*b8851fccSafresh1 	{
21*b8851fccSafresh1 		return NULL;
22*b8851fccSafresh1 	}
23*b8851fccSafresh1 
24*b8851fccSafresh1 	struct TimeRequest *req = IExec->AllocSysObjectTags(ASOT_IOREQUEST,
25*b8851fccSafresh1 		ASOIOR_Size, sizeof(struct TimeRequest),
26*b8851fccSafresh1 		ASOIOR_ReplyPort, port,
27*b8851fccSafresh1 		TAG_END);
28*b8851fccSafresh1 
29*b8851fccSafresh1 	if (req == NULL)
30*b8851fccSafresh1 	{
31*b8851fccSafresh1 		IExec->FreeSysObject(ASOT_PORT, port);
32*b8851fccSafresh1 		return NULL;
33*b8851fccSafresh1 	}
34*b8851fccSafresh1 
35*b8851fccSafresh1 	int8 deverr = IExec->OpenDevice("timer.device", UNIT_MICROHZ,
36*b8851fccSafresh1 		&req->Request, 0);
37*b8851fccSafresh1 
38*b8851fccSafresh1 	if (deverr != IOERR_SUCCESS)
39*b8851fccSafresh1 	{
40*b8851fccSafresh1 		IExec->FreeSysObject(ASOT_IOREQUEST, req);
41*b8851fccSafresh1 		IExec->FreeSysObject(ASOT_PORT, port);
42*b8851fccSafresh1 		return NULL;
43*b8851fccSafresh1 	}
44*b8851fccSafresh1 
45*b8851fccSafresh1 	return req;
46*b8851fccSafresh1 }
47*b8851fccSafresh1 
48*b8851fccSafresh1 
49*b8851fccSafresh1 void
CloseTimer(struct TimeRequest * req)50*b8851fccSafresh1 CloseTimer(struct TimeRequest *req)
51*b8851fccSafresh1 {
52*b8851fccSafresh1 	if (req != NULL)
53*b8851fccSafresh1 	{
54*b8851fccSafresh1 		struct MsgPort *port = req->Request.io_Message.mn_ReplyPort;
55*b8851fccSafresh1 
56*b8851fccSafresh1 		IExec->CloseDevice(&req->Request);
57*b8851fccSafresh1 		IExec->FreeSysObject(ASOT_IOREQUEST, req);
58*b8851fccSafresh1 		IExec->FreeSysObject(ASOT_PORT, port);
59*b8851fccSafresh1 	}
60*b8851fccSafresh1 }
61*b8851fccSafresh1 
62*b8851fccSafresh1 
63*b8851fccSafresh1 
WaitTimeout(uint32 signalmask,int timeout)64*b8851fccSafresh1 uint32 WaitTimeout(uint32 signalmask , int timeout)
65*b8851fccSafresh1 {
66*b8851fccSafresh1 
67*b8851fccSafresh1 	struct TimeRequest *req = NULL;
68*b8851fccSafresh1 	uint32 timermask        = 0;
69*b8851fccSafresh1 
70*b8851fccSafresh1 	if (timeout > 0)
71*b8851fccSafresh1 	{
72*b8851fccSafresh1 		req = OpenTimer();
73*b8851fccSafresh1 
74*b8851fccSafresh1 		if (req != NULL)
75*b8851fccSafresh1 		{
76*b8851fccSafresh1 			timermask = 1L << req->Request.io_Message.mn_ReplyPort->mp_SigBit;
77*b8851fccSafresh1 
78*b8851fccSafresh1 			req->Request.io_Command = TR_ADDREQUEST;
79*b8851fccSafresh1 			req->Time.Seconds       = 0;
80*b8851fccSafresh1 			req->Time.Microseconds  = timeout;
81*b8851fccSafresh1 
82*b8851fccSafresh1 			IExec->SendIO(&req->Request);
83*b8851fccSafresh1 		}
84*b8851fccSafresh1 	}
85*b8851fccSafresh1 
86*b8851fccSafresh1 	uint32 waitmask = timermask |  signalmask | SIGBREAKF_CTRL_C;
87*b8851fccSafresh1 
88*b8851fccSafresh1 	uint32 sigmask = IExec->Wait(waitmask);
89*b8851fccSafresh1 
90*b8851fccSafresh1 	if (req != NULL)
91*b8851fccSafresh1 	{
92*b8851fccSafresh1 		IExec->AbortIO(&req->Request);
93*b8851fccSafresh1 		IExec->WaitIO(&req->Request);
94*b8851fccSafresh1 		CloseTimer(req);
95*b8851fccSafresh1 	}
96*b8851fccSafresh1 
97*b8851fccSafresh1 	/* remove the timer mask bit */
98*b8851fccSafresh1 
99*b8851fccSafresh1 	return sigmask & (~timermask );
100*b8851fccSafresh1 }
101*b8851fccSafresh1 
102*b8851fccSafresh1 
103*b8851fccSafresh1 
104*b8851fccSafresh1 MODULE = Amiga::Exec              PACKAGE = Amiga::Exec
105*b8851fccSafresh1 
106*b8851fccSafresh1 PROTOTYPES: DISABLE
107*b8851fccSafresh1 
108*b8851fccSafresh1 
109*b8851fccSafresh1 uint32 _Wait(signalmask,timeout)
110*b8851fccSafresh1     uint32 signalmask;
111*b8851fccSafresh1     uint32 timeout;
112*b8851fccSafresh1     CODE:
113*b8851fccSafresh1     	RETVAL = WaitTimeout(signalmask,timeout);
114*b8851fccSafresh1     OUTPUT:
115*b8851fccSafresh1     	RETVAL
116*b8851fccSafresh1 
117