ports/sysutils/conky/files/patch-src-common.c
Martin Wilke ae61f5a264 - Update to 1.8.0
PR:		147795
Submitted by:	Nikos Ntarmos <ntarmos@cs.uoi.gr> (maintainer)
2010-07-12 03:15:52 +00:00

63 lines
1.8 KiB
C

--- src/common.c.orig
+++ src/common.c
@@ -84,9 +84,10 @@ char *strndup(const char *s, size_t n)
}
#endif /* HAVE_STRNDUP */
-void update_uname(void)
+int update_uname(void)
{
uname(&info.uname_s);
+ return 0;
}
double get_time(void)
@@ -268,7 +269,7 @@ void format_seconds_short(char *buf, unsigned int n, long seconds)
* Populated while initialising text objects in construct_text_object(). */
static struct update_cb {
struct update_cb *next;
- void (*func)(void);
+ int (*func)(void);
pthread_t thread;
sem_t start_wait, end_wait;
@@ -286,7 +287,7 @@ static int threading_started = 0;
/* Register an update callback. Don't allow duplicates, to minimise side
* effects and overhead. */
-void add_update_callback(void (*func)(void))
+void add_update_callback(int (*func)(void))
{
struct update_cb *uc = &update_cb_head;
@@ -376,7 +377,12 @@ static void *run_update_callback(void *data)
while (1) {
if (sem_wait(&ucb->start_wait)) pthread_exit(NULL);
if (ucb->running == 0) pthread_exit(NULL);
- (*ucb->func)();
+ if((*ucb->func)()) {
+ ucb->next = ucb; //this is normally not be possible, so we use it to show that there was a critical error
+ sem_post(&ucb->end_wait);
+ sem_post(&ucb->end_wait);
+ pthread_exit(NULL);
+ }
if (sem_post(&ucb->end_wait)) pthread_exit(NULL);
}
}
@@ -411,8 +417,14 @@ void update_stuff(void)
}
/* need to synchronise here, otherwise locking is needed (as data
* would be printed with some update callbacks still running) */
- for (uc = update_cb_head.next; uc; uc = uc->next)
+ for (uc = update_cb_head.next; uc; uc = uc->next) {
sem_wait(&uc->end_wait);
+ if(uc == uc->next) {
+ pthread_join(uc->thread, NULL);
+ free(uc);
+ exit(EXIT_FAILURE);
+ }
+ }
/* XXX: move the following into the update_meminfo() functions? */
if (no_buffers) {