利用创建临时文件实现共享存储锁

实现的是读写锁,很垃圾,但是也保留着,以后鄙视自己用。

#include "bson_rw.h"

//return true if count file exist,
bool CheckReadLock(const char *filename)
{
	assert(filename != NULL);
	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+13);
	strcpy(tmpname,filename);
	strcat(tmpname,".rlock.count");

	FILE *fp = fopen(tmpname, "r");
	if(fp == NULL)
	{
		return false;
	}
	fclose(fp);
	return true;
}
int FetchReadLockNum(const char *filename)
{
	assert(filename != NULL);
	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+13);
	strcpy(tmpname,filename);
	strcat(tmpname,".rlock.count");

	FILE *fp = fopen(tmpname, "r");
	if(fp == NULL)
	{
		free(tmpname);
		return 0;
	}

	int num = 0;
	char c;
	while((c = fgetc(fp)) != EOF)
	{
		num++;
	}
	fclose(fp);
	
	return num;
}
void UlinkFile(const char *filename)
{
	assert(filename != NULL);
	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+13);
	strcpy(tmpname,filename);
	strcat(tmpname,".rlock.count");

	unlink(tmpname);
}
void AddReadLockCount(const char *filename)
{
	assert(filename != NULL);
	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+13);
	strcpy(tmpname,filename);
	strcat(tmpname,".rlock.count");

	FILE *fp = fopen(tmpname,"a");
	char c = 'a';
	fprintf(fp, "%c",c);
	fclose(fp);
	free(tmpname);
}
void DelReadLockCount(const char *filename)
{
	assert(filename != NULL);
	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+13);
	strcpy(tmpname,filename);
	strcat(tmpname,".rlock.count");

	FILE *fp = fopen(tmpname, "r");
	if(fp == NULL)
	{
		free(tmpname);
		return ;
	}

	int num = 0;
	char c;
	while((c = fgetc(fp)) != EOF)
	{
		num++;
	}
	fclose(fp);

	if(num == 0)
	{
		unlink(tmpname);
	}
	else
	{
		FILE *fp_w = fopen(tmpname,"w");
		char *tmpstr = (char*)malloc(num);
		memset(tmpstr,'a',num);
		*(tmpstr+num-1) = '\0';
		fprintf(fp_w,"%s",tmpstr);
		fclose(fp_w);
	}
	free(tmpname);
}

#ifdef WIN32

HANDLE lock_file_w(const char *filename)
{
	assert(filename != NULL);
	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,filename);
	strcat(tmpname,".wlock");

	HANDLE handle = CreateFileA(tmpname,
		0,
		FILE_SHARE_READ,
		NULL,
		CREATE_NEW ,
		FILE_ATTRIBUTE_SYSTEM ,
		NULL);

	if(handle == INVALID_HANDLE_VALUE)
	{
		free(tmpname);
		return INVALID_HANDLE_VALUE;
	}
	free(tmpname);
	return handle;
}

void unlock_file_w(const char *filename, HANDLE handle)
{
	assert(filename != NULL);
	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,filename);
	strcat(tmpname,".wlock");

	CloseHandle(handle);
	unlink(tmpname);
	free(tmpname);
}

int lock_test_w(const char *name)
{
	assert(name != NULL);
	int len = strlen(name);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,name);
	strcat(tmpname,".wlock");

	HANDLE handle = CreateFileA(tmpname,
		0,
		FILE_SHARE_READ,
		NULL,
		CREATE_NEW ,
		FILE_ATTRIBUTE_SYSTEM ,
		NULL);

	if(handle == INVALID_HANDLE_VALUE)
	{
		free(tmpname);
		CloseHandle(handle);
		return -FILE_ERR_ALREADY_LOCK;
	}

	CloseHandle(handle);
	unlink(tmpname);
	free(tmpname);
	return 0;
}

HANDLE lock_file_r(const char *filename)
{
	assert(filename != NULL);
	AddReadLockCount(filename);

	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,filename);
	strcat(tmpname,".rlock");
	
	HANDLE handle = CreateFileA(tmpname,
		0,
		FILE_SHARE_READ,
		NULL,


		CREATE_NEW ,
		FILE_ATTRIBUTE_SYSTEM ,
		NULL);

	if(handle == INVALID_HANDLE_VALUE)
	{
		free(tmpname);
		return INVALID_HANDLE_VALUE;
	}
	free(tmpname);
	return handle;
}

void unlock_file_r(const char *filename, HANDLE handle)
{
	assert(filename != NULL);
	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,filename);
	strcat(tmpname,".rlock");

	CloseHandle(handle);
	unlink(tmpname);
	free(tmpname);
}

int lock_test_r(const char *name)
{
	assert(name != NULL);
	int len = strlen(name);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,name);
	strcat(tmpname,".rlock");

	HANDLE handle = CreateFileA(tmpname,
		0,
		FILE_SHARE_READ,
		NULL,
		CREATE_NEW ,
		FILE_ATTRIBUTE_SYSTEM ,
		NULL);

	if(handle == INVALID_HANDLE_VALUE)
	{
		free(tmpname);
		CloseHandle(handle);
		return -FILE_ERR_ALREADY_LOCK;
	}

	CloseHandle(handle);
	unlink(tmpname);
	free(tmpname);
	return 0;
}

#else

int lock_file_w(const char *filename)
{
	assert(filename != NULL);
	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,filename);
	strcat(tmpname,".wlock");

	int fd = open(tmpname, O_CREAT | O_EXCL);
	if(fd == -1)
	{
		free(tmpname);
		return -1;
	}
	free(tmpname);
	return fd;	
}

void unlock_file_w(const char *filename, int fd)
{
	assert(filename != NULL);
	
	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,filename);
	strcat(tmpname,".wlock");

	close(fd);
	unlink(tmpname);
	free(tmpname);
}

int lock_test_w(const char *name)
{
	assert(name != NULL);
	int len = strlen(name);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,name);
	strcat(tmpname,".wlock");

	int fd = open(tmpname,  O_CREAT | O_EXCL);
	if(fd == -1)
	{
		close(fd);
		free(tmpname);
		return FILE_ERR_ALREADY_LOCK;
	}
	
	close(fd);
	unlink(tmpname);
	free(tmpname);
	return 0;
}

int lock_file_r(const char *filename)
{
	assert(filename != NULL);
	AddReadLockCount(filename);

	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,filename);
	strcat(tmpname,".rlock");

	int fd = open(tmpname, O_CREAT | O_EXCL);
	if(fd == -1)
	{
		free(tmpname);
		return -1;
	}
	free(tmpname);
	return fd;	
}
void unlock_file_r(const char *filename, int fd)
{
	assert(filename != NULL);
	int len = strlen(filename);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,filename);
	strcat(tmpname,".rlock");

	close(fd);
	unlink(tmpname);
	free(tmpname);
}
int lock_test_r(const char *name)
{
	assert(name != NULL);
	int len = strlen(name);
	char *tmpname = (char*) malloc(len+7);
	strcpy(tmpname,name);
	strcat(tmpname,".rlock");

	int fd = open(tmpname,  O_CREAT | O_EXCL);
	if(fd == -1)
	{
		close(fd);
		free(tmpname);
		return FILE_ERR_ALREADY_LOCK;
	}

	close(fd);
	unlink(tmpname);
	free(tmpname);
	return 0;
}

#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值