Skip to content

Commit 6651864

Browse files
committed
- Sync code with HEAD
- [DOC] Backported: shm_has_var()
1 parent 372256b commit 6651864

File tree

8 files changed

+131
-164
lines changed

8 files changed

+131
-164
lines changed

ext/sysvshm/php_sysvshm.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ extern zend_module_entry sysvshm_module_entry;
3030
#include <sys/ipc.h>
3131
#include <sys/shm.h>
3232

33+
#define PHP_SHM_RSRC_NAME "sysvshm"
34+
3335
typedef struct {
3436
int le_shm;
3537
long init_mem;
@@ -51,9 +53,9 @@ typedef struct {
5153
} sysvshm_chunk_head;
5254

5355
typedef struct {
54-
key_t key; /* Key set by user */
55-
long id; /* Returned by shmget. */
56-
sysvshm_chunk_head *ptr; /* memoryaddress of shared memory */
56+
key_t key; /* key set by user */
57+
long id; /* returned by shmget */
58+
sysvshm_chunk_head *ptr; /* memory address of shared memory */
5759
} sysvshm_shm;
5860

5961
PHP_MINIT_FUNCTION(sysvshm);
@@ -62,6 +64,7 @@ PHP_FUNCTION(shm_detach);
6264
PHP_FUNCTION(shm_remove);
6365
PHP_FUNCTION(shm_put_var);
6466
PHP_FUNCTION(shm_get_var);
67+
PHP_FUNCTION(shm_has_var);
6568
PHP_FUNCTION(shm_remove_var);
6669

6770
extern sysvshm_module php_sysvshm;

ext/sysvshm/sysvshm.c

+76-116
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_shm_detach, 0, 0, 1)
5050
ZEND_ARG_INFO(0, shm_identifier)
5151
ZEND_END_ARG_INFO()
5252

