@@ -88,7 +88,7 @@ static const zend_function_entry swoole_lock_methods[] =
88
88
PHP_ME (swoole_lock, __construct, arginfo_class_Swoole_Lock___construct, ZEND_ACC_PUBLIC)
89
89
PHP_ME (swoole_lock, __destruct, arginfo_class_Swoole_Lock___destruct, ZEND_ACC_PUBLIC)
90
90
PHP_ME (swoole_lock, lock, arginfo_class_Swoole_Lock_lock, ZEND_ACC_PUBLIC)
91
- PHP_ME (swoole_lock, lockwait, arginfo_class_Swoole_Lock_locakwait , ZEND_ACC_PUBLIC)
91
+ PHP_ME (swoole_lock, lockwait, arginfo_class_Swoole_Lock_lockwait , ZEND_ACC_PUBLIC)
92
92
PHP_ME (swoole_lock, trylock, arginfo_class_Swoole_Lock_trylock, ZEND_ACC_PUBLIC)
93
93
PHP_ME (swoole_lock, lock_read, arginfo_class_Swoole_Lock_lock_read, ZEND_ACC_PUBLIC)
94
94
PHP_ME (swoole_lock, trylock_read, arginfo_class_Swoole_Lock_trylock_read, ZEND_ACC_PUBLIC)
@@ -170,17 +170,42 @@ static PHP_METHOD(swoole_lock, lock) {
170
170
171
171
static PHP_METHOD (swoole_lock, lockwait) {
172
172
double timeout = 1.0 ;
173
+ // 0: write lock, 1: read lock(only for rwlock)
174
+ zend_long kind = 0 ;
173
175
174
- ZEND_PARSE_PARAMETERS_START (0 , 1 )
176
+ ZEND_PARSE_PARAMETERS_START (0 , 2 )
175
177
Z_PARAM_OPTIONAL
176
178
Z_PARAM_DOUBLE (timeout)
179
+ Z_PARAM_LONG (kind)
177
180
ZEND_PARSE_PARAMETERS_END_EX (RETURN_FALSE);
178
181
179
182
Lock *lock = php_swoole_lock_get_and_check_ptr (ZEND_THIS);
180
- if (lock->get_type () != Lock::MUTEX) {
183
+ if (!(lock->get_type () == Lock::MUTEX
184
+ #ifdef HAVE_RWLOCK
185
+ || lock->get_type () == Lock::RW_LOCK
186
+ #endif
187
+ )) {
188
+ #ifdef HAVE_RWLOCK
189
+ zend_throw_exception (swoole_exception_ce, " only mutex and rwlock supports lockwait" , -2 );
190
+ #else
181
191
zend_throw_exception (swoole_exception_ce, " only mutex supports lockwait" , -2 );
192
+ #endif
193
+
182
194
RETURN_FALSE;
183
195
}
196
+ #ifdef HAVE_RWLOCK
197
+ if (lock->get_type () == Lock::RW_LOCK) {
198
+ RWLock *rwlock = dynamic_cast <RWLock *>(lock);
199
+ if (rwlock == nullptr ) {
200
+ zend_throw_exception (swoole_exception_ce, " wrong lock type" , -3 );
201
+ RETURN_FALSE;
202
+ }
203
+ if (kind == 1 ) {
204
+ SW_LOCK_CHECK_RETURN (rwlock->lock_rd_wait ((int ) (timeout * 1000 )));
205
+ }
206
+ SW_LOCK_CHECK_RETURN (rwlock->lock_wait ((int ) (timeout * 1000 )));
207
+ }
208
+ #endif
184
209
Mutex *mutex = dynamic_cast <Mutex *>(lock);
185
210
if (mutex == nullptr ) {
186
211
zend_throw_exception (swoole_exception_ce, " wrong lock type" , -3 );
0 commit comments