shmop_open под win

Жигaн

Новичок
shmop_open под win

ОС: winXP
Для shmop_open Не работает флаг 'n' для win платформы т.е.
PHP:
$result = shmop_open(0x11223344, 'n', 0600, 1024);
var_dump($result);
всегда возвращает false.
если заменить флаг 'n' на 'c' -- все ок.

Может проблемы с эмуляцией shmget ф-ции под win?

файл: TSRM/tsrm_win32.c
Код:
TSRM_API int shmget(int key, int size, int flags)
{
	...
	...

	shm_handle  = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_segment);
	info_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_info);

	if ((!shm_handle && !info_handle)) {
		if (flags & IPC_EXCL) {
			return -1;
		}
		if (flags & IPC_CREAT) {
			shm_handle	= CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, shm_segment);
			info_handle	= CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(shm->descriptor), shm_info);
			created		= TRUE;
		}
		if ((!shm_handle || !info_handle)) {
			return -1;
		}
	}

	...
	...
}
для флага 'n'(shmop_open) flags=IPC_CREAT|IPC_EXCL, имхо код должен быть такой

Код:
TSRM_API int shmget(int key, int size, int flags)
{
	...
	...

	shm_handle  = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_segment);
	info_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_info);

	if ((!shm_handle && !info_handle)) {
		if (flags & IPC_CREAT) {
			shm_handle	= CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, shm_segment);
			info_handle	= CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(shm->descriptor), shm_info);
			created		= TRUE;
		}
		if ((!shm_handle || !info_handle)) {
			return -1;
		}
	} else {
		if (flags & IPC_EXCL) {
			return -1;
		}
	}

	...
	...
}
или я неправ?
 

tony2001

TeaM PHPClub
>для флага 'n'(shmop_open) flags=IPC_CREAT|IPC_EXCL, имхо код должен быть такой

обоснуй.
 

Жигaн

Новичок
tony2001:
Из man shmget:

IPC_CREAT
to create a new segment. If this flag is not used, then shmget() will find the segment associated with key and check to see if the user has permission to access the segment.

IPC_EXCL
used with IPC_CREAT to ensure failure if the segment already exists.

т.е. если указан IPC_EXCL флаг И сегмент с ключем key существует shmget() вернет -1. так?

теперь смотрим оригинальный код
Код:
	shm_handle  = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_segment);
	info_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_info);
открываем файл маппинг

Код:
	if ((!shm_handle && !info_handle)) {
		if (flags & IPC_EXCL) {
			return -1;
		}
если не смогли открыть И есть флаг IPC_EXCL выходим. т.е. все в точности до наоборот.
я предложил сделать так:

Код:
открываем_маппинг();

if(не смогли открыть) {
  создаем_маппинг();

  if(не создалось) {
    return -1;
  }
} else {
  // успешно открыли, теперь надо проверить флаг IPC_EXCL
  if(установлен флаг IPC_EXCL) {
    return -1;
  }
}
 

tony2001

TeaM PHPClub
убедил, сейчас исправлю.
кого благодарить в коммит-мессадже? ("Жиган" как-то не звучит..)
 
Сверху