53+
ZEND_BEGIN_ARG_INFO_EX(arginfo_shm_has_var, 0, 0, 2)
54+
ZEND_ARG_INFO(0, id)
55+
ZEND_ARG_INFO(0, variable_key)
56+
ZEND_END_ARG_INFO()
57+
5358
ZEND_BEGIN_ARG_INFO_EX(arginfo_shm_remove, 0, 0, 1)
5459
ZEND_ARG_INFO(0, shm_identifier)
5560
ZEND_END_ARG_INFO()
@@ -78,6 +83,7 @@ const zend_function_entry sysvshm_functions[] = {
7883
PHP_FE(shm_remove, arginfo_shm_detach)
7984
PHP_FE(shm_detach, arginfo_shm_remove)
8085
PHP_FE(shm_put_var, arginfo_shm_put_var)
86+
PHP_FE(shm_has_var, arginfo_shm_has_var)
8187
PHP_FE(shm_get_var, arginfo_shm_get_var)
8288
PHP_FE(shm_remove_var, arginfo_shm_remove_var)
8389
{NULL, NULL, NULL}
@@ -106,9 +112,11 @@ ZEND_GET_MODULE(sysvshm)
106112

107113
#undef shm_ptr /* undefine AIX-specific macro */
108114

115+
#define SHM_FETCH_RESOURCE(shm_ptr, z_ptr) ZEND_FETCH_RESOURCE(shm_ptr, sysvshm_shm *, &z_ptr, -1, PHP_SHM_RSRC_NAME, php_sysvshm.le_shm)
116+
109117
THREAD_LS sysvshm_module php_sysvshm;
110118

111-
static int php_put_shm_data(sysvshm_chunk_head *ptr, long key, char *data, long len);
119+
static int php_put_shm_data(sysvshm_chunk_head *ptr, long key, const char *data, long len);
112120
static long php_check_shm_data(sysvshm_chunk_head *ptr, long key);
113121
static int php_remove_shm_data(sysvshm_chunk_head *ptr, long shm_varpos);
114122

@@ -126,7 +134,7 @@ static void php_release_sysvshm(zend_rsrc_list_entry *rsrc TSRMLS_DC)
126134
*/
127135
PHP_MINIT_FUNCTION(sysvshm)
128136
{
129-
php_sysvshm.le_shm = zend_register_list_destructors_ex(php_release_sysvshm, NULL, "sysvshm", module_number);
137+
php_sysvshm.le_shm = zend_register_list_destructors_ex(php_release_sysvshm, NULL, PHP_SHM_RSRC_NAME, module_number);
130138

131139
if (cfg_get_long("sysvshm.init_mem", &php_sysvshm.init_mem) == FAILURE) {
132140
php_sysvshm.init_mem=10000;
@@ -139,35 +147,19 @@ PHP_MINIT_FUNCTION(sysvshm)
139147
Creates or open a shared memory segment */
140148
PHP_FUNCTION(shm_attach)
141149
{
142-
long arg_key, arg_size, arg_flag = 0;
143-
long shm_size = 0, shm_flag;
144150
sysvshm_shm *shm_list_ptr;
145151
char *shm_ptr;
146152
sysvshm_chunk_head *chunk_ptr;
147-
key_t shm_key = (key_t) 0;
148-
long shm_id, list_id;
149-
int ac = ZEND_NUM_ARGS();
150-
151-
shm_flag = 0666;
152-
shm_size = php_sysvshm.init_mem;
153+
long shm_key, shm_id, shm_size = php_sysvshm.init_mem, shm_flag = 0666;
153154

154-
if (zend_parse_parameters(ac TSRMLS_CC, "l|ll", &arg_key, &arg_size, &arg_flag) == FAILURE) {
155+
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|ll", &shm_key, &shm_size, &shm_flag)) {
155156
return;
156157
}
157-
158-
shm_key = arg_key;
159-
160-
if (ac > 1) {
161-
shm_size = arg_size;
162-
if (ac > 2) {
163-
shm_flag = arg_flag;
164-
}
165-
}
166158

167159
if (shm_size < 1) {
168160
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Segment size must be greater then zero.");
169161
RETURN_FALSE;
170-
}
162+
}
171163

172164
shm_list_ptr = (sysvshm_shm *) emalloc(sizeof(sysvshm_shm));
173165

@@ -185,7 +177,7 @@ PHP_FUNCTION(shm_attach)
185177
}
186178
}
187179

188-
if ((shm_ptr = shmat(shm_id, NULL, 0)) == (void *) - 1) {
180+
if ((shm_ptr = shmat(shm_id, NULL, 0)) == (void *) -1) {
189181
php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed for key 0x%x: %s", shm_key, strerror(errno));
190182
efree(shm_list_ptr);
191183
RETURN_FALSE;
@@ -204,98 +196,70 @@ PHP_FUNCTION(shm_attach)
204196
shm_list_ptr->key = shm_key;
205197
shm_list_ptr->id = shm_id;
206198
shm_list_ptr->ptr = chunk_ptr;
207-
list_id = zend_list_insert(shm_list_ptr, php_sysvshm.le_shm);
208-
RETURN_LONG(list_id);
199+
200+
ZEND_REGISTER_RESOURCE(return_value, shm_list_ptr, php_sysvshm.le_shm);
209201
}
210202
/* }}} */
211203

212-
/* {{{ proto bool shm_detach(int shm_identifier)
204+
/* {{{ proto bool shm_detach(resource shm_identifier)
213205
Disconnects from shared memory segment */
214206
PHP_FUNCTION(shm_detach)
215207
{
216-
long arg_id;
217-
int type;
208+
zval *shm_id;
218209
sysvshm_shm *shm_list_ptr;
219210

220-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &arg_id) == FAILURE) {
211+
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &shm_id)) {
221212
return;
222213
}
223-
224-
shm_list_ptr = (sysvshm_shm *) zend_list_find(arg_id, &type);
225-
if (!shm_list_ptr || type != php_sysvshm.le_shm) {
226-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The parameter is not a valid shm_identifier");
227-
RETURN_FALSE;
228-
}
229-
230-
zend_list_delete(arg_id);
231-
232-
RETURN_TRUE;
214+
SHM_FETCH_RESOURCE(shm_list_ptr, shm_id);
215+
RETURN_BOOL(SUCCESS == zend_list_delete(Z_LVAL_P(shm_id)));
233216
}
234217
/* }}} */
235218

236-
/* {{{ proto bool shm_remove(int shm_identifier)
219+
/* {{{ proto bool shm_remove(resource shm_identifier)
237220
Removes shared memory from Unix systems */
238221
PHP_FUNCTION(shm_remove)
239222
{
240-
long arg_id;
241-
long id;
242-
int type;
223+
zval *shm_id;
243224
sysvshm_shm *shm_list_ptr;
244225

245-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &arg_id) == FAILURE) {
226+
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &shm_id)) {
246227
return;
247228
}
248-
249-
id = arg_id;
250-
shm_list_ptr = (sysvshm_shm *) zend_list_find(id, &type);
251-
252-
if (!shm_list_ptr || type != php_sysvshm.le_shm) {
253-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The parameter is not a valid shm_identifier");
229+
SHM_FETCH_RESOURCE(shm_list_ptr, shm_id);
230+
231+
if (shmctl(shm_list_ptr->id, IPC_RMID, NULL) < 0) {
232+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed for key 0x%x, id %ld: %s", shm_list_ptr->key, Z_LVAL_P(shm_id), strerror(errno));
254233
RETURN_FALSE;
255234
}
256235

257-
if (shmctl(shm_list_ptr->id, IPC_RMID,NULL) < 0) {
258-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed for key 0x%x, id %ld: %s", shm_list_ptr->key, id, strerror(errno));
259-
RETURN_FALSE;
260-
}
261-
262236
RETURN_TRUE;
263237
}
264238
/* }}} */
265239

266-
/* {{{ proto bool shm_put_var(int shm_identifier, int variable_key, mixed variable)
240+
/* {{{ proto bool shm_put_var(resource shm_identifier, int variable_key, mixed variable)
267241
Inserts or updates a variable in shared memory */
268242
PHP_FUNCTION(shm_put_var)
269243
{
270-
long arg_id, arg_key;
271-
zval **arg_var;
272-
long key, id;
244+
zval *shm_id, *arg_var;
245+
int ret;
246+
long shm_key;
273247
sysvshm_shm *shm_list_ptr;
274-
int type;
275248
smart_str shm_var = {0};
276-
int ret;
277249
php_serialize_data_t var_hash;
278250

279-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "llZ", &arg_id, &arg_key, &arg_var) == FAILURE) {
251+
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlz", &shm_id, &shm_key, &arg_var)) {
280252
return;
281253
}
282-
283-
id = arg_id;
284-
key = arg_key;
285-
286-
shm_list_ptr = (sysvshm_shm *) zend_list_find(id, &type);
287-
if (!shm_list_ptr || type != php_sysvshm.le_shm) {
288-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%ld is not a SysV shared memory index", id);
289-
RETURN_FALSE;
290-
}
291-
254+
SHM_FETCH_RESOURCE(shm_list_ptr, shm_id);
255+
292256
/* setup string-variable and serialize */
293-
294257
PHP_VAR_SERIALIZE_INIT(var_hash);
295-
php_var_serialize(&shm_var, arg_var, &var_hash TSRMLS_CC);
258+
php_var_serialize(&shm_var, &arg_var, &var_hash TSRMLS_CC);
296259
PHP_VAR_SERIALIZE_DESTROY(var_hash);
260+
297261
/* insert serialized variable into shared memory */
298-
ret = php_put_shm_data(shm_list_ptr->ptr, key, shm_var.c, shm_var.len);
262+
ret = php_put_shm_data(shm_list_ptr->ptr, shm_key, shm_var.c, shm_var.len);
299263

300264
/* free string */
301265
smart_str_free(&shm_var);
@@ -308,90 +272,86 @@ PHP_FUNCTION(shm_put_var)
308272
}
309273
/* }}} */
310274

311-
/* {{{ proto mixed shm_get_var(int id, int variable_key)
275+
/* {{{ proto mixed shm_get_var(resource id, int variable_key)
312276
Returns a variable from shared memory */
313277
PHP_FUNCTION(shm_get_var)
314278
{
315-
long arg_id, arg_key;
316-
long key, id;
279+
zval *shm_id;
280+
long shm_key;
317281
sysvshm_shm *shm_list_ptr;
318-
int type;
319-
char *shm_data;
282+
char *shm_data;
320283
long shm_varpos;
321284
sysvshm_chunk *shm_var;
322285
php_unserialize_data_t var_hash;
323-
324-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &arg_id, &arg_key) == FAILURE) {
286+
287+
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &shm_id, &shm_key)) {
325288
return;
326289
}
327-
328-
id = arg_id;
329-
key = arg_key;
330-
331-
shm_list_ptr = (sysvshm_shm *) zend_list_find(id, &type);
332-
if (!shm_list_ptr || type != php_sysvshm.le_shm) {
333-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%ld is not a SysV shared memory index", id);
334-
RETURN_FALSE;
335-
}
290+
SHM_FETCH_RESOURCE(shm_list_ptr, shm_id);
336291

337292
/* setup string-variable and serialize */
338293
/* get serialized variable from shared memory */
339-
shm_varpos = php_check_shm_data((shm_list_ptr->ptr), key);
294+
shm_varpos = php_check_shm_data((shm_list_ptr->ptr), shm_key);
340295

341296
if (shm_varpos < 0) {
342-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "variable key %ld doesn't exist", key);
297+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "variable key %ld doesn't exist", shm_key);
343298
RETURN_FALSE;
344299
}
345300
shm_var = (sysvshm_chunk*) ((char *)shm_list_ptr->ptr + shm_varpos);
346301
shm_data = &shm_var->mem;
347302

348303
PHP_VAR_UNSERIALIZE_INIT(var_hash);
349-
if (php_var_unserialize(&return_value, (const unsigned char **) &shm_data, shm_data + shm_var->length, &var_hash TSRMLS_CC) != 1) {
350-
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
304+
if (php_var_unserialize(&return_value, (const unsigned char **) &shm_data, (unsigned char *) shm_data + shm_var->length, &var_hash TSRMLS_CC) != 1) {
351305
php_error_docref(NULL TSRMLS_CC, E_WARNING, "variable data in shared memory is corrupted");
352-
RETURN_FALSE;
306+
RETVAL_FALSE;
353307
}
354308
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
355309
}
356310
/* }}} */
357311

358-
/* {{{ proto bool shm_remove_var(int id, int variable_key)
359-
Removes variable from shared memory */
360-
PHP_FUNCTION(shm_remove_var)
312+
/* {{{ proto bool shm_has_var(resource id, int variable_key)
313+
Checks whether a specific entry exists */
314+
PHP_FUNCTION(shm_has_var)
361315
{
362-
long arg_id, arg_key;
363-
long key, id;
316+
zval *shm_id;
317+
long shm_key;
364318
sysvshm_shm *shm_list_ptr;
365-
int type;
366-
long shm_varpos;
367-
368-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &arg_id, &arg_key) == FAILURE) {
319+
320+
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &shm_id, &shm_key)) {
369321
return;
370322
}
323+
SHM_FETCH_RESOURCE(shm_list_ptr, shm_id);
324+
RETURN_BOOL(php_check_shm_data(shm_list_ptr->ptr, shm_key) >= 0);
325+
}
326+
/* }}} */
371327

372-
id = arg_id;
373-
key = arg_key;
374-
375-
shm_list_ptr = (sysvshm_shm *) zend_list_find(id, &type);
376-
if (!shm_list_ptr || type != php_sysvshm.le_shm) {
377-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%ld is not a SysV shared memory index", id);
378-
RETURN_FALSE;
328+
/* {{{ proto bool shm_remove_var(resource id, int variable_key)
329+
Removes variable from shared memory */
330+
PHP_FUNCTION(shm_remove_var)
331+
{
332+
zval *shm_id;
333+
long shm_key, shm_varpos;
334+
sysvshm_shm *shm_list_ptr;
335+
336+
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &shm_id, &shm_key)) {
337+
return;
379338
}
339+
SHM_FETCH_RESOURCE(shm_list_ptr, shm_id);
380340

381-
shm_varpos = php_check_shm_data((shm_list_ptr->ptr), key);
341+
shm_varpos = php_check_shm_data((shm_list_ptr->ptr), shm_key);
382342

383343
if (shm_varpos < 0) {
384-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "variable key %ld doesn't exist", key);
344+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "variable key %ld doesn't exist", shm_key);
385345
RETURN_FALSE;
386346
}
387-
php_remove_shm_data((shm_list_ptr->ptr), shm_varpos);
347+
php_remove_shm_data((shm_list_ptr->ptr), shm_varpos);
388348
RETURN_TRUE;
389349
}
390350
/* }}} */
391351

392352
/* {{{ php_put_shm_data
393353
* inserts an ascii-string into shared memory */
394-
static int php_put_shm_data(sysvshm_chunk_head *ptr, long key, char *data, long len)
354+
static int php_put_shm_data(sysvshm_chunk_head *ptr, long key, const char *data, long len)
395355
{
396356
sysvshm_chunk *shm_var;
397357
long total_size;
@@ -404,7 +364,7 @@ static int php_put_shm_data(sysvshm_chunk_head *ptr, long key, char *data, long
404364
}
405365

406366
if (ptr->free < total_size) {
407-
return -1; /* not enough memeory */
367+
return -1; /* not enough memory */
408368
}
409369

410370
shm_var = (sysvshm_chunk *) ((char *) ptr + ptr->end);

0 commit comments

Comments
 (0)