From 6f2558b8c4f4e33630b40dfbe20024f7a372a8f0 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Thu, 2 May 2013 13:42:17 -0400 Subject: Modified sched.py field padding calculations to account for bitfields. --- parse/sched.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'parse') diff --git a/parse/sched.py b/parse/sched.py index 4933037..a25ec15 100644 --- a/parse/sched.py +++ b/parse/sched.py @@ -65,15 +65,38 @@ record_map = {} RECORD_SIZE = 24 NSEC_PER_MSEC = 1000000 +def bits_to_bytes(bits): + '''Includes padding''' + return bits / 8 + (1 if bits%8 else 0) + +def field_bytes(fields): + fbytes = 0 + fbits = 0 + for f in fields: + flist = list(f) + + if len(flist) > 2: + # Specified a bitfield + fbits += flist[2] + else: + # Only specified a type, use types size + fbytes += sizeof(list(f)[1]) + + # Bitfields followed by a byte will cause any incomplete + # bytes to be turned into full bytes + fbytes += bits_to_bytes(fbits) + fbits = 0 + + fbytes += bits_to_bytes(fbits) + return fbytes + fbits + def register_record(id, clazz): fields = clazz.FIELDS - - fsize = lambda fields : sum([sizeof(list(f)[1]) for f in fields]) - diff = RECORD_SIZE - fsize(SchedRecord.FIELDS) - fsize(fields) + diff = RECORD_SIZE - field_bytes(SchedRecord.FIELDS) - field_bytes(fields) # Create extra padding fields to make record the proper size # Creating one big field of c_uint64 and giving it a size of 8*diff - # _shoud_ work, but doesn't. This is an uglier way of accomplishing + # _should_ work, but doesn't. This is an uglier way of accomplishing # the same goal for d in range(diff): fields += [("extra%d" % d, c_char)] -- cgit v1.2.2