⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cj_semaphore.c

📁 堆栈等代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		{
			//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 + -