add file lock and unlock functions
parent
4df942b589
commit
6bd718079e
3
HISTORY
3
HISTORY
|
|
@ -1,7 +1,8 @@
|
||||||
|
|
||||||
Version 1.27 2016-04-08
|
Version 1.27 2016-04-09
|
||||||
* add function fd_set_cloexec
|
* add function fd_set_cloexec
|
||||||
* php-fastcommon.spec.in support PHP 7
|
* php-fastcommon.spec.in support PHP 7
|
||||||
|
* add file lock and unlock functions
|
||||||
|
|
||||||
Version 1.26 2016-03-16
|
Version 1.26 2016-03-16
|
||||||
* add logger parameter: compress_log_days_before
|
* add logger parameter: compress_log_days_before
|
||||||
|
|
|
||||||
27
src/logger.c
27
src/logger.c
|
|
@ -110,32 +110,11 @@ int log_init_ex(LogContext *pContext)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_lock_file(int fd, int cmd)
|
|
||||||
{
|
|
||||||
struct flock lock;
|
|
||||||
|
|
||||||
memset(&lock, 0, sizeof(lock));
|
|
||||||
lock.l_type = cmd;
|
|
||||||
lock.l_whence = SEEK_SET;
|
|
||||||
if (fcntl(fd, F_SETLKW, &lock) != 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "call fcntl fail, "
|
|
||||||
"errno: %d, error info: %s\n",
|
|
||||||
errno, STRERROR(errno));
|
|
||||||
return errno != 0 ? errno : ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define log_file_lock(fd) do_lock_file(fd, F_WRLCK)
|
|
||||||
#define log_file_unlock(fd) do_lock_file(fd, F_UNLCK)
|
|
||||||
|
|
||||||
static int log_print_header(LogContext *pContext)
|
static int log_print_header(LogContext *pContext)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
if ((result=log_file_lock(pContext->log_fd)) != 0)
|
if ((result=file_write_lock(pContext->log_fd)) != 0)
|
||||||
{
|
{
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -144,7 +123,7 @@ static int log_print_header(LogContext *pContext)
|
||||||
if (pContext->current_size < 0)
|
if (pContext->current_size < 0)
|
||||||
{
|
{
|
||||||
result = errno != 0 ? errno : EACCES;
|
result = errno != 0 ? errno : EACCES;
|
||||||
log_file_unlock(pContext->log_fd);
|
file_unlock(pContext->log_fd);
|
||||||
|
|
||||||
fprintf(stderr, "lseek file \"%s\" fail, " \
|
fprintf(stderr, "lseek file \"%s\" fail, " \
|
||||||
"errno: %d, error info: %s\n", \
|
"errno: %d, error info: %s\n", \
|
||||||
|
|
@ -155,7 +134,7 @@ static int log_print_header(LogContext *pContext)
|
||||||
{
|
{
|
||||||
pContext->print_header_callback(pContext);
|
pContext->print_header_callback(pContext);
|
||||||
}
|
}
|
||||||
log_file_unlock(pContext->log_fd);
|
file_unlock(pContext->log_fd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2299,3 +2299,40 @@ bool is_power2(const int64_t n)
|
||||||
return i == n;
|
return i == n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int do_lock_file(int fd, int cmd)
|
||||||
|
{
|
||||||
|
struct flock lock;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
memset(&lock, 0, sizeof(lock));
|
||||||
|
lock.l_type = cmd;
|
||||||
|
lock.l_whence = SEEK_SET;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ((result=fcntl(fd, F_SETLKW, &lock)) != 0)
|
||||||
|
{
|
||||||
|
result = errno != 0 ? errno : ENOMEM;
|
||||||
|
fprintf(stderr, "call fcntl fail, "
|
||||||
|
"errno: %d, error info: %s\n",
|
||||||
|
result, STRERROR(result));
|
||||||
|
}
|
||||||
|
} while (result == EINTR);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int file_read_lock(int fd)
|
||||||
|
{
|
||||||
|
return do_lock_file(fd, F_RDLCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
int file_write_lock(int fd)
|
||||||
|
{
|
||||||
|
return do_lock_file(fd, F_WRLCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
int file_unlock(int fd)
|
||||||
|
{
|
||||||
|
return do_lock_file(fd, F_UNLCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -552,6 +552,27 @@ int64_t get_current_time_us();
|
||||||
*/
|
*/
|
||||||
bool is_power2(const int64_t n);
|
bool is_power2(const int64_t n);
|
||||||
|
|
||||||
|
/** set file read lock
|
||||||
|
* parameters:
|
||||||
|
* fd: the file descriptor to lock
|
||||||
|
* return: error no, 0 for success, != 0 fail
|
||||||
|
*/
|
||||||
|
int file_read_lock(int fd);
|
||||||
|
|
||||||
|
/** set file write lock
|
||||||
|
* parameters:
|
||||||
|
* fd: the file descriptor to lock
|
||||||
|
* return: error no, 0 for success, != 0 fail
|
||||||
|
*/
|
||||||
|
int file_write_lock(int fd);
|
||||||
|
|
||||||
|
/** file unlock
|
||||||
|
* parameters:
|
||||||
|
* fd: the file descriptor to unlock
|
||||||
|
* return: error no, 0 for success, != 0 fail
|
||||||
|
*/
|
||||||
|
int file_unlock(int fd);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue