FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Cluster Development

 
 
LinkBack Thread Tools
 
Old 10-10-2011, 08:45 AM
"Fabio M. Di Nitto"
 
Default liblogthread: make library thread safer

- all public API should lock/unlock appropriately
- internal _conf function is now lock-free, locking must
be provided by callers. this saves different unlock/race/lock
conditions.
- make init and re-init thread safe and move common code to _init

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
---
:100644 100644 7230b2f... 088d171... M common/liblogthread/liblogthread.c
common/liblogthread/liblogthread.c | 51 ++++++++++++++++++++++++-----------
1 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/common/liblogthread/liblogthread.c b/common/liblogthread/liblogthread.c
index 7230b2f..088d171 100644
--- a/common/liblogthread/liblogthread.c
+++ b/common/liblogthread/liblogthread.c
@@ -166,7 +166,6 @@ static void _conf(const char *name, int mode, int syslog_facility,
{
int fd;

- pthread_mutex_lock(&mutex);
logt_mode = mode;
logt_syslog_facility = syslog_facility;
logt_syslog_priority = syslog_priority;
@@ -197,24 +196,22 @@ static void _conf(const char *name, int mode, int syslog_facility,
closelog();
openlog(logt_name, LOG_CONS | LOG_PID, logt_syslog_facility);
}
- pthread_mutex_unlock(&mutex);
}

void logt_conf(const char *name, int mode, int syslog_facility, int syslog_priority,
int logfile_priority, const char *logfile)
{
- if (!init)
- return;
+ pthread_mutex_lock(&mutex);
+ if (init)
+ _conf(name, mode, syslog_facility, syslog_priority, logfile_priority,
+ logfile);

- _conf(name, mode, syslog_facility, syslog_priority, logfile_priority,
- logfile);
+ pthread_mutex_unlock(&mutex);
}

-int logt_init(const char *name, int mode, int syslog_facility, int syslog_priority,
+static int _init(const char *name, int mode, int syslog_facility, int syslog_priority,
int logfile_priority, const char *logfile)
{
- int rv;
-
if (init)
return -1;

@@ -224,18 +221,30 @@ int logt_init(const char *name, int mode, int syslog_facility, int syslog_priori
ents = malloc(num_ents * sizeof(struct entry));
if (!ents)
return -1;
+
memset(ents, 0, num_ents * sizeof(struct entry));

- rv = pthread_create(&thread_handle, NULL, thread_fn, NULL);
- if (rv) {
+ if (pthread_create(&thread_handle, NULL, thread_fn, NULL)) {
free(ents);
return -1;
}
done = 0;
init = 1;
+
return 0;
}

+int logt_init(const char *name, int mode, int syslog_facility, int syslog_priority,
+ int logfile_priority, const char *logfile)
+{
+ int rv = 0;
+
+ pthread_mutex_lock(&mutex);
+ rv = _init(name, mode, syslog_facility, syslog_priority,
+ logfile_priority, logfile);
+ pthread_mutex_unlock(&mutex);
+ return rv;
+}

/*
* Reinitialize logt w/ previous values (e.g. use after
@@ -247,23 +256,33 @@ int logt_reinit(void)
{
char name_tmp[PATH_MAX];
char file_tmp[PATH_MAX];
+ int rv = 0;

- if (!done || init)
- return -1;
+ pthread_mutex_lock(&mutex);
+ if (!done || init) {
+ rv = -1;
+ goto out;
+ }

/* Use copies on the stack for these */
memset(name_tmp, 0, sizeof(name_tmp));
memset(file_tmp, 0, sizeof(file_tmp));

strncpy(name_tmp, logt_name, sizeof(name_tmp) - 1);
- if (!strlen(name_tmp))
- return -1;
+ if (!strlen(name_tmp)) {
+ rv = -1;
+ goto out;
+ }
if (strlen(logt_logfile))
strncpy(file_tmp, logt_logfile, sizeof(file_tmp) - 1);

- return logt_init(name_tmp, logt_mode, logt_syslog_facility,
+ rv = _init(name_tmp, logt_mode, logt_syslog_facility,
logt_syslog_priority, logt_logfile_priority,
file_tmp);
+
+out:
+ pthread_mutex_unlock(&mutex);
+ return rv;
}


--
1.7.4.4
 
Old 10-10-2011, 08:45 AM
"Fabio M. Di Nitto"
 
Default liblogthread: make library thread safer

- all public API should lock/unlock appropriately
- internal _conf function is now lock-free, locking must
be provided by callers. this saves different unlock/race/lock
conditions.
- make init and re-init thread safe and move common code to _init

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
---
:100644 100644 7230b2f... 088d171... M common/liblogthread/liblogthread.c
common/liblogthread/liblogthread.c | 51 ++++++++++++++++++++++++-----------
1 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/common/liblogthread/liblogthread.c b/common/liblogthread/liblogthread.c
index 7230b2f..088d171 100644
--- a/common/liblogthread/liblogthread.c
+++ b/common/liblogthread/liblogthread.c
@@ -166,7 +166,6 @@ static void _conf(const char *name, int mode, int syslog_facility,
{
int fd;

- pthread_mutex_lock(&mutex);
logt_mode = mode;
logt_syslog_facility = syslog_facility;
logt_syslog_priority = syslog_priority;
@@ -197,24 +196,22 @@ static void _conf(const char *name, int mode, int syslog_facility,
closelog();
openlog(logt_name, LOG_CONS | LOG_PID, logt_syslog_facility);
}
- pthread_mutex_unlock(&mutex);
}

void logt_conf(const char *name, int mode, int syslog_facility, int syslog_priority,
int logfile_priority, const char *logfile)
{
- if (!init)
- return;
+ pthread_mutex_lock(&mutex);
+ if (init)
+ _conf(name, mode, syslog_facility, syslog_priority, logfile_priority,
+ logfile);

- _conf(name, mode, syslog_facility, syslog_priority, logfile_priority,
- logfile);
+ pthread_mutex_unlock(&mutex);
}

-int logt_init(const char *name, int mode, int syslog_facility, int syslog_priority,
+static int _init(const char *name, int mode, int syslog_facility, int syslog_priority,
int logfile_priority, const char *logfile)
{
- int rv;
-
if (init)
return -1;

@@ -224,18 +221,30 @@ int logt_init(const char *name, int mode, int syslog_facility, int syslog_priori
ents = malloc(num_ents * sizeof(struct entry));
if (!ents)
return -1;
+
memset(ents, 0, num_ents * sizeof(struct entry));

- rv = pthread_create(&thread_handle, NULL, thread_fn, NULL);
- if (rv) {
+ if (pthread_create(&thread_handle, NULL, thread_fn, NULL)) {
free(ents);
return -1;
}
done = 0;
init = 1;
+
return 0;
}

+int logt_init(const char *name, int mode, int syslog_facility, int syslog_priority,
+ int logfile_priority, const char *logfile)
+{
+ int rv = 0;
+
+ pthread_mutex_lock(&mutex);
+ rv = _init(name, mode, syslog_facility, syslog_priority,
+ logfile_priority, logfile);
+ pthread_mutex_unlock(&mutex);
+ return rv;
+}

/*
* Reinitialize logt w/ previous values (e.g. use after
@@ -247,23 +256,33 @@ int logt_reinit(void)
{
char name_tmp[PATH_MAX];
char file_tmp[PATH_MAX];
+ int rv = 0;

- if (!done || init)
- return -1;
+ pthread_mutex_lock(&mutex);
+ if (!done || init) {
+ rv = -1;
+ goto out;
+ }

/* Use copies on the stack for these */
memset(name_tmp, 0, sizeof(name_tmp));
memset(file_tmp, 0, sizeof(file_tmp));

strncpy(name_tmp, logt_name, sizeof(name_tmp) - 1);
- if (!strlen(name_tmp))
- return -1;
+ if (!strlen(name_tmp)) {
+ rv = -1;
+ goto out;
+ }
if (strlen(logt_logfile))
strncpy(file_tmp, logt_logfile, sizeof(file_tmp) - 1);

- return logt_init(name_tmp, logt_mode, logt_syslog_facility,
+ rv = _init(name_tmp, logt_mode, logt_syslog_facility,
logt_syslog_priority, logt_logfile_priority,
file_tmp);
+
+out:
+ pthread_mutex_unlock(&mutex);
+ return rv;
}


--
1.7.4.4
 

Thread Tools




All times are GMT. The time now is 10:05 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org