?? cj_semaphore.c
字號:
{
//YCJBG_PUSH_ERROR(109, "Semaphore release error");
}
else
{
return YCJOK;
}
}
if (inc_flag == 1)
{
YCJBG_PUSH_ERROR(134, "Semaphore release timeout error");
// printf("\n %s\n","Semaphore release timeout error -- CJSEInc");
inc_flag = 0; // 恢復信號 SIGALRM 標記
return YCJSERCODE_TIMEOUT;
}
#endif
return YCJOK;
}
/*****************************************************************************/
/* */
/* 函數名:CJSEDec */
/* 創建人:王克鋒 */
/* 日 期:2005-03-03 */
/* 接 口:1. PTCJSEStru v_ss 信號燈結構指針 */
/* 2. int v_sno 信號燈序號 */
/* 3. unsigned int v_val 信號燈減少的數值 */
/* 4. PTCJEMStack v_stack 錯誤堆棧指針 */
/* 返 回:YCJOK:成功;YCJERROR:失敗 */
/* 描 述:指定信號燈執行"減" */
/* */
/* */
/* 修改人: */
/* 日 期: */
/* 描 述: */
/* */
/*****************************************************************************/
static void dec_sem_handle(int signo)
{
dec_flag = 1;
}
int CJSEDec(PTCJSEStru v_ss, TCJUINT4 v_sno, TCJUINT4 v_val,
TCJUINT4 v_timeout, PTCJEMStack v_stack)
{
if ( v_val == 0 ) return YCJOK;
#ifdef YCJPLAT_WINDOWS
char sErrMsg[1024]; int i;
for (i=0; i<v_sno; i++)
{
if (WaitForSingleObject(v_ss->hsem[v_sno],INFINITE)!=WAIT_OBJECT_0)
{
GetLastErrMsg(sErrMsg, 1024);
YCJBG_PUSH_ERROR(124, "Semaphore wait error");
return YCJERROR;
}
}
#else
signal(SIGALRM, dec_sem_handle);
alarm(v_timeout);
struct sembuf sops;
if (v_ss==NULL || v_sno >= v_ss->cnt) return YCJERROR;
sops.sem_num = v_sno;
sops.sem_op = - v_val;
sops.sem_flg = SEM_UNDO;
dec_flag=0;
while( dec_flag==0 )
{
if(dec_flag==1) break; // 信號 SIGALRM 到達
if ( semop(v_ss->hsem,&sops,1)==-1 )
{
//YCJBG_PUSH_ERROR(134, "Semaphore wait error");
}
else
{
return YCJOK;
}
}
if (dec_flag == 1)
{
YCJBG_PUSH_ERROR(134, "Semaphore wait timeout error");
// printf("\n %s\n","Semaphore wait timeout error -- CJSEDec");
dec_flag = 0 ; // 恢復信號 SIGALRM 標記
return YCJSERCODE_TIMEOUT;
}
#endif
return YCJOK;
}
/*****************************************************************************/
/* */
/* 函數名:CJSESetVal */
/* 創建人:王克鋒 */
/* 日 期:2005-03-03 */
/* 接 口:1. PTCJSEStru v_ss 信號燈結構指針 */
/* 2. int v_sno 信號燈序號 */
/* 3. int v_val 信號燈設定的數值 */
/* 4. PTCJEMStack v_stack 錯誤堆棧指針 */
/* 返 回:YCJOK:成功;YCJERROR:失敗 */
/* 描 述:設置指定信號燈的當前值 */
/* */
/* */
/* 修改人: */
/* 日 期: */
/* 描 述: */
/* */
/*****************************************************************************/
int CJSESetVal(PTCJSEStru v_ss, TCJUINT4 v_sno, int v_val,PTCJEMStack v_stack)
{
#ifdef YCJPLAT_WINDOWS
#else
SEMUN arg;
arg.val=v_val;
if (v_ss==NULL || v_sno >= v_ss->cnt) return YCJERROR;
if (semctl(v_ss->hsem, v_sno, SETVAL, arg)==-1)
{
YCJBG_PUSH_ERROR(149, "Semaphore setval error");
return YCJERROR;
}
#endif
return YCJOK;
}
/*****************************************************************************/
/* */
/* 函數名:CJSEGetVal */
/* 創建人:王克鋒 */
/* 日 期:2005-03-03 */
/* 接 口:1. PTCJSEStru v_ss 信號燈結構指針 */
/* 2. int v_sno 信號燈序號 */
/* 3. int * v_val 返回信號燈的當前值 */
/* 4. PTCJEMStack v_stack 錯誤堆棧指針 */
/* 返 回:YCJOK:成功;YCJERROR:失敗 */
/* 描 述:設置指定信號燈的當前值 */
/* */
/* */
/* 修改人: */
/* 日 期: */
/* 描 述: */
/* */
/*****************************************************************************/
int CJSEGetVal(PTCJSEStru v_ss, TCJUINT4 v_sno, int * v_val,
PTCJEMStack v_stack)
{
#ifdef YCJPLAT_WINDOWS
*v_val=0;
#else
SEMUN arg;
if (v_ss==NULL || v_sno >= v_ss->cnt) return YCJERROR;
*v_val=semctl(v_ss->hsem, v_sno, GETVAL, arg);
if (*v_val==-1)
{
YCJBG_PUSH_ERROR(165, "Semaphore getval error");
return YCJERROR;
}
#endif
return YCJOK;
}
/*****************************************************************************/
/* */
/* 函數名:CJSEDestroy */
/* 創建人:王克鋒 */
/* 日 期:2005-03-03 */
/* 接 口: 1. PTCJSEStru v_ss 信號燈結構指針 */
/* 2. PTCJEMStack v_stack 錯誤堆棧指針 */
/* 返 回:YCJOK:成功;YCJERROR:失敗 */
/* 描 述:銷毀信號燈 */
/* */
/* */
/* 修改人: */
/* 日 期: */
/* 描 述: */
/* */
/*****************************************************************************/
int CJSEDestroy(PTCJSEStru v_ss, PTCJEMStack v_stack)
{
#ifdef YCJPLAT_WINDOWS
int i, n=0;
for (i=0; i<v_ss->cnt; i++) if (CloseHandle(v_ss->hsem[i])) n++;
free(v_ss->hsem);
return n>v_cnt?YCJOK:YCJERROR;
#else
SEMUN arg; arg.val = 0;
if (v_ss==NULL) return YCJERROR;
if (v_ss->hsem<0) return YCJOK;
return semctl(v_ss->hsem, 0, IPC_RMID, arg)==-1?YCJERROR:YCJOK;
#endif
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -