Hello community,
here is the log from the commit of package sysvinit for openSUSE:Factory
checked in at Thu Jul 9 13:54:10 CEST 2009.
--------
--- sysvinit/sysvinit.changes 2009-05-28 03:49:05.000000000 +0200
+++ sysvinit/sysvinit.changes 2009-06-30 17:01:25.000000000 +0200
@@ -1,0 +2,11 @@
+Tue Jun 30 16:32:50 CEST 2009 - werner@suse.de
+
+- Add patch from Olaf Kirch to avoid using mutex locking for every
+ character (from Moblin:Factory)
+
+-------------------------------------------------------------------
+Mon Jun 29 13:46:44 CEST 2009 - werner@suse.de
+
+- Start boot scripts with their symlinks name
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
New:
----
showconsole-1.09-blogd-coarse-locking.diff
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ sysvinit.spec ++++++
--- /var/tmp/diff_new_pack.Ac8KDF/_old 2009-07-09 13:53:18.000000000 +0200
+++ /var/tmp/diff_new_pack.Ac8KDF/_new 2009-07-09 13:53:18.000000000 +0200
@@ -30,7 +30,7 @@
PreReq: coreutils
AutoReqProv: on
Version: 2.86
-Release: 210
+Release: 211
Summary: SysV-Style init
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: libselinux-devel libsepol-devel
@@ -65,6 +65,7 @@
Patch19: sysvinit-2.86-fuse-no-kill.patch
Patch20: startpar-preload.diff
Patch21: startpar-bootchart.diff
+Patch22: showconsole-1.09-blogd-coarse-locking.diff
%description
System V style init programs by Miquel van Smoorenburg that control the
@@ -109,6 +110,7 @@
popd
pushd ../showconsole-%{SCVER}
%patch -P 10
+%patch -P 22 -p1
popd
pushd ../startpar-%{START}
%patch -P 14
++++++ showconsole-1.09-blogd-coarse-locking.diff ++++++
From: Olaf Kirch
Subject: Use coarser locking for the log buffer
blogd claims and releases a mutex for every character it
writes into the log buffer. Change parselog to grab the lock
once, and release it when done parsing all of the input.
Signed-off-by: Olaf Kirch
Index: showconsole-1.09/libconsole.c
===================================================================
--- showconsole-1.09/libconsole.c
+++ showconsole-1.09/libconsole.c 2009-01-26 16:58:00.000000000 +0100
@@ -346,9 +346,8 @@ static volatile ssize_t avail;
static inline void resetlog(void) { tail = head = data; avail = 0; }
-static inline void storelog(const unsigned char *const buf, const size_t len)
+static inline void __storelog(const unsigned char *const buf, const size_t len)
{
- lock(&llock);
if (len > end - tail) {
static int be_warned = 0;
if (!be_warned) {
@@ -360,13 +359,18 @@ static inline void storelog(const unsign
memcpy(tail, buf, len);
avail = (tail += len) - head;
xout:
- unlock(&llock);
return;
}
-static inline void addlog(const unsigned char c)
+static void storelog(const unsigned char *const buf, const size_t len)
{
lock(&llock);
+ __storelog(buf, len);
+ unlock(&llock);
+}
+
+static inline void __addlog(const unsigned char c)
+{
if (end - tail <= 0) {
static int be_warned = 0;
if (!be_warned) {
@@ -378,10 +382,16 @@ static inline void addlog(const unsigned
*tail = c;
avail = (tail += 1) - head;
xout:
- unlock(&llock);
return;
}
+static void addlog(const unsigned char c)
+{
+ lock(&llock);
+ __addlog(c);
+ unlock(&llock);
+}
+
static inline void writelog(void)
{
if (!flog)
@@ -492,6 +502,8 @@ static void parselog(unsigned char *buf,
ssize_t r = s, up;
unsigned char uprt[16];
+ lock(&llock);
+
while (r > 0) {
c = (unsigned char)*buf;
@@ -506,25 +518,25 @@ static void parselog(unsigned char *buf,
case 28 ... 31:
nl = 0;
spin = 0;
- addlog('^'); addlog(c + 64);
+ __addlog('^'); __addlog(c + 64);
break;
case '\n':
if (spin > 4) /* last spinner line */
- storelog(prog, strlen((char*)prog));
+ __storelog(prog, strlen((char*)prog));
nl = 1;
line++;
spin = 0;
- addlog(c);
+ __addlog(c);
break;
case '\r':
spin++;
if (spin < 5) {
if (spin > 1)
- addlog('\n');
+ __addlog('\n');
nl = 1;
}
if (spin == 5)
- storelog((unsigned char*)"\n<progress bar skipped>\n", 24);
+ __storelog((unsigned char*)"\n<progress bar skipped>\n", 24);
break;
case 14:
case 15:
@@ -543,8 +555,8 @@ static void parselog(unsigned char *buf,
case 160 ... 255:
if (spin < 5) {
if (spin == 1 && nl)
- addlog('\n');
- addlog(c);
+ __addlog('\n');
+ __addlog(c);
} else { /* Seems to be a lengthy spinner line */
static int old = 0;
static ssize_t p = 0;
@@ -561,14 +573,14 @@ static void parselog(unsigned char *buf,
case 127:
nl = 0;
spin = 0;
- addlog('^'); addlog('?');
+ __addlog('^'); __addlog('?');
break;
case 128 ... 128+26:
case 128+28 ... 159:
nl = 0;
spin = 0;
if ((up = snprintf((char*)uprt, sizeof(uprt), "\\%03o", c)) > 0)
- storelog(uprt, (size_t)up);
+ __storelog(uprt, (size_t)up);
break;
case 128+27:
spin = 0;
@@ -578,7 +590,7 @@ static void parselog(unsigned char *buf,
nl = 0;
spin = 0;
if ((up = snprintf((char*)uprt, sizeof(uprt), "0x%X", c)) > 0)
- storelog(uprt, (size_t)up);
+ __storelog(uprt, (size_t)up);
break;
}
break;
@@ -597,11 +609,11 @@ static void parselog(unsigned char *buf,
case 'E':
case 'D':
if (spin > 4) /* last spinner line */
- storelog(prog, strlen((char*)prog));
+ __storelog(prog, strlen((char*)prog));
nl = 1;
line++;
spin = 0;
- addlog('\n');
+ __addlog('\n');
break;
case '(':
state = ESsetG0;
@@ -674,11 +686,14 @@ static void parselog(unsigned char *buf,
unsigned char echo[64];
ssize_t len;
+ /* Release the lock while doing IO */
+ unlock(&llock);
if ((len = snprintf(echo, sizeof(echo), "\033[%lu;%dR", line, nl)) > 0)
safeout(fdread, echo, len);
else
safeout(fdread, "\033R", 2);
tcdrain(fdread);
+ lock(&llock);
}
break;
#endif
@@ -686,6 +701,8 @@ static void parselog(unsigned char *buf,
buf++;
r--;
}
+
+ unlock(&llock);
}
static void copylog(const unsigned char *buf, const size_t s)
++++++ startpar-0.53.dif ++++++
--- /var/tmp/diff_new_pack.Ac8KDF/_old 2009-07-09 13:53:18.000000000 +0200
+++ /var/tmp/diff_new_pack.Ac8KDF/_new 2009-07-09 13:53:18.000000000 +0200
@@ -22,8 +22,32 @@
makeboot: makeboot.c
--- makeboot.c
-+++ makeboot.c 2009-03-13 13:28:08.824501381 +0100
-@@ -278,8 +278,10 @@ static void filter_files(const char *dir
++++ makeboot.c 2009-06-29 12:51:15.794401972 +0200
+@@ -46,18 +46,19 @@ static struct makenode *lookup_target(co
+ */
+ static struct makenode *add_target(const char *name)
+ {
+- struct makenode *node;
++ struct makenode *__restrict node;
+ struct makenode *prev, *t;
+
+ node = lookup_target(name);
+ if (node)
+ return node;
+- node = xcalloc(1, sizeof(*node));
+- node->name = strdup(name);
+- if (! node->name) {
++ if (posix_memalign((void*)&node, sizeof(void*), alignof(struct makenode)+strsize(name)) < 0) {
+ fprintf(stderr, "Can't malloc: %s\n", strerror(errno));
+ exit(1);
+ }
++ memset(node, 0, alignof(struct makenode)+strsize(name));
++ node->name = ((char*)node)+alignof(struct makenode);
++ strcpy(node->name, name);
+
+ /* append to the list in alphabetical order */
+ prev = NULL;
+@@ -278,15 +279,20 @@ static void filter_files(const char *dir
#endif
ndirs = scandir(path, &dirlist, dirfilter, alphasort);
#if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 600
@@ -35,3 +59,148 @@
#endif
/* mark all matching nodes */
if (ndirs >= 0) {
+ for (i = 0; i < ndirs; i++) {
+ t = lookup_target(dirlist[i]->d_name + 3);
+- if (t)
++ if (t) {
+ t->status = 1;
++ if (asprintf(&t->arg0, "%s/%s", path, dirlist[i]->d_name) < 0)
++ t->arg0 = (char*)0;
++ }
+ free(dirlist[i]);
+ }
+ free(dirlist);
+@@ -524,8 +530,6 @@ int main(int argc, char **argv)
+ goto out;
+ }
+
+- nodevec = xcalloc(1, sizeof(*nodevec));
+-
+ snprintf(makefile, sizeof(makefile), "depend.%s", argv[1]);
+ parse_makefile(makefile);
+
+@@ -534,7 +538,7 @@ int main(int argc, char **argv)
+ check_run_files(argv[1], argv[2], argv[3]);
+ out:
+ while ((nodevec = pickup_task())) {
+- fprintf(stdout, "%s\n", nodevec->name);
++ fprintf(stdout, "%s (%s)\n", nodevec->name, nodevec->arg0);
+ finish_task(nodevec);
+ }
+
+--- makeboot.h
++++ makeboot.h 2009-06-29 12:41:15.473901451 +0200
+@@ -8,6 +8,7 @@ enum {
+ /* target nodes */
+ struct makenode {
+ char *name;
++ char *arg0;
+ int num_deps;
+ struct makelist *depend;
+ int num_sels;
+@@ -33,3 +34,6 @@ extern struct makenode *pickup_task(void
+ extern void finish_task(struct makenode *n);
+ extern void *xcalloc(size_t nmemb, size_t size);
+ extern void print_run_result(int *resvec, struct makenode **nodevec, const char *action);
++
++#define alignof(type) ((sizeof(type)+(sizeof(void*)-1)) & ~(sizeof(void*)-1))
++#define strsize(string) ((strlen(string)+1)*sizeof(char))
+--- startpar.c
++++ startpar.c 2009-06-29 12:24:47.632457764 +0200
+@@ -66,7 +66,8 @@ static struct makenode **nodevec;
+
+ #define PBUF_SIZE 8192
+ struct prg {
+- char *name;
++ const char *name;
++ const char *arg0;
+ int num;
+ int fd;
+ pid_t pid;
+@@ -150,9 +151,9 @@ void closeall(void)
+ close(pidpipe[1]);
+ }
+
+-void callsplash(int n, char *path, char *action)
++void callsplash(int n, const char *path, char *action)
+ {
+- char *p;
++ const char *p;
+ char sbuf[32];
+ char tbuf[256];
+ pid_t pid;
+@@ -345,17 +346,17 @@ void run(struct prg *p)
+ {
+ char path[128];
+ snprintf(path, sizeof(path), "/etc/init.d/%s", p->name);
+- execlp(path, path, arg, (char *)0);
++ execlp(path, p->arg0, arg, (char *)0);
+ }
+ else if (arg)
+- execlp(p->name, p->name, arg, (char *)0);
++ execlp(p->name, p->arg0, arg, (char *)0);
+ else
+- execlp(p->name, p->name, (char *)0);
++ execlp(p->name, p->arg0, (char *)0);
+ perror(p->name);
+ _exit(1);
+ }
+
+-int run_single(char *prg, int spl)
++int run_single(const char *prg, const char *arg0, int spl)
+ {
+ pid_t pid;
+ int r;
+@@ -382,12 +383,12 @@ int run_single(char *prg, int spl)
+ {
+ char path[128];
+ snprintf(path, sizeof(path), "/etc/init.d/%s", prg);
+- execlp(path, path, arg, (char *)0);
++ execlp(path, arg0 ? arg0 : path, arg, (char *)0);
+ }
+ else if (arg)
+- execlp(prg, prg, arg, (char *)0);
++ execlp(prg, arg0 ? arg0 : prg, arg, (char *)0);
+ else
+- execlp(prg, prg, (char *)0);
++ execlp(prg, arg0 ? arg0 : prg, (char *)0);
+ perror(prg);
+ _exit(1);
+ }
+@@ -710,11 +711,11 @@ int main(int argc, char **argv)
+ {
+ if ((*nodevec = pickup_task()))
+ {
+- *resvec = run_single((*nodevec)->name, calcsplash(0, 1, splashopt));
++ *resvec = run_single((*nodevec)->name, (*nodevec)->arg0, calcsplash(0, 1, splashopt));
+ finish_task(*nodevec);
+ }
+ } else
+- *resvec = run_single(*argv, calcsplash(0, 1, splashopt));
++ *resvec = run_single(*argv, *argv, calcsplash(0, 1, splashopt));
+ goto finished;
+ }
+
+@@ -818,9 +819,12 @@ int main(int argc, char **argv)
+ if (nodevec[num]->interactive)
+ interactive_task = p;
+ p->name = nodevec[num]->name;
++ p->arg0 = nodevec[num]->arg0 ? nodevec[num]->arg0 : nodevec[num]->name;
+ }
+- else
++ else {
+ p->name = *argv++;
++ p->arg0 = p->name;
++ }
+ p->splashadd = calcsplash(num, argc, splashopt);
+ p->num = num++;
+ if (interactive_task)
+@@ -855,7 +859,7 @@ int main(int argc, char **argv)
+ if (active == 0)
+ {
+ p = interactive_task;
+- resvec[p->num] = run_single(p->name, p->splashadd);
++ resvec[p->num] = run_single(p->name, p->arg0, p->splashadd);
+ if (run_mode)
+ finish_task(nodevec[p->num]);
+ p->pid = 0;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org