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 @@
#include "miniobj.h"
#include "vas.h"
#include "vend.h"
#include "vgz.h"
#include "vmb.h"
#include "vsmw.h"
#include "vqueue.h"
......@@ -68,11 +67,10 @@ vsc_callback_f *vsc_lock;
vsc_callback_f *vsc_unlock;
void *
VRT_VSC_Alloc(const char *nm, size_t sd, size_t sj, const unsigned char *zj,
size_t szj, const char *fmt, va_list va)
VRT_VSC_Alloc(const char *nm, size_t sd, const unsigned char *jp,
size_t sj, const char *fmt, va_list va)
{
char *p;
z_stream vz;
struct vsc_segs *vsg;
char buf[1024];
......@@ -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);
AN(p);
memset(&vz, 0, sizeof vz);
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));
memcpy(p + 8 + sd, jp, sj);
ALLOC_OBJ(vsg, VSC_SEGS_MAGIC);
AN(vsg);
vsg->seg = p;
......
......@@ -443,7 +443,7 @@ VCL_STRING VRT_STRANDS_string(VCL_STRANDS);
VCL_STRING VRT_TIME_string(VRT_CTX, VCL_TIME);
#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);
void VRT_VSC_Destroy(const char *, const void *);
#endif
......@@ -36,11 +36,6 @@ from __future__ import print_function
import getopt
import json
import sys
import gzip
try:
import StringIO
except ImportError:
import io
import collections
import struct
......@@ -66,22 +61,12 @@ else:
def b(x):
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):
fo.write('/*\n')
fo.write(' * NB: This file is machine generated, DO NOT EDIT!\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')
......@@ -125,16 +110,13 @@ class vscset(object):
ed["name"] = i.arg
ed["docs"] = "\n".join(i.getdoc())
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(" vsc_%s_zjson[%d] = {\n" % (self.name, len(z)))
bz = bytearray(z)
fo.write(" vsc_%s_json[%d] = {\n" % (self.name, len(s)))
bz = bytearray(s)
t = "\t"
for i in bz:
t += "%d," % i
if len(t) >= 70:
if len(t) >= 69:
fo.write(t + "\n")
t = "\t"
if len(t) > 1:
......@@ -142,7 +124,12 @@ class vscset(object):
fo.write("\n};\n")
s = json.dumps(dd, indent=2, separators=(',', ': '))
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")
......@@ -183,11 +170,16 @@ class vscset(object):
(self.name, self.name.upper()))
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:
fo.write("_Static_assert(offsetof(" + self.struct)
fo.write(", " + i.arg + ")")
fo.write(" == %d,\n" % (i.param["index"] - 8))
fo.write(' "VSC element offset is wrong");\n')
fo.write("PARANOIA(" + i.arg)
fo.write(", %d);\n" % (i.param["index"] - 8))
fo.write("#undef PARANOIA\n")
self.emit_json(fo)
......@@ -203,10 +195,8 @@ class vscset(object):
fo.write("\tretval = VRT_VSC_Alloc")
fo.write("(vsc_" + self.name + "_name, ")
fo.write("sizeof(" + self.struct + "),\n\t ")
fo.write("vsc_" + self.name + "_jsonlen, ")
fo.write("vsc_" + self.name + "_zjson, ")
fo.write("sizeof vsc_" + self.name + "_zjson,\n")
fo.write("\t fmt, ap);\n")
fo.write("vsc_" + self.name + "_json, ")
fo.write("sizeof vsc_" + self.name + "_json, fmt, ap);\n")
fo.write("\tva_end(ap);\n")
fo.write("\treturn(retval);\n")
fo.write("}\n")
......@@ -235,8 +225,12 @@ class vscset(object):
fo.write("\tAN(dst);\n")
fo.write("\tAN(src);\n")
for i in self.mbrs:
fo.write("\tdst->" + i.arg)
fo.write(" += src->" + i.arg + ";\n")
s1 = "\tdst->" + i.arg + " +="
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")
#######################################################################
......
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