aboutsummaryrefslogtreecommitdiff
path: root/sysutils/conky/files/patch-src-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysutils/conky/files/patch-src-common.c')
-rw-r--r--sysutils/conky/files/patch-src-common.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/sysutils/conky/files/patch-src-common.c b/sysutils/conky/files/patch-src-common.c
new file mode 100644
index 000000000000..5b0c5a82ca28
--- /dev/null
+++ b/sysutils/conky/files/patch-src-common.c
@@ -0,0 +1,62 @@
+--- 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) {