xref: /aosp_15_r20/external/grpc-grpc/src/php/ext/grpc/timeval.c (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker /*
2*cc02d7e2SAndroid Build Coastguard Worker  *
3*cc02d7e2SAndroid Build Coastguard Worker  * Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker  *
5*cc02d7e2SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker  *
9*cc02d7e2SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker  *
11*cc02d7e2SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker  * limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker  *
17*cc02d7e2SAndroid Build Coastguard Worker  */
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker /**
20*cc02d7e2SAndroid Build Coastguard Worker  * class Timeval
21*cc02d7e2SAndroid Build Coastguard Worker  * @see https://github.com/grpc/grpc/tree/master/src/php/ext/grpc/timeval.c
22*cc02d7e2SAndroid Build Coastguard Worker  */
23*cc02d7e2SAndroid Build Coastguard Worker 
24*cc02d7e2SAndroid Build Coastguard Worker #include "timeval.h"
25*cc02d7e2SAndroid Build Coastguard Worker 
26*cc02d7e2SAndroid Build Coastguard Worker #include <ext/spl/spl_exceptions.h>
27*cc02d7e2SAndroid Build Coastguard Worker #include <zend_exceptions.h>
28*cc02d7e2SAndroid Build Coastguard Worker 
29*cc02d7e2SAndroid Build Coastguard Worker zend_class_entry *grpc_ce_timeval;
30*cc02d7e2SAndroid Build Coastguard Worker PHP_GRPC_DECLARE_OBJECT_HANDLER(timeval_ce_handlers)
31*cc02d7e2SAndroid Build Coastguard Worker 
32*cc02d7e2SAndroid Build Coastguard Worker /* Frees and destroys an instance of wrapped_grpc_call */
PHP_GRPC_FREE_WRAPPED_FUNC_START(wrapped_grpc_timeval)33*cc02d7e2SAndroid Build Coastguard Worker PHP_GRPC_FREE_WRAPPED_FUNC_START(wrapped_grpc_timeval)
34*cc02d7e2SAndroid Build Coastguard Worker PHP_GRPC_FREE_WRAPPED_FUNC_END()
35*cc02d7e2SAndroid Build Coastguard Worker 
36*cc02d7e2SAndroid Build Coastguard Worker /* Initializes an instance of wrapped_grpc_timeval to be associated with an
37*cc02d7e2SAndroid Build Coastguard Worker  * object of a class specified by class_type */
38*cc02d7e2SAndroid Build Coastguard Worker php_grpc_zend_object create_wrapped_grpc_timeval(zend_class_entry *class_type
39*cc02d7e2SAndroid Build Coastguard Worker                                                  TSRMLS_DC) {
40*cc02d7e2SAndroid Build Coastguard Worker   PHP_GRPC_ALLOC_CLASS_OBJECT(wrapped_grpc_timeval);
41*cc02d7e2SAndroid Build Coastguard Worker   zend_object_std_init(&intern->std, class_type TSRMLS_CC);
42*cc02d7e2SAndroid Build Coastguard Worker   object_properties_init(&intern->std, class_type);
43*cc02d7e2SAndroid Build Coastguard Worker   PHP_GRPC_FREE_CLASS_OBJECT(wrapped_grpc_timeval, timeval_ce_handlers);
44*cc02d7e2SAndroid Build Coastguard Worker }
45*cc02d7e2SAndroid Build Coastguard Worker 
grpc_php_wrap_timeval(gpr_timespec wrapped TSRMLS_DC)46*cc02d7e2SAndroid Build Coastguard Worker zval *grpc_php_wrap_timeval(gpr_timespec wrapped TSRMLS_DC) {
47*cc02d7e2SAndroid Build Coastguard Worker   zval *timeval_object;
48*cc02d7e2SAndroid Build Coastguard Worker   PHP_GRPC_MAKE_STD_ZVAL(timeval_object);
49*cc02d7e2SAndroid Build Coastguard Worker   object_init_ex(timeval_object, grpc_ce_timeval);
50*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *timeval =
51*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, timeval_object);
52*cc02d7e2SAndroid Build Coastguard Worker   memcpy(&timeval->wrapped, &wrapped, sizeof(gpr_timespec));
53*cc02d7e2SAndroid Build Coastguard Worker   return timeval_object;
54*cc02d7e2SAndroid Build Coastguard Worker }
55*cc02d7e2SAndroid Build Coastguard Worker 
56*cc02d7e2SAndroid Build Coastguard Worker /**
57*cc02d7e2SAndroid Build Coastguard Worker  * Constructs a new instance of the Timeval class
58*cc02d7e2SAndroid Build Coastguard Worker  * @param number $microseconds The number of microseconds in the interval
59*cc02d7e2SAndroid Build Coastguard Worker  */
PHP_METHOD(Timeval,__construct)60*cc02d7e2SAndroid Build Coastguard Worker PHP_METHOD(Timeval, __construct) {
61*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *timeval =
62*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, getThis());
63*cc02d7e2SAndroid Build Coastguard Worker   int64_t microseconds = 0;
64*cc02d7e2SAndroid Build Coastguard Worker 
65*cc02d7e2SAndroid Build Coastguard Worker   /* parse $microseconds as long */
66*cc02d7e2SAndroid Build Coastguard Worker   if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET,
67*cc02d7e2SAndroid Build Coastguard Worker                                ZEND_NUM_ARGS() TSRMLS_CC, "l",
68*cc02d7e2SAndroid Build Coastguard Worker                                &microseconds) == FAILURE) {
69*cc02d7e2SAndroid Build Coastguard Worker     double microsecondsDouble = 0.0;
70*cc02d7e2SAndroid Build Coastguard Worker     /* parse $microseconds as double */
71*cc02d7e2SAndroid Build Coastguard Worker     if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET,
72*cc02d7e2SAndroid Build Coastguard Worker                               ZEND_NUM_ARGS() TSRMLS_CC, "d",
73*cc02d7e2SAndroid Build Coastguard Worker                               &microsecondsDouble) == FAILURE) {
74*cc02d7e2SAndroid Build Coastguard Worker       zend_throw_exception(spl_ce_InvalidArgumentException,
75*cc02d7e2SAndroid Build Coastguard Worker                            "Timeval expects a long or double", 1 TSRMLS_CC);
76*cc02d7e2SAndroid Build Coastguard Worker       return;
77*cc02d7e2SAndroid Build Coastguard Worker     }
78*cc02d7e2SAndroid Build Coastguard Worker     microseconds = (int64_t)microsecondsDouble;
79*cc02d7e2SAndroid Build Coastguard Worker   }
80*cc02d7e2SAndroid Build Coastguard Worker   gpr_timespec time = gpr_time_from_micros(microseconds, GPR_TIMESPAN);
81*cc02d7e2SAndroid Build Coastguard Worker   memcpy(&timeval->wrapped, &time, sizeof(gpr_timespec));
82*cc02d7e2SAndroid Build Coastguard Worker }
83*cc02d7e2SAndroid Build Coastguard Worker 
84*cc02d7e2SAndroid Build Coastguard Worker /**
85*cc02d7e2SAndroid Build Coastguard Worker  * Adds another Timeval to this one and returns the sum. Calculations saturate
86*cc02d7e2SAndroid Build Coastguard Worker  * at infinities.
87*cc02d7e2SAndroid Build Coastguard Worker  * @param Timeval $other_obj The other Timeval object to add
88*cc02d7e2SAndroid Build Coastguard Worker  * @return Timeval A new Timeval object containing the sum
89*cc02d7e2SAndroid Build Coastguard Worker  */
PHP_METHOD(Timeval,add)90*cc02d7e2SAndroid Build Coastguard Worker PHP_METHOD(Timeval, add) {
91*cc02d7e2SAndroid Build Coastguard Worker   zval *other_obj;
92*cc02d7e2SAndroid Build Coastguard Worker 
93*cc02d7e2SAndroid Build Coastguard Worker   /* "O" == 1 Object */
94*cc02d7e2SAndroid Build Coastguard Worker   if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &other_obj,
95*cc02d7e2SAndroid Build Coastguard Worker                             grpc_ce_timeval) == FAILURE) {
96*cc02d7e2SAndroid Build Coastguard Worker     zend_throw_exception(spl_ce_InvalidArgumentException,
97*cc02d7e2SAndroid Build Coastguard Worker                          "add expects a Timeval", 1 TSRMLS_CC);
98*cc02d7e2SAndroid Build Coastguard Worker     return;
99*cc02d7e2SAndroid Build Coastguard Worker   }
100*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *self =
101*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, getThis());
102*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *other =
103*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, other_obj);
104*cc02d7e2SAndroid Build Coastguard Worker   zval *sum =
105*cc02d7e2SAndroid Build Coastguard Worker     grpc_php_wrap_timeval(gpr_time_add(self->wrapped, other->wrapped)
106*cc02d7e2SAndroid Build Coastguard Worker                           TSRMLS_CC);
107*cc02d7e2SAndroid Build Coastguard Worker   RETURN_DESTROY_ZVAL(sum);
108*cc02d7e2SAndroid Build Coastguard Worker }
109*cc02d7e2SAndroid Build Coastguard Worker 
110*cc02d7e2SAndroid Build Coastguard Worker /**
111*cc02d7e2SAndroid Build Coastguard Worker  * Subtracts another Timeval from this one and returns the difference.
112*cc02d7e2SAndroid Build Coastguard Worker  * Calculations saturate at infinities.
113*cc02d7e2SAndroid Build Coastguard Worker  * @param Timeval $other_obj The other Timeval object to subtract
114*cc02d7e2SAndroid Build Coastguard Worker  * @return Timeval A new Timeval object containing the diff
115*cc02d7e2SAndroid Build Coastguard Worker  */
PHP_METHOD(Timeval,subtract)116*cc02d7e2SAndroid Build Coastguard Worker PHP_METHOD(Timeval, subtract) {
117*cc02d7e2SAndroid Build Coastguard Worker   zval *other_obj;
118*cc02d7e2SAndroid Build Coastguard Worker 
119*cc02d7e2SAndroid Build Coastguard Worker   /* "O" == 1 Object */
120*cc02d7e2SAndroid Build Coastguard Worker   if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &other_obj,
121*cc02d7e2SAndroid Build Coastguard Worker                             grpc_ce_timeval) == FAILURE) {
122*cc02d7e2SAndroid Build Coastguard Worker     zend_throw_exception(spl_ce_InvalidArgumentException,
123*cc02d7e2SAndroid Build Coastguard Worker                          "subtract expects a Timeval", 1 TSRMLS_CC);
124*cc02d7e2SAndroid Build Coastguard Worker     return;
125*cc02d7e2SAndroid Build Coastguard Worker   }
126*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *self =
127*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, getThis());
128*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *other =
129*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, other_obj);
130*cc02d7e2SAndroid Build Coastguard Worker   zval *diff =
131*cc02d7e2SAndroid Build Coastguard Worker     grpc_php_wrap_timeval(gpr_time_sub(self->wrapped, other->wrapped)
132*cc02d7e2SAndroid Build Coastguard Worker                           TSRMLS_CC);
133*cc02d7e2SAndroid Build Coastguard Worker   RETURN_DESTROY_ZVAL(diff);
134*cc02d7e2SAndroid Build Coastguard Worker }
135*cc02d7e2SAndroid Build Coastguard Worker 
136*cc02d7e2SAndroid Build Coastguard Worker /**
137*cc02d7e2SAndroid Build Coastguard Worker  * Return negative, 0, or positive according to whether a < b, a == b,
138*cc02d7e2SAndroid Build Coastguard Worker  * or a > b respectively.
139*cc02d7e2SAndroid Build Coastguard Worker  * @param Timeval $a_obj The first time to compare
140*cc02d7e2SAndroid Build Coastguard Worker  * @param Timeval $b_obj The second time to compare
141*cc02d7e2SAndroid Build Coastguard Worker  * @return long
142*cc02d7e2SAndroid Build Coastguard Worker  */
PHP_METHOD(Timeval,compare)143*cc02d7e2SAndroid Build Coastguard Worker PHP_METHOD(Timeval, compare) {
144*cc02d7e2SAndroid Build Coastguard Worker   zval *a_obj;
145*cc02d7e2SAndroid Build Coastguard Worker   zval *b_obj;
146*cc02d7e2SAndroid Build Coastguard Worker 
147*cc02d7e2SAndroid Build Coastguard Worker   /* "OO" == 2 Objects */
148*cc02d7e2SAndroid Build Coastguard Worker   if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OO", &a_obj,
149*cc02d7e2SAndroid Build Coastguard Worker                             grpc_ce_timeval, &b_obj,
150*cc02d7e2SAndroid Build Coastguard Worker                             grpc_ce_timeval) == FAILURE) {
151*cc02d7e2SAndroid Build Coastguard Worker     zend_throw_exception(spl_ce_InvalidArgumentException,
152*cc02d7e2SAndroid Build Coastguard Worker                          "compare expects two Timevals", 1 TSRMLS_CC);
153*cc02d7e2SAndroid Build Coastguard Worker     return;
154*cc02d7e2SAndroid Build Coastguard Worker   }
155*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *a =
156*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, a_obj);
157*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *b =
158*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, b_obj);
159*cc02d7e2SAndroid Build Coastguard Worker   long result = gpr_time_cmp(a->wrapped, b->wrapped);
160*cc02d7e2SAndroid Build Coastguard Worker   RETURN_LONG(result);
161*cc02d7e2SAndroid Build Coastguard Worker }
162*cc02d7e2SAndroid Build Coastguard Worker 
163*cc02d7e2SAndroid Build Coastguard Worker /**
164*cc02d7e2SAndroid Build Coastguard Worker  * Checks whether the two times are within $threshold of each other
165*cc02d7e2SAndroid Build Coastguard Worker  * @param Timeval $a_obj The first time to compare
166*cc02d7e2SAndroid Build Coastguard Worker  * @param Timeval $b_obj The second time to compare
167*cc02d7e2SAndroid Build Coastguard Worker  * @param Timeval $thresh_obj The threshold to check against
168*cc02d7e2SAndroid Build Coastguard Worker  * @return bool True if $a and $b are within $threshold, False otherwise
169*cc02d7e2SAndroid Build Coastguard Worker  */
PHP_METHOD(Timeval,similar)170*cc02d7e2SAndroid Build Coastguard Worker PHP_METHOD(Timeval, similar) {
171*cc02d7e2SAndroid Build Coastguard Worker   zval *a_obj;
172*cc02d7e2SAndroid Build Coastguard Worker   zval *b_obj;
173*cc02d7e2SAndroid Build Coastguard Worker   zval *thresh_obj;
174*cc02d7e2SAndroid Build Coastguard Worker 
175*cc02d7e2SAndroid Build Coastguard Worker   /* "OOO" == 3 Objects */
176*cc02d7e2SAndroid Build Coastguard Worker   if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OOO", &a_obj,
177*cc02d7e2SAndroid Build Coastguard Worker                             grpc_ce_timeval, &b_obj, grpc_ce_timeval,
178*cc02d7e2SAndroid Build Coastguard Worker                             &thresh_obj, grpc_ce_timeval) == FAILURE) {
179*cc02d7e2SAndroid Build Coastguard Worker     zend_throw_exception(spl_ce_InvalidArgumentException,
180*cc02d7e2SAndroid Build Coastguard Worker                          "compare expects three Timevals", 1 TSRMLS_CC);
181*cc02d7e2SAndroid Build Coastguard Worker     return;
182*cc02d7e2SAndroid Build Coastguard Worker   }
183*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *a =
184*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, a_obj);
185*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *b =
186*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, b_obj);
187*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *thresh =
188*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, thresh_obj);
189*cc02d7e2SAndroid Build Coastguard Worker   int result = gpr_time_similar(a->wrapped, b->wrapped, thresh->wrapped);
190*cc02d7e2SAndroid Build Coastguard Worker   RETURN_BOOL(result);
191*cc02d7e2SAndroid Build Coastguard Worker }
192*cc02d7e2SAndroid Build Coastguard Worker 
193*cc02d7e2SAndroid Build Coastguard Worker /**
194*cc02d7e2SAndroid Build Coastguard Worker  * Returns the current time as a timeval object
195*cc02d7e2SAndroid Build Coastguard Worker  * @return Timeval The current time
196*cc02d7e2SAndroid Build Coastguard Worker  */
PHP_METHOD(Timeval,now)197*cc02d7e2SAndroid Build Coastguard Worker PHP_METHOD(Timeval, now) {
198*cc02d7e2SAndroid Build Coastguard Worker   zval *now = grpc_php_wrap_timeval(gpr_now(GPR_CLOCK_REALTIME) TSRMLS_CC);
199*cc02d7e2SAndroid Build Coastguard Worker   RETURN_DESTROY_ZVAL(now);
200*cc02d7e2SAndroid Build Coastguard Worker }
201*cc02d7e2SAndroid Build Coastguard Worker 
202*cc02d7e2SAndroid Build Coastguard Worker /**
203*cc02d7e2SAndroid Build Coastguard Worker  * Returns the zero time interval as a timeval object
204*cc02d7e2SAndroid Build Coastguard Worker  * @return Timeval Zero length time interval
205*cc02d7e2SAndroid Build Coastguard Worker  */
PHP_METHOD(Timeval,zero)206*cc02d7e2SAndroid Build Coastguard Worker PHP_METHOD(Timeval, zero) {
207*cc02d7e2SAndroid Build Coastguard Worker   zval *grpc_php_timeval_zero =
208*cc02d7e2SAndroid Build Coastguard Worker     grpc_php_wrap_timeval(gpr_time_0(GPR_CLOCK_REALTIME) TSRMLS_CC);
209*cc02d7e2SAndroid Build Coastguard Worker   RETURN_DESTROY_ZVAL(grpc_php_timeval_zero);
210*cc02d7e2SAndroid Build Coastguard Worker }
211*cc02d7e2SAndroid Build Coastguard Worker 
212*cc02d7e2SAndroid Build Coastguard Worker /**
213*cc02d7e2SAndroid Build Coastguard Worker  * Returns the infinite future time value as a timeval object
214*cc02d7e2SAndroid Build Coastguard Worker  * @return Timeval Infinite future time value
215*cc02d7e2SAndroid Build Coastguard Worker  */
PHP_METHOD(Timeval,infFuture)216*cc02d7e2SAndroid Build Coastguard Worker PHP_METHOD(Timeval, infFuture) {
217*cc02d7e2SAndroid Build Coastguard Worker   zval *grpc_php_timeval_inf_future =
218*cc02d7e2SAndroid Build Coastguard Worker     grpc_php_wrap_timeval(gpr_inf_future(GPR_CLOCK_REALTIME) TSRMLS_CC);
219*cc02d7e2SAndroid Build Coastguard Worker   RETURN_DESTROY_ZVAL(grpc_php_timeval_inf_future);
220*cc02d7e2SAndroid Build Coastguard Worker }
221*cc02d7e2SAndroid Build Coastguard Worker 
222*cc02d7e2SAndroid Build Coastguard Worker /**
223*cc02d7e2SAndroid Build Coastguard Worker  * Returns the infinite past time value as a timeval object
224*cc02d7e2SAndroid Build Coastguard Worker  * @return Timeval Infinite past time value
225*cc02d7e2SAndroid Build Coastguard Worker  */
PHP_METHOD(Timeval,infPast)226*cc02d7e2SAndroid Build Coastguard Worker PHP_METHOD(Timeval, infPast) {
227*cc02d7e2SAndroid Build Coastguard Worker   zval *grpc_php_timeval_inf_past =
228*cc02d7e2SAndroid Build Coastguard Worker     grpc_php_wrap_timeval(gpr_inf_past(GPR_CLOCK_REALTIME) TSRMLS_CC);
229*cc02d7e2SAndroid Build Coastguard Worker   RETURN_DESTROY_ZVAL(grpc_php_timeval_inf_past);
230*cc02d7e2SAndroid Build Coastguard Worker }
231*cc02d7e2SAndroid Build Coastguard Worker 
232*cc02d7e2SAndroid Build Coastguard Worker /**
233*cc02d7e2SAndroid Build Coastguard Worker  * Sleep until this time, interpreted as an absolute timeout
234*cc02d7e2SAndroid Build Coastguard Worker  * @return void
235*cc02d7e2SAndroid Build Coastguard Worker  */
PHP_METHOD(Timeval,sleepUntil)236*cc02d7e2SAndroid Build Coastguard Worker PHP_METHOD(Timeval, sleepUntil) {
237*cc02d7e2SAndroid Build Coastguard Worker   wrapped_grpc_timeval *this =
238*cc02d7e2SAndroid Build Coastguard Worker     PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_timeval, getThis());
239*cc02d7e2SAndroid Build Coastguard Worker   gpr_sleep_until(this->wrapped);
240*cc02d7e2SAndroid Build Coastguard Worker }
241*cc02d7e2SAndroid Build Coastguard Worker 
242*cc02d7e2SAndroid Build Coastguard Worker ZEND_BEGIN_ARG_INFO_EX(arginfo_construct, 0, 0, 1)
243*cc02d7e2SAndroid Build Coastguard Worker   ZEND_ARG_INFO(0, microseconds)
244*cc02d7e2SAndroid Build Coastguard Worker ZEND_END_ARG_INFO()
245*cc02d7e2SAndroid Build Coastguard Worker 
246*cc02d7e2SAndroid Build Coastguard Worker ZEND_BEGIN_ARG_INFO_EX(arginfo_add, 0, 0, 1)
247*cc02d7e2SAndroid Build Coastguard Worker   ZEND_ARG_INFO(0, timeval)
248*cc02d7e2SAndroid Build Coastguard Worker ZEND_END_ARG_INFO()
249*cc02d7e2SAndroid Build Coastguard Worker 
250*cc02d7e2SAndroid Build Coastguard Worker ZEND_BEGIN_ARG_INFO_EX(arginfo_compare, 0, 0, 2)
251*cc02d7e2SAndroid Build Coastguard Worker   ZEND_ARG_INFO(0, a_timeval)
252*cc02d7e2SAndroid Build Coastguard Worker   ZEND_ARG_INFO(0, b_timeval)
253*cc02d7e2SAndroid Build Coastguard Worker ZEND_END_ARG_INFO()
254*cc02d7e2SAndroid Build Coastguard Worker 
255*cc02d7e2SAndroid Build Coastguard Worker ZEND_BEGIN_ARG_INFO_EX(arginfo_infFuture, 0, 0, 0)
256*cc02d7e2SAndroid Build Coastguard Worker ZEND_END_ARG_INFO()
257*cc02d7e2SAndroid Build Coastguard Worker 
258*cc02d7e2SAndroid Build Coastguard Worker ZEND_BEGIN_ARG_INFO_EX(arginfo_infPast, 0, 0, 0)
259*cc02d7e2SAndroid Build Coastguard Worker ZEND_END_ARG_INFO()
260*cc02d7e2SAndroid Build Coastguard Worker 
261*cc02d7e2SAndroid Build Coastguard Worker ZEND_BEGIN_ARG_INFO_EX(arginfo_now, 0, 0, 0)
262*cc02d7e2SAndroid Build Coastguard Worker ZEND_END_ARG_INFO()
263*cc02d7e2SAndroid Build Coastguard Worker 
264*cc02d7e2SAndroid Build Coastguard Worker ZEND_BEGIN_ARG_INFO_EX(arginfo_similar, 0, 0, 3)
265*cc02d7e2SAndroid Build Coastguard Worker   ZEND_ARG_INFO(0, a_timeval)
266*cc02d7e2SAndroid Build Coastguard Worker   ZEND_ARG_INFO(0, b_timeval)
267*cc02d7e2SAndroid Build Coastguard Worker   ZEND_ARG_INFO(0, threshold_timeval)
268*cc02d7e2SAndroid Build Coastguard Worker ZEND_END_ARG_INFO()
269*cc02d7e2SAndroid Build Coastguard Worker 
270*cc02d7e2SAndroid Build Coastguard Worker ZEND_BEGIN_ARG_INFO_EX(arginfo_sleepUntil, 0, 0, 0)
271*cc02d7e2SAndroid Build Coastguard Worker ZEND_END_ARG_INFO()
272*cc02d7e2SAndroid Build Coastguard Worker 
273*cc02d7e2SAndroid Build Coastguard Worker ZEND_BEGIN_ARG_INFO_EX(arginfo_subtract, 0, 0, 1)
274*cc02d7e2SAndroid Build Coastguard Worker   ZEND_ARG_INFO(0, timeval)
275*cc02d7e2SAndroid Build Coastguard Worker ZEND_END_ARG_INFO()
276*cc02d7e2SAndroid Build Coastguard Worker 
277*cc02d7e2SAndroid Build Coastguard Worker ZEND_BEGIN_ARG_INFO_EX(arginfo_zero, 0, 0, 0)
278*cc02d7e2SAndroid Build Coastguard Worker ZEND_END_ARG_INFO()
279*cc02d7e2SAndroid Build Coastguard Worker 
280*cc02d7e2SAndroid Build Coastguard Worker static zend_function_entry timeval_methods[] = {
281*cc02d7e2SAndroid Build Coastguard Worker   PHP_ME(Timeval, __construct, arginfo_construct,
282*cc02d7e2SAndroid Build Coastguard Worker          ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
283*cc02d7e2SAndroid Build Coastguard Worker   PHP_ME(Timeval, add, arginfo_add,
284*cc02d7e2SAndroid Build Coastguard Worker          ZEND_ACC_PUBLIC)
285*cc02d7e2SAndroid Build Coastguard Worker   PHP_ME(Timeval, compare, arginfo_compare,
286*cc02d7e2SAndroid Build Coastguard Worker          ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
287*cc02d7e2SAndroid Build Coastguard Worker   PHP_ME(Timeval, infFuture, arginfo_infFuture,
288*cc02d7e2SAndroid Build Coastguard Worker          ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
289*cc02d7e2SAndroid Build Coastguard Worker   PHP_ME(Timeval, infPast, arginfo_infPast,
290*cc02d7e2SAndroid Build Coastguard Worker          ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
291*cc02d7e2SAndroid Build Coastguard Worker   PHP_ME(Timeval, now, arginfo_now,
292*cc02d7e2SAndroid Build Coastguard Worker          ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
293*cc02d7e2SAndroid Build Coastguard Worker   PHP_ME(Timeval, similar, arginfo_similar,
294*cc02d7e2SAndroid Build Coastguard Worker          ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
295*cc02d7e2SAndroid Build Coastguard Worker   PHP_ME(Timeval, sleepUntil, arginfo_sleepUntil,
296*cc02d7e2SAndroid Build Coastguard Worker          ZEND_ACC_PUBLIC)
297*cc02d7e2SAndroid Build Coastguard Worker   PHP_ME(Timeval, subtract, arginfo_subtract,
298*cc02d7e2SAndroid Build Coastguard Worker          ZEND_ACC_PUBLIC)
299*cc02d7e2SAndroid Build Coastguard Worker   PHP_ME(Timeval, zero, arginfo_zero,
300*cc02d7e2SAndroid Build Coastguard Worker          ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
301*cc02d7e2SAndroid Build Coastguard Worker   PHP_FE_END
302*cc02d7e2SAndroid Build Coastguard Worker };
303*cc02d7e2SAndroid Build Coastguard Worker 
grpc_init_timeval(TSRMLS_D)304*cc02d7e2SAndroid Build Coastguard Worker void grpc_init_timeval(TSRMLS_D) {
305*cc02d7e2SAndroid Build Coastguard Worker   zend_class_entry ce;
306*cc02d7e2SAndroid Build Coastguard Worker   INIT_CLASS_ENTRY(ce, "Grpc\\Timeval", timeval_methods);
307*cc02d7e2SAndroid Build Coastguard Worker   ce.create_object = create_wrapped_grpc_timeval;
308*cc02d7e2SAndroid Build Coastguard Worker   grpc_ce_timeval = zend_register_internal_class(&ce TSRMLS_CC);
309*cc02d7e2SAndroid Build Coastguard Worker   PHP_GRPC_INIT_HANDLER(wrapped_grpc_timeval, timeval_ce_handlers);
310*cc02d7e2SAndroid Build Coastguard Worker }
311*cc02d7e2SAndroid Build Coastguard Worker 
grpc_shutdown_timeval(TSRMLS_D)312*cc02d7e2SAndroid Build Coastguard Worker void grpc_shutdown_timeval(TSRMLS_D) {}
313