*************** *** 357,371 **** debug_printf("do_semop : return -EACCES\n"); CYGWIN32_IPCNT_RETURN (-EACCES) ; } ! ReleaseSemaphore(LHandle, sop->sem_op, &LVal) ; ! shareadrsem->current_nb[id].current_nb[sop->sem_num] += ! sop->sem_op ; sem_deconnect() ; } else { if( sop->sem_flg == IPC_NOWAIT ) { ! LRet = WaitForSingleObject(LHandle, 0) ; ! if( LRet == WAIT_TIMEOUT ) { debug_printf("do_semop : return -EAGAIN\n"); CYGWIN32_IPCNT_RETURN (-EAGAIN) ; --- 373,386 ---- debug_printf("do_semop : return -EACCES\n"); CYGWIN32_IPCNT_RETURN (-EACCES) ; } ! shareadrsem->current_nb[id].current_nb[sop->sem_num] += ! sop->sem_op ; sem_deconnect() ; + ReleaseSemaphore(LHandle, 1 , &LVal) ; } else { if( sop->sem_flg == IPC_NOWAIT ) { ! if( sop->sem_op + shareadrsem->current_nb[id].current_nb[sop->sem_num] <0 ) { debug_printf("do_semop : return -EAGAIN\n"); CYGWIN32_IPCNT_RETURN (-EAGAIN) ; *************** *** 375,390 **** debug_printf("do_semop : return -EACCES\n"); CYGWIN32_IPCNT_RETURN (-EACCES) ; } ! shareadrsem->current_nb[id].current_nb[sop->sem_num] -= 1 ; sem_deconnect() ; } else { ! LRet = WaitForSingleObject(LHandle, INFINITE) ; if (sem_connect() == 0) { debug_printf("do_semop : return -EACCES\n"); CYGWIN32_IPCNT_RETURN (-EACCES) ; } ! shareadrsem->current_nb[id].current_nb[sop->sem_num] -= 1 ; sem_deconnect() ; } } --- 390,407 ---- debug_printf("do_semop : return -EACCES\n"); CYGWIN32_IPCNT_RETURN (-EACCES) ; } ! shareadrsem->current_nb[id].current_nb[sop->sem_num] += sop->sem_op; sem_deconnect() ; } else { ! while(sop->sem_op + shareadrsem->current_nb[id].current_nb[sop->sem_num] <0) ! LRet = WaitForSingleObject(LHandle, INFINITE) ; ! if (sem_connect() == 0) { debug_printf("do_semop : return -EACCES\n"); CYGWIN32_IPCNT_RETURN (-EACCES) ; } ! shareadrsem->current_nb[id].current_nb[sop->sem_num] += sop->sem_op ; sem_deconnect() ; } } *************** *** 435,441 **** char LBuff[100] ; HANDLE LHandle ; long LPrevious ; - int LIndex; debug_printf("semctl : semid=%X semnum=%X cmd=0x%02X arg=%p\n",semid,semnum,cmd,arg); if (semid < 0 || semnum < 0 || cmd < 0) --- 452,457 ---- char LBuff[100] ; HANDLE LHandle ; long LPrevious ; debug_printf("semctl : semid=%X semnum=%X cmd=0x%02X arg=%p\n",semid,semnum,cmd,arg); if (semid < 0 || semnum < 0 || cmd < 0) *************** *** 568,589 **** if( LHandle != NULL ) { if( arg.val > shareadrsem->current_nb[id].current_nb[semnum] ) ! { ! ReleaseSemaphore(LHandle, ! arg.val-shareadrsem->current_nb[id].current_nb[semnum], ! &LPrevious) ; ! } ! else if (arg.val < ! shareadrsem->current_nb[id].current_nb[semnum] ) ! { ! for( LIndex = arg.val; ! LIndex < shareadrsem->current_nb[id].current_nb[semnum]; ! LIndex++ ) ! { ! WaitForSingleObject(LHandle, 0) ; ! } ! } ! shareadrsem->current_nb[id].current_nb[semnum] = arg.val ; } debug_printf("semctl : SETVAL : return 0\n"); CYGWIN32_IPCNT_RETURN_DECONNECT (0); --- 584,591 ---- if( LHandle != NULL ) { if( arg.val > shareadrsem->current_nb[id].current_nb[semnum] ) ! ReleaseSemaphore(LHandle,1,&LPrevious) ; ! shareadrsem->current_nb[id].current_nb[semnum] = arg.val ; } debug_printf("semctl : SETVAL : return 0\n");