Commit a417bf6f authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Trade space for time in setting up VSC segments.

Originally it was the plan that the JSON would be gzip'ed in the
VSM, but to avoid exposing VGZ in the API we didn't, but kept the
gzip'ed JSON in the generated VSC code because why not?

Well now we know why not:  It wastes a lot of time for very little space,
in particular if you have many backends.

Provides some relief for: #2513 & #2518
parent 2936d0f0
...@@ -41,7 +41,6 @@ ...@@ -41,7 +41,6 @@
#include "miniobj.h" #include "miniobj.h"
#include "vas.h" #include "vas.h"
#include "vend.h" #include "vend.h"
#include "vgz.h"
#include "vmb.h" #include "vmb.h"
#include "vsmw.h" #include "vsmw.h"
#include "vqueue.h" #include "vqueue.h"
...@@ -68,11 +67,10 @@ vsc_callback_f *vsc_lock; ...@@ -68,11 +67,10 @@ vsc_callback_f *vsc_lock;
vsc_callback_f *vsc_unlock; vsc_callback_f *vsc_unlock;
void * void *
VRT_VSC_Alloc(const char *nm, size_t sd, size_t sj, const unsigned char *zj, VRT_VSC_Alloc(const char *nm, size_t sd, const unsigned char *jp,
size_t szj, const char *fmt, va_list va) size_t sj, const char *fmt, va_list va)
{ {
char *p; char *p;
z_stream vz;
struct vsc_segs *vsg; struct vsc_segs *vsg;
char buf[1024]; char buf[1024];
...@@ -88,14 +86,7 @@ VRT_VSC_Alloc(const char *nm, size_t sd, size_t sj, const unsigned char *zj, ...@@ -88,14 +86,7 @@ VRT_VSC_Alloc(const char *nm, size_t sd, size_t sj, const unsigned char *zj,
p = VSMW_Allocv(heritage.proc_vsmw, VSC_CLASS, 8 + sd + sj, buf, va); p = VSMW_Allocv(heritage.proc_vsmw, VSC_CLASS, 8 + sd + sj, buf, va);
AN(p); AN(p);
memset(&vz, 0, sizeof vz); memcpy(p + 8 + sd, jp, sj);
assert(Z_OK == inflateInit2(&vz, 31));
vz.next_in = TRUST_ME(zj);
vz.avail_in = szj;
vz.next_out = (void*)(p + 8 + sd);
vz.avail_out = sj;
assert(Z_STREAM_END == inflate(&vz, Z_FINISH));
assert(Z_OK == inflateEnd(&vz));
ALLOC_OBJ(vsg, VSC_SEGS_MAGIC); ALLOC_OBJ(vsg, VSC_SEGS_MAGIC);
AN(vsg); AN(vsg);
vsg->seg = p; vsg->seg = p;
......
...@@ -443,7 +443,7 @@ VCL_STRING VRT_STRANDS_string(VCL_STRANDS); ...@@ -443,7 +443,7 @@ VCL_STRING VRT_STRANDS_string(VCL_STRANDS);
VCL_STRING VRT_TIME_string(VRT_CTX, VCL_TIME); VCL_STRING VRT_TIME_string(VRT_CTX, VCL_TIME);
#ifdef va_start // XXX: hackish #ifdef va_start // XXX: hackish
void *VRT_VSC_Alloc(const char *, size_t, size_t, const unsigned char *, size_t, void *VRT_VSC_Alloc(const char *, size_t, const unsigned char *, size_t,
const char *, va_list); const char *, va_list);
void VRT_VSC_Destroy(const char *, const void *); void VRT_VSC_Destroy(const char *, const void *);
#endif #endif
...@@ -36,11 +36,6 @@ from __future__ import print_function ...@@ -36,11 +36,6 @@ from __future__ import print_function
import getopt import getopt
import json import json
import sys import sys
import gzip
try:
import StringIO
except ImportError:
import io
import collections import collections
import struct import struct
...@@ -66,22 +61,12 @@ else: ...@@ -66,22 +61,12 @@ else:
def b(x): def b(x):
return codecs.latin_1_encode(x)[0] return codecs.latin_1_encode(x)[0]
def gzip_str(s):
try:
out = StringIO.StringIO()
except NameError:
out = io.BytesIO()
gzip.GzipFile(fileobj=out, mode="w").write(b(s))
out.seek(4)
out.write(struct.pack("<L", 0x12bfd58))
return out.getvalue()
def genhdr(fo, name): def genhdr(fo, name):
fo.write('/*\n') fo.write('/*\n')
fo.write(' * NB: This file is machine generated, DO NOT EDIT!\n') fo.write(' * NB: This file is machine generated, DO NOT EDIT!\n')
fo.write(' *\n') fo.write(' *\n')
fo.write(' * Edit %s.vsc run lib/libvcc/vsctool.py instead.\n' % name) fo.write(' * Edit ' + name +
'.vsc and run lib/libvcc/vsctool.py instead.\n')
fo.write(' */\n') fo.write(' */\n')
fo.write('\n') fo.write('\n')
...@@ -125,16 +110,13 @@ class vscset(object): ...@@ -125,16 +110,13 @@ class vscset(object):
ed["name"] = i.arg ed["name"] = i.arg
ed["docs"] = "\n".join(i.getdoc()) ed["docs"] = "\n".join(i.getdoc())
s=json.dumps(dd, separators=(",",":")) + "\0" s=json.dumps(dd, separators=(",",":")) + "\0"
fo.write("\nstatic const size_t vsc_%s_jsonlen = %dL;\n" %
(self.name, len(s)))
z = gzip_str(s)
fo.write("\nstatic const unsigned char"); fo.write("\nstatic const unsigned char");
fo.write(" vsc_%s_zjson[%d] = {\n" % (self.name, len(z))) fo.write(" vsc_%s_json[%d] = {\n" % (self.name, len(s)))
bz = bytearray(z) bz = bytearray(s)
t = "\t" t = "\t"
for i in bz: for i in bz:
t += "%d," % i t += "%d," % i
if len(t) >= 70: if len(t) >= 69:
fo.write(t + "\n") fo.write(t + "\n")
t = "\t" t = "\t"
if len(t) > 1: if len(t) > 1:
...@@ -142,7 +124,12 @@ class vscset(object): ...@@ -142,7 +124,12 @@ class vscset(object):
fo.write("\n};\n") fo.write("\n};\n")
s = json.dumps(dd, indent=2, separators=(',', ': ')) s = json.dumps(dd, indent=2, separators=(',', ': '))
fo.write("\n// ") fo.write("\n// ")
fo.write("\n// ".join(s.split("\n"))) for i in s.split("\n"):
j = "// " + i
if len(j) > 72:
fo.write(j[:72] + "[...]\n")
else:
fo.write(j + "\n")
fo.write("\n") fo.write("\n")
...@@ -183,11 +170,16 @@ class vscset(object): ...@@ -183,11 +170,16 @@ class vscset(object):
(self.name, self.name.upper())) (self.name, self.name.upper()))
fo.write("\n") fo.write("\n")
fo.write("#define PARANOIA(a,n)\t\t\t\t\\\n")
fo.write(" _Static_assert(\t\t\t\t\\\n")
fo.write("\toffsetof(" + self.struct + ", a) == n,\t\\\n")
fo.write("\t\"VSC element '\" #a \"' at wrong offset\")\n\n")
for i in self.mbrs: for i in self.mbrs:
fo.write("_Static_assert(offsetof(" + self.struct) fo.write("PARANOIA(" + i.arg)
fo.write(", " + i.arg + ")") fo.write(", %d);\n" % (i.param["index"] - 8))
fo.write(" == %d,\n" % (i.param["index"] - 8))
fo.write(' "VSC element offset is wrong");\n') fo.write("#undef PARANOIA\n")
self.emit_json(fo) self.emit_json(fo)
...@@ -203,10 +195,8 @@ class vscset(object): ...@@ -203,10 +195,8 @@ class vscset(object):
fo.write("\tretval = VRT_VSC_Alloc") fo.write("\tretval = VRT_VSC_Alloc")
fo.write("(vsc_" + self.name + "_name, ") fo.write("(vsc_" + self.name + "_name, ")
fo.write("sizeof(" + self.struct + "),\n\t ") fo.write("sizeof(" + self.struct + "),\n\t ")
fo.write("vsc_" + self.name + "_jsonlen, ") fo.write("vsc_" + self.name + "_json, ")
fo.write("vsc_" + self.name + "_zjson, ") fo.write("sizeof vsc_" + self.name + "_json, fmt, ap);\n")
fo.write("sizeof vsc_" + self.name + "_zjson,\n")
fo.write("\t fmt, ap);\n")
fo.write("\tva_end(ap);\n") fo.write("\tva_end(ap);\n")
fo.write("\treturn(retval);\n") fo.write("\treturn(retval);\n")
fo.write("}\n") fo.write("}\n")
...@@ -235,8 +225,12 @@ class vscset(object): ...@@ -235,8 +225,12 @@ class vscset(object):
fo.write("\tAN(dst);\n") fo.write("\tAN(dst);\n")
fo.write("\tAN(src);\n") fo.write("\tAN(src);\n")
for i in self.mbrs: for i in self.mbrs:
fo.write("\tdst->" + i.arg) s1 = "\tdst->" + i.arg + " +="
fo.write(" += src->" + i.arg + ";\n") s2 = "src->" + i.arg + ";"
if len((s1 + " " + s2).expandtabs()) < 79:
fo.write(s1 + " " + s2 + "\n")
else:
fo.write(s1 + "\n\t " + s2 + "\n")
fo.write("}\n") fo.write("}\n")
####################################################################### #######################################################################
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment