mirror of
https://github.com/libevent/libevent.git
synced 2025-01-31 09:12:55 +08:00
from trunk: pull setters/getters out of RPC structures to reduce their memory footprint
svn:r589
This commit is contained in:
parent
9a70838936
commit
6d5b846cb2
@ -12,6 +12,8 @@ Changes in current version:
|
|||||||
o set the correct event base for HTTP close events
|
o set the correct event base for HTTP close events
|
||||||
o New function, event_{base_}loopbreak. Like event_loopexit, it makes an event loop stop executing and return. Unlike event_loopexit, it keeps subsequent pending events from getting executed. Patch from Scott Lamb
|
o New function, event_{base_}loopbreak. Like event_loopexit, it makes an event loop stop executing and return. Unlike event_loopexit, it keeps subsequent pending events from getting executed. Patch from Scott Lamb
|
||||||
o Removed obsoleted recalc code
|
o Removed obsoleted recalc code
|
||||||
|
o pull setters/getters out of RPC structures into a base class to which we just need to store a pointer; this reduces the memory footprint of these structures.
|
||||||
|
o fix a bug with event_rpcgen for integers
|
||||||
|
|
||||||
|
|
||||||
Changes in 1.4.0-beta:
|
Changes in 1.4.0-beta:
|
||||||
|
@ -69,17 +69,22 @@ class Struct:
|
|||||||
|
|
||||||
def PrintDeclaration(self, file):
|
def PrintDeclaration(self, file):
|
||||||
print >>file, '/* Structure declaration for %s */' % self._name
|
print >>file, '/* Structure declaration for %s */' % self._name
|
||||||
print >>file, 'struct %s {' % self._name
|
print >>file, 'struct %s_access_ {' % self._name
|
||||||
for entry in self._entries:
|
for entry in self._entries:
|
||||||
dcl = entry.Declaration()
|
dcl = entry.AssignDeclaration('(*%s_assign)' % entry.Name())
|
||||||
dcl.extend(
|
|
||||||
entry.AssignDeclaration('(*%s_assign)' % entry.Name()))
|
|
||||||
dcl.extend(
|
dcl.extend(
|
||||||
entry.GetDeclaration('(*%s_get)' % entry.Name()))
|
entry.GetDeclaration('(*%s_get)' % entry.Name()))
|
||||||
if entry.Array():
|
if entry.Array():
|
||||||
dcl.extend(
|
dcl.extend(
|
||||||
entry.AddDeclaration('(*%s_add)' % entry.Name()))
|
entry.AddDeclaration('(*%s_add)' % entry.Name()))
|
||||||
self.PrintIdented(file, ' ', dcl)
|
self.PrintIdented(file, ' ', dcl)
|
||||||
|
print >>file, '};\n'
|
||||||
|
|
||||||
|
print >>file, 'struct %s {' % self._name
|
||||||
|
print >>file, ' struct %s_access_ *base;\n' % self._name
|
||||||
|
for entry in self._entries:
|
||||||
|
dcl = entry.Declaration()
|
||||||
|
self.PrintIdented(file, ' ', dcl)
|
||||||
print >>file, ''
|
print >>file, ''
|
||||||
for entry in self._entries:
|
for entry in self._entries:
|
||||||
print >>file, ' uint8_t %s_set;' % entry.Name()
|
print >>file, ' uint8_t %s_set;' % entry.Name()
|
||||||
@ -115,6 +120,13 @@ int evtag_unmarshal_%(name)s(struct evbuffer *, uint8_t,
|
|||||||
' * Implementation of %s\n'
|
' * Implementation of %s\n'
|
||||||
' */\n') % self._name
|
' */\n') % self._name
|
||||||
|
|
||||||
|
print >>file, \
|
||||||
|
'static struct %(name)s_access_ __%(name)s_base = {' % \
|
||||||
|
{ 'name' : self._name }
|
||||||
|
for entry in self._entries:
|
||||||
|
self.PrintIdented(file, ' ', entry.CodeBase())
|
||||||
|
print >>file, '};\n'
|
||||||
|
|
||||||
# Creation
|
# Creation
|
||||||
print >>file, (
|
print >>file, (
|
||||||
'struct %(name)s *\n'
|
'struct %(name)s *\n'
|
||||||
@ -124,7 +136,8 @@ int evtag_unmarshal_%(name)s(struct evbuffer *, uint8_t,
|
|||||||
' if ((tmp = malloc(sizeof(struct %(name)s))) == NULL) {\n'
|
' if ((tmp = malloc(sizeof(struct %(name)s))) == NULL) {\n'
|
||||||
' event_warn("%%s: malloc", __func__);\n'
|
' event_warn("%%s: malloc", __func__);\n'
|
||||||
' return (NULL);\n'
|
' return (NULL);\n'
|
||||||
' }') % { 'name' : self._name }
|
' }\n'
|
||||||
|
' tmp->base = &__%(name)s_base;\n') % { 'name' : self._name }
|
||||||
|
|
||||||
for entry in self._entries:
|
for entry in self._entries:
|
||||||
self.PrintIdented(file, ' ', entry.CodeNew('tmp'))
|
self.PrintIdented(file, ' ', entry.CodeNew('tmp'))
|
||||||
@ -398,19 +411,16 @@ class Entry:
|
|||||||
def CodeFree(self, name):
|
def CodeFree(self, name):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def CodeNew(self, name):
|
def CodeBase(self):
|
||||||
code = [
|
code = [
|
||||||
'%(vname)s->%(name)s_assign = %(parent_name)s_%(name)s_assign;',
|
'%(parent_name)s_%(name)s_assign,',
|
||||||
'%(vname)s->%(name)s_get = %(parent_name)s_%(name)s_get;'
|
'%(parent_name)s_%(name)s_get,'
|
||||||
]
|
]
|
||||||
if self.Array():
|
if self.Array():
|
||||||
code.append(
|
code.append('%(parent_name)s_%(name)s_add,')
|
||||||
'%(vname)s->%(name)s_add = %(parent_name)s_%(name)s_add;')
|
|
||||||
|
|
||||||
code = '\n'.join(code)
|
code = '\n'.join(code)
|
||||||
trans = self.GetTranslation()
|
code = code % self.GetTranslation()
|
||||||
trans['vname'] = name
|
|
||||||
code = code % trans
|
|
||||||
return code.split('\n')
|
return code.split('\n')
|
||||||
|
|
||||||
def Verify(self):
|
def Verify(self):
|
||||||
@ -545,6 +555,10 @@ class EntryInt(Entry):
|
|||||||
|
|
||||||
return dcl
|
return dcl
|
||||||
|
|
||||||
|
def CodeNew(self, name):
|
||||||
|
code = ['%s->%s_data = 0;' % (name, self._name)]
|
||||||
|
return code
|
||||||
|
|
||||||
class EntryString(Entry):
|
class EntryString(Entry):
|
||||||
def __init__(self, type, name, tag):
|
def __init__(self, type, name, tag):
|
||||||
# Init base class
|
# Init base class
|
||||||
@ -595,7 +609,6 @@ class EntryString(Entry):
|
|||||||
|
|
||||||
def CodeNew(self, name):
|
def CodeNew(self, name):
|
||||||
code = ['%s->%s_data = NULL;' % (name, self._name)]
|
code = ['%s->%s_data = NULL;' % (name, self._name)]
|
||||||
code.extend(Entry.CodeNew(self, name))
|
|
||||||
return code
|
return code
|
||||||
|
|
||||||
def CodeFree(self, name):
|
def CodeFree(self, name):
|
||||||
@ -721,7 +734,6 @@ class EntryStruct(Entry):
|
|||||||
|
|
||||||
def CodeNew(self, name):
|
def CodeNew(self, name):
|
||||||
code = ['%s->%s_data = NULL;' % (name, self._name)]
|
code = ['%s->%s_data = NULL;' % (name, self._name)]
|
||||||
code.extend(Entry.CodeNew(self, name))
|
|
||||||
return code
|
return code
|
||||||
|
|
||||||
def CodeFree(self, name):
|
def CodeFree(self, name):
|
||||||
@ -828,7 +840,6 @@ class EntryVarBytes(Entry):
|
|||||||
def CodeNew(self, name):
|
def CodeNew(self, name):
|
||||||
code = ['%s->%s_data = NULL;' % (name, self._name),
|
code = ['%s->%s_data = NULL;' % (name, self._name),
|
||||||
'%s->%s_length = 0;' % (name, self._name) ]
|
'%s->%s_length = 0;' % (name, self._name) ]
|
||||||
code.extend(Entry.CodeNew(self, name))
|
|
||||||
return code
|
return code
|
||||||
|
|
||||||
def CodeFree(self, name):
|
def CodeFree(self, name):
|
||||||
@ -1011,7 +1022,6 @@ if (evtag_unmarshal_%(refname)s(%(buf)s, %(tag_name)s,
|
|||||||
code = ['%s->%s_data = NULL;' % (name, self._name),
|
code = ['%s->%s_data = NULL;' % (name, self._name),
|
||||||
'%s->%s_length = 0;' % (name, self._name),
|
'%s->%s_length = 0;' % (name, self._name),
|
||||||
'%s->%s_num_allocated = 0;' % (name, self._name)]
|
'%s->%s_num_allocated = 0;' % (name, self._name)]
|
||||||
code.extend(Entry.CodeNew(self, name))
|
|
||||||
return code
|
return code
|
||||||
|
|
||||||
def CodeFree(self, name):
|
def CodeFree(self, name):
|
||||||
@ -1306,10 +1316,10 @@ def HeaderPreamble(name):
|
|||||||
pre += (
|
pre += (
|
||||||
'#define EVTAG_HAS(msg, member) ((msg)->member##_set == 1)\n'
|
'#define EVTAG_HAS(msg, member) ((msg)->member##_set == 1)\n'
|
||||||
'#define EVTAG_ASSIGN(msg, member, args...) '
|
'#define EVTAG_ASSIGN(msg, member, args...) '
|
||||||
'(*(msg)->member##_assign)(msg, ## args)\n'
|
'(*(msg)->base->member##_assign)(msg, ## args)\n'
|
||||||
'#define EVTAG_GET(msg, member, args...) '
|
'#define EVTAG_GET(msg, member, args...) '
|
||||||
'(*(msg)->member##_get)(msg, ## args)\n'
|
'(*(msg)->base->member##_get)(msg, ## args)\n'
|
||||||
'#define EVTAG_ADD(msg, member) (*(msg)->member##_add)(msg)\n'
|
'#define EVTAG_ADD(msg, member) (*(msg)->base->member##_add)(msg)\n'
|
||||||
'#define EVTAG_LEN(msg, member) ((msg)->member##_length)\n'
|
'#define EVTAG_LEN(msg, member) ((msg)->member##_length)\n'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ struct msg {
|
|||||||
struct kill {
|
struct kill {
|
||||||
string weapon = 1;
|
string weapon = 1;
|
||||||
string action = 2;
|
string action = 2;
|
||||||
|
int how_often = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct run {
|
struct run {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user