* More generous buffer sizes for the semaphore and shared memory object names.
* The result shared memory was mapped PROT_WRITE only, but since the variable in it is used with the increment operator, it needs PROT_READ, too. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36089 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+17
-17
@@ -18,13 +18,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* ftruncate was formerly an XOPEN extension. We define _XOPEN_SOURCE here to
|
/* ftruncate was formerly an XOPEN extension. We define _XOPEN_SOURCE here to
|
||||||
avoid warning if the implementation does not program ftruncate as a base
|
avoid warning if the implementation does not program ftruncate as a base
|
||||||
interface */
|
interface */
|
||||||
|
|
||||||
/* adam.li: 2004-04-30: Rewrite the test case. The idea is that with
|
/* adam.li: 2004-04-30: Rewrite the test case. The idea is that with
|
||||||
O_CREAT and O_EXCL specified, to shm_open() a object can only success
|
O_CREAT and O_EXCL specified, to shm_open() a object can only success
|
||||||
once, although multiple processes might open with the same name at the
|
once, although multiple processes might open with the same name at the
|
||||||
same time.
|
same time.
|
||||||
*/
|
*/
|
||||||
#define _XOPEN_SOURCE 600
|
#define _XOPEN_SOURCE 600
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "posixtest.h"
|
#include "posixtest.h"
|
||||||
|
|
||||||
#define NAME_SIZE 20
|
#define NAME_SIZE 50
|
||||||
#define SHM_NAME "/posixtest_23-1_%d"
|
#define SHM_NAME "/posixtest_23-1_%d"
|
||||||
|
|
||||||
/* The processes communicate by a shared memory object */
|
/* The processes communicate by a shared memory object */
|
||||||
@@ -57,10 +57,10 @@ int child_func(void)
|
|||||||
{
|
{
|
||||||
int i, fd;
|
int i, fd;
|
||||||
struct timespec ts = {.tv_sec = 0, .tv_nsec = 0};
|
struct timespec ts = {.tv_sec = 0, .tv_nsec = 0};
|
||||||
int msec = 0;
|
int msec = 0;
|
||||||
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
for(i=0; i<NLOOP; i++){
|
for(i=0; i<NLOOP; i++){
|
||||||
sprintf(name, SHM_NAME, i);
|
sprintf(name, SHM_NAME, i);
|
||||||
fd = shm_open(name, O_RDONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
|
fd = shm_open(name, O_RDONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
|
||||||
@@ -81,9 +81,9 @@ int child_func(void)
|
|||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
int i, pid, result_fd;
|
int i, pid, result_fd;
|
||||||
char semname[20];
|
char semname[50];
|
||||||
|
|
||||||
snprintf(semname, 20, "/sem23-1_%ld", (long)getpid());
|
snprintf(semname, sizeof(semname), "/sem23-1_%ld", (long)getpid());
|
||||||
sem = sem_open(semname, O_CREAT, 0777, 1);
|
sem = sem_open(semname, O_CREAT, 0777, 1);
|
||||||
if( sem == SEM_FAILED || sem == NULL ) {
|
if( sem == SEM_FAILED || sem == NULL ) {
|
||||||
perror("error at sem_open");
|
perror("error at sem_open");
|
||||||
@@ -91,8 +91,8 @@ int main() {
|
|||||||
}
|
}
|
||||||
sem_unlink(semname);
|
sem_unlink(semname);
|
||||||
|
|
||||||
result_fd = shm_open(SHM_RESULT_NAME,
|
result_fd = shm_open(SHM_RESULT_NAME,
|
||||||
O_RDWR|O_CREAT,
|
O_RDWR|O_CREAT,
|
||||||
S_IRUSR|S_IWUSR);
|
S_IRUSR|S_IWUSR);
|
||||||
if(result_fd == -1){
|
if(result_fd == -1){
|
||||||
perror("An error occurs when calling shm_open()");
|
perror("An error occurs when calling shm_open()");
|
||||||
@@ -102,16 +102,16 @@ int main() {
|
|||||||
if(ftruncate(result_fd, sizeof(*create_cnt)) != 0) {
|
if(ftruncate(result_fd, sizeof(*create_cnt)) != 0) {
|
||||||
perror("An error occurs when calling ftruncate()");
|
perror("An error occurs when calling ftruncate()");
|
||||||
shm_unlink(SHM_RESULT_NAME);
|
shm_unlink(SHM_RESULT_NAME);
|
||||||
return PTS_UNRESOLVED;
|
return PTS_UNRESOLVED;
|
||||||
}
|
}
|
||||||
|
|
||||||
create_cnt = mmap(NULL, sizeof(*create_cnt), PROT_WRITE,
|
create_cnt = mmap(NULL, sizeof(*create_cnt), PROT_READ | PROT_WRITE,
|
||||||
MAP_SHARED, result_fd, 0);
|
MAP_SHARED, result_fd, 0);
|
||||||
if( create_cnt == MAP_FAILED) {
|
if( create_cnt == MAP_FAILED) {
|
||||||
perror("An error occurs when calling mmap()");
|
perror("An error occurs when calling mmap()");
|
||||||
shm_unlink(SHM_RESULT_NAME);
|
shm_unlink(SHM_RESULT_NAME);
|
||||||
return PTS_UNRESOLVED;
|
return PTS_UNRESOLVED;
|
||||||
}
|
}
|
||||||
|
|
||||||
*create_cnt = 0;
|
*create_cnt = 0;
|
||||||
|
|
||||||
@@ -127,11 +127,11 @@ int main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (wait(NULL) > 0);
|
while (wait(NULL) > 0);
|
||||||
|
|
||||||
for(i=0; i<NLOOP; i++){
|
for(i=0; i<NLOOP; i++){
|
||||||
sprintf(name, SHM_NAME, i);
|
sprintf(name, SHM_NAME, i);
|
||||||
shm_unlink(name);
|
shm_unlink(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "create_cnt: %d\n", *create_cnt);
|
fprintf(stderr, "create_cnt: %d\n", *create_cnt);
|
||||||
if(*create_cnt != NLOOP){
|
if(*create_cnt != NLOOP){
|
||||||
|
|||||||
Reference in New Issue
Block a user