/* * Copyright (C) 1999,2001 by Manfred Spraul. * * Redistribution of this file is permitted under the terms of the GNU * General Public License (GPL) */ #include #include #include #include #include #include #include #include #include #include #include #include #define TRUE 1 #define FALSE 0 union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminfo* __buf; }; #define barrier() __asm__ __volatile__("": : : "memory") int g_loops; int g_busy_in; int g_busy_out; int g_sem; int g_completedsem; static void thread_fnc(int id) { int i; volatile int j; int res; struct sembuf sop[1]; for (i=0;i \n"); if(argc != 6) { printf("Invalid parameters.\n"); return 1; } nsems=atoi(argv[1]); tasks=atoi(argv[2]); g_loops=atoi(argv[3]); g_loops = (g_loops+tasks-1)/tasks; g_busy_in=atoi(argv[4]); g_busy_out=atoi(argv[5]); g_completedsem = nsems; res = semget(IPC_PRIVATE, nsems+1, 0777 | IPC_CREAT); if(res == -1) { printf(" create failed.\n"); return 1; } g_sem = res; fflush(stdout); pids = malloc(sizeof(pid_t)*tasks); for (i=0;i