1111 lines · 38.8 KB · Python
RawDownload
		'CASE WHEN id=0 THEN \'unknown\' WHEN pid=-1 THEN \'host\' ELSE \'guest\' END AS host_or_guest'	' FROM machines') do_query(query, 'CREATE VIEW dsos_view AS '	'SELECT '		'id,'		'machine_id,'		'(SELECT host_or_guest FROM machines_view WHERE id = machine_id) AS host_or_guest,'		'short_name,'		'long_name,'		'build_id'	' FROM dsos') do_query(query, 'CREATE VIEW symbols_view AS '	'SELECT '		'id,'		'name,'		'(SELECT short_name FROM dsos WHERE id=dso_id) AS dso,'		'dso_id,'		'sym_start,'		'sym_end,'		'CASE WHEN binding=0 THEN \'local\' WHEN binding=1 THEN \'global\' ELSE \'weak\' END AS binding'	' FROM symbols') do_query(query, 'CREATE VIEW threads_view AS '	'SELECT '		'id,'		'machine_id,'		'(SELECT host_or_guest FROM machines_view WHERE id = machine_id) AS host_or_guest,'		'process_id,'		'pid,'		'tid'	' FROM threads') do_query(query, 'CREATE VIEW comm_threads_view AS '	'SELECT '		'comm_id,'		'(SELECT comm FROM comms WHERE id = comm_id) AS command,'		'thread_id,'		'(SELECT pid FROM threads WHERE id = thread_id) AS pid,'		'(SELECT tid FROM threads WHERE id = thread_id) AS tid'	' FROM comm_threads') if perf_db_export_calls or perf_db_export_callchains:	do_query(query, 'CREATE VIEW call_paths_view AS '		'SELECT '			'c.id,'			'to_hex(c.ip) AS ip,'			'c.symbol_id,'			'(SELECT name FROM symbols WHERE id = c.symbol_id) AS symbol,'			'(SELECT dso_id FROM symbols WHERE id = c.symbol_id) AS dso_id,'			'(SELECT dso FROM symbols_view  WHERE id = c.symbol_id) AS dso_short_name,'			'c.parent_id,'			'to_hex(p.ip) AS parent_ip,'			'p.symbol_id AS parent_symbol_id,'			'(SELECT name FROM symbols WHERE id = p.symbol_id) AS parent_symbol,'			'(SELECT dso_id FROM symbols WHERE id = p.symbol_id) AS parent_dso_id,'			'(SELECT dso FROM symbols_view  WHERE id = p.symbol_id) AS parent_dso_short_name'		' FROM call_paths c INNER JOIN call_paths p ON p.id = c.parent_id')if perf_db_export_calls:	do_query(query, 'CREATE VIEW calls_view AS '		'SELECT '			'calls.id,'			'thread_id,'			'(SELECT pid FROM threads WHERE id = thread_id) AS pid,'			'(SELECT tid FROM threads WHERE id = thread_id) AS tid,'			'(SELECT comm FROM comms WHERE id = comm_id) AS command,'			'call_path_id,'			'to_hex(ip) AS ip,'			'symbol_id,'			'(SELECT name FROM symbols WHERE id = symbol_id) AS symbol,'			'call_time,'			'return_time,'			'return_time - call_time AS elapsed_time,'			'branch_count,'			'insn_count,'			'cyc_count,'			'CASE WHEN cyc_count=0 THEN CAST(0 AS NUMERIC(20, 2)) ELSE CAST((CAST(insn_count AS FLOAT) / cyc_count) AS NUMERIC(20, 2)) END AS IPC,'			'call_id,'			'return_id,'			'CASE WHEN flags=0 THEN \'\' WHEN flags=1 THEN \'no call\' WHEN flags=2 THEN \'no return\' WHEN flags=3 THEN \'no call/return\' WHEN flags=6 THEN \'jump\' ELSE CAST ( flags AS VARCHAR(6) ) END AS flags,'			'parent_call_path_id,'			'calls.parent_id'		' FROM calls INNER JOIN call_paths ON call_paths.id = call_path_id') do_query(query, 'CREATE VIEW samples_view AS '	'SELECT '		'id,'		'time,'		'cpu,'		'(SELECT pid FROM threads WHERE id = thread_id) AS pid,'		'(SELECT tid FROM threads WHERE id = thread_id) AS tid,'		'(SELECT comm FROM comms WHERE id = comm_id) AS command,'		'(SELECT name FROM selected_events WHERE id = evsel_id) AS event,'		'to_hex(ip) AS ip_hex,'		'(SELECT name FROM symbols WHERE id = symbol_id) AS symbol,'		'sym_offset,'		'(SELECT short_name FROM dsos WHERE id = dso_id) AS dso_short_name,'		'to_hex(to_ip) AS to_ip_hex,'		'(SELECT name FROM symbols WHERE id = to_symbol_id) AS to_symbol,'		'to_sym_offset,'		'(SELECT short_name FROM dsos WHERE id = to_dso_id) AS to_dso_short_name,'		'(SELECT name FROM branch_types WHERE id = branch_type) AS branch_type_name,'		'in_tx,'		'insn_count,'		'cyc_count,'		'CASE WHEN cyc_count=0 THEN CAST(0 AS NUMERIC(20, 2)) ELSE CAST((CAST(insn_count AS FLOAT) / cyc_count) AS NUMERIC(20, 2)) END AS IPC'	' FROM samples') do_query(query, 'CREATE VIEW ptwrite_view AS '	'SELECT '		'ptwrite.id,'		'time,'		'cpu,'		'to_hex(payload) AS payload_hex,'		'CASE WHEN exact_ip=FALSE THEN \'False\' ELSE \'True\' END AS exact_ip'	' FROM ptwrite'	' INNER JOIN samples ON samples.id = ptwrite.id') do_query(query, 'CREATE VIEW cbr_view AS '	'SELECT '		'cbr.id,'		'time,'		'cpu,'		'cbr,'		'mhz,'		'percent'	' FROM cbr'	' INNER JOIN samples ON samples.id = cbr.id') do_query(query, 'CREATE VIEW mwait_view AS '	'SELECT '		'mwait.id,'		'time,'		'cpu,'		'to_hex(hints) AS hints_hex,'		'to_hex(extensions) AS extensions_hex'	' FROM mwait'	' INNER JOIN samples ON samples.id = mwait.id') do_query(query, 'CREATE VIEW pwre_view AS '	'SELECT '		'pwre.id,'		'time,'		'cpu,'		'cstate,'		'subcstate,'		'CASE WHEN hw=FALSE THEN \'False\' ELSE \'True\' END AS hw'	' FROM pwre'	' INNER JOIN samples ON samples.id = pwre.id') do_query(query, 'CREATE VIEW exstop_view AS '	'SELECT '		'exstop.id,'		'time,'		'cpu,'		'CASE WHEN exact_ip=FALSE THEN \'False\' ELSE \'True\' END AS exact_ip'	' FROM exstop'	' INNER JOIN samples ON samples.id = exstop.id') do_query(query, 'CREATE VIEW pwrx_view AS '	'SELECT '		'pwrx.id,'		'time,'		'cpu,'		'deepest_cstate,'		'last_cstate,'		'CASE     WHEN wake_reason=1 THEN \'Interrupt\''			' WHEN wake_reason=2 THEN \'Timer Deadline\''			' WHEN wake_reason=4 THEN \'Monitored Address\''			' WHEN wake_reason=8 THEN \'HW\''			' ELSE CAST ( wake_reason AS VARCHAR(2) )'		'END AS wake_reason'	' FROM pwrx'	' INNER JOIN samples ON samples.id = pwrx.id') do_query(query, 'CREATE VIEW power_events_view AS '	'SELECT '		'samples.id,'		'samples.time,'		'samples.cpu,'		'selected_events.name AS event,'		'FORMAT(\'%6s\', cbr.cbr) AS cbr,'		'FORMAT(\'%6s\', cbr.mhz) AS MHz,'		'FORMAT(\'%5s\', cbr.percent) AS percent,'		'to_hex(mwait.hints) AS hints_hex,'		'to_hex(mwait.extensions) AS extensions_hex,'		'FORMAT(\'%3s\', pwre.cstate) AS cstate,'		'FORMAT(\'%3s\', pwre.subcstate) AS subcstate,'		'CASE WHEN pwre.hw=FALSE THEN \'False\' WHEN pwre.hw=TRUE THEN \'True\' ELSE NULL END AS hw,'		'CASE WHEN exstop.exact_ip=FALSE THEN \'False\' WHEN exstop.exact_ip=TRUE THEN \'True\' ELSE NULL END AS exact_ip,'		'FORMAT(\'%3s\', pwrx.deepest_cstate) AS deepest_cstate,'		'FORMAT(\'%3s\', pwrx.last_cstate) AS last_cstate,'		'CASE     WHEN pwrx.wake_reason=1 THEN \'Interrupt\''			' WHEN pwrx.wake_reason=2 THEN \'Timer Deadline\''			' WHEN pwrx.wake_reason=4 THEN \'Monitored Address\''			' WHEN pwrx.wake_reason=8 THEN \'HW\''			' ELSE FORMAT(\'%2s\', pwrx.wake_reason)'		'END AS wake_reason'	' FROM cbr'	' FULL JOIN mwait ON mwait.id = cbr.id'	' FULL JOIN pwre ON pwre.id = cbr.id'	' FULL JOIN exstop ON exstop.id = cbr.id'	' FULL JOIN pwrx ON pwrx.id = cbr.id'	' INNER JOIN samples ON samples.id = coalesce(cbr.id, mwait.id, pwre.id, exstop.id, pwrx.id)'	' INNER JOIN selected_events ON selected_events.id = samples.evsel_id'	' ORDER BY samples.id') do_query(query, 'CREATE VIEW context_switches_view AS '	'SELECT '		'context_switches.id,'		'context_switches.machine_id,'		'context_switches.time,'		'context_switches.cpu,'		'th_out.pid AS pid_out,'		'th_out.tid AS tid_out,'		'comm_out.comm AS comm_out,'		'th_in.pid AS pid_in,'		'th_in.tid AS tid_in,'		'comm_in.comm AS comm_in,'		'CASE	  WHEN context_switches.flags = 0 THEN \'in\''			' WHEN context_switches.flags = 1 THEN \'out\''			' WHEN context_switches.flags = 3 THEN \'out preempt\''			' ELSE CAST ( context_switches.flags AS VARCHAR(11) )'		'END AS flags'	' FROM context_switches'	' INNER JOIN threads AS th_out ON th_out.id   = context_switches.thread_out_id'	' INNER JOIN threads AS th_in  ON th_in.id    = context_switches.thread_in_id'	' INNER JOIN comms AS comm_out ON comm_out.id = context_switches.comm_out_id'	' INNER JOIN comms AS comm_in  ON comm_in.id  = context_switches.comm_in_id') file_header = struct.pack("!11sii", b"PGCOPY\n\377\r\n\0", 0, 0)file_trailer = b"\377\377" def open_output_file(file_name):	path_name = output_dir_name + "/" + file_name	file = open(path_name, "wb+")	file.write(file_header)	return file def close_output_file(file):	file.write(file_trailer)	file.close() def copy_output_file_direct(file, table_name):	close_output_file(file)	sql = "COPY " + table_name + " FROM '" + file.name + "' (FORMAT 'binary')"	do_query(query, sql) # Use COPY FROM STDIN because security may prevent postgres from accessing the files directlydef copy_output_file(file, table_name):	conn = PQconnectdb(toclientstr("dbname = " + dbname))	if (PQstatus(conn)):		raise Exception("COPY FROM STDIN PQconnectdb failed")	file.write(file_trailer)	file.seek(0)	sql = "COPY " + table_name + " FROM STDIN (FORMAT 'binary')"	res = PQexec(conn, toclientstr(sql))	if (PQresultStatus(res) != 4):		raise Exception("COPY FROM STDIN PQexec failed")	data = file.read(65536)	while (len(data)):		ret = PQputCopyData(conn, data, len(data))		if (ret != 1):			raise Exception("COPY FROM STDIN PQputCopyData failed, error " + str(ret))		data = file.read(65536)	ret = PQputCopyEnd(conn, None)	if (ret != 1):		raise Exception("COPY FROM STDIN PQputCopyEnd failed, error " + str(ret))	PQfinish(conn) def remove_output_file(file):	name = file.name	file.close()	os.unlink(name) evsel_file		= open_output_file("evsel_table.bin")machine_file		= open_output_file("machine_table.bin")thread_file		= open_output_file("thread_table.bin")comm_file		= open_output_file("comm_table.bin")comm_thread_file	= open_output_file("comm_thread_table.bin")dso_file		= open_output_file("dso_table.bin")symbol_file		= open_output_file("symbol_table.bin")branch_type_file	= open_output_file("branch_type_table.bin")sample_file		= open_output_file("sample_table.bin")if perf_db_export_calls or perf_db_export_callchains:	call_path_file		= open_output_file("call_path_table.bin")if perf_db_export_calls:	call_file		= open_output_file("call_table.bin")ptwrite_file		= open_output_file("ptwrite_table.bin")cbr_file		= open_output_file("cbr_table.bin")mwait_file		= open_output_file("mwait_table.bin")pwre_file		= open_output_file("pwre_table.bin")exstop_file		= open_output_file("exstop_table.bin")pwrx_file		= open_output_file("pwrx_table.bin")context_switches_file	= open_output_file("context_switches_table.bin") def trace_begin():	printdate("Writing to intermediate files...")	# id == 0 means unknown.  It is easier to create records for them than replace the zeroes with NULLs	evsel_table(0, "unknown")	machine_table(0, 0, "unknown")	thread_table(0, 0, 0, -1, -1)	comm_table(0, "unknown", 0, 0, 0)	dso_table(0, 0, "unknown", "unknown", "")	symbol_table(0, 0, 0, 0, 0, "unknown")	sample_table(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)	if perf_db_export_calls or perf_db_export_callchains:		call_path_table(0, 0, 0, 0)		call_return_table(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) unhandled_count = 0 def is_table_empty(table_name):	do_query(query, 'SELECT * FROM ' + table_name + ' LIMIT 1');	if query.next():		return False	return True def drop(table_name):	do_query(query, 'DROP VIEW ' + table_name + '_view');	do_query(query, 'DROP TABLE ' + table_name); def trace_end():	printdate("Copying to database...")	copy_output_file(evsel_file,		"selected_events")	copy_output_file(machine_file,		"machines")	copy_output_file(thread_file,		"threads")	copy_output_file(comm_file,		"comms")	copy_output_file(comm_thread_file,	"comm_threads")	copy_output_file(dso_file,		"dsos")	copy_output_file(symbol_file,		"symbols")	copy_output_file(branch_type_file,	"branch_types")	copy_output_file(sample_file,		"samples")	if perf_db_export_calls or perf_db_export_callchains:		copy_output_file(call_path_file,	"call_paths")	if perf_db_export_calls:		copy_output_file(call_file,		"calls")	copy_output_file(ptwrite_file,		"ptwrite")	copy_output_file(cbr_file,		"cbr")	copy_output_file(mwait_file,		"mwait")	copy_output_file(pwre_file,		"pwre")	copy_output_file(exstop_file,		"exstop")	copy_output_file(pwrx_file,		"pwrx")	copy_output_file(context_switches_file,	"context_switches") 	printdate("Removing intermediate files...")	remove_output_file(evsel_file)	remove_output_file(machine_file)	remove_output_file(thread_file)	remove_output_file(comm_file)	remove_output_file(comm_thread_file)	remove_output_file(dso_file)	remove_output_file(symbol_file)	remove_output_file(branch_type_file)	remove_output_file(sample_file)	if perf_db_export_calls or perf_db_export_callchains:		remove_output_file(call_path_file)	if perf_db_export_calls:		remove_output_file(call_file)	remove_output_file(ptwrite_file)	remove_output_file(cbr_file)	remove_output_file(mwait_file)	remove_output_file(pwre_file)	remove_output_file(exstop_file)	remove_output_file(pwrx_file)	remove_output_file(context_switches_file)	os.rmdir(output_dir_name)	printdate("Adding primary keys")	do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE machines        ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE threads         ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE comms           ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE comm_threads    ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE dsos            ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE symbols         ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE branch_types    ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE samples         ADD PRIMARY KEY (id)')	if perf_db_export_calls or perf_db_export_callchains:		do_query(query, 'ALTER TABLE call_paths      ADD PRIMARY KEY (id)')	if perf_db_export_calls:		do_query(query, 'ALTER TABLE calls           ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE ptwrite         ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE cbr             ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE mwait           ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE pwre            ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE exstop          ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE pwrx            ADD PRIMARY KEY (id)')	do_query(query, 'ALTER TABLE context_switches ADD PRIMARY KEY (id)') 	printdate("Adding foreign keys")	do_query(query, 'ALTER TABLE threads '					'ADD CONSTRAINT machinefk  FOREIGN KEY (machine_id)   REFERENCES machines   (id),'					'ADD CONSTRAINT processfk  FOREIGN KEY (process_id)   REFERENCES threads    (id)')	do_query(query, 'ALTER TABLE comms '					'ADD CONSTRAINT threadfk   FOREIGN KEY (c_thread_id)  REFERENCES threads    (id)')	do_query(query, 'ALTER TABLE comm_threads '					'ADD CONSTRAINT commfk     FOREIGN KEY (comm_id)      REFERENCES comms      (id),'					'ADD CONSTRAINT threadfk   FOREIGN KEY (thread_id)    REFERENCES threads    (id)')	do_query(query, 'ALTER TABLE dsos '					'ADD CONSTRAINT machinefk  FOREIGN KEY (machine_id)   REFERENCES machines   (id)')	do_query(query, 'ALTER TABLE symbols '					'ADD CONSTRAINT dsofk      FOREIGN KEY (dso_id)       REFERENCES dsos       (id)')	do_query(query, 'ALTER TABLE samples '					'ADD CONSTRAINT evselfk    FOREIGN KEY (evsel_id)     REFERENCES selected_events (id),'					'ADD CONSTRAINT machinefk  FOREIGN KEY (machine_id)   REFERENCES machines   (id),'					'ADD CONSTRAINT threadfk   FOREIGN KEY (thread_id)    REFERENCES threads    (id),'					'ADD CONSTRAINT commfk     FOREIGN KEY (comm_id)      REFERENCES comms      (id),'					'ADD CONSTRAINT dsofk      FOREIGN KEY (dso_id)       REFERENCES dsos       (id),'					'ADD CONSTRAINT symbolfk   FOREIGN KEY (symbol_id)    REFERENCES symbols    (id),'					'ADD CONSTRAINT todsofk    FOREIGN KEY (to_dso_id)    REFERENCES dsos       (id),'					'ADD CONSTRAINT tosymbolfk FOREIGN KEY (to_symbol_id) REFERENCES symbols    (id)')	if perf_db_export_calls or perf_db_export_callchains:		do_query(query, 'ALTER TABLE call_paths '					'ADD CONSTRAINT parentfk    FOREIGN KEY (parent_id)    REFERENCES call_paths (id),'					'ADD CONSTRAINT symbolfk    FOREIGN KEY (symbol_id)    REFERENCES symbols    (id)')	if perf_db_export_calls:		do_query(query, 'ALTER TABLE calls '					'ADD CONSTRAINT threadfk    FOREIGN KEY (thread_id)    REFERENCES threads    (id),'					'ADD CONSTRAINT commfk      FOREIGN KEY (comm_id)      REFERENCES comms      (id),'					'ADD CONSTRAINT call_pathfk FOREIGN KEY (call_path_id) REFERENCES call_paths (id),'					'ADD CONSTRAINT callfk      FOREIGN KEY (call_id)      REFERENCES samples    (id),'					'ADD CONSTRAINT returnfk    FOREIGN KEY (return_id)    REFERENCES samples    (id),'					'ADD CONSTRAINT parent_call_pathfk FOREIGN KEY (parent_call_path_id) REFERENCES call_paths (id)')		do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)')		do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)')		do_query(query, 'ALTER TABLE comms ADD has_calls boolean')		do_query(query, 'UPDATE comms SET has_calls = TRUE WHERE comms.id IN (SELECT DISTINCT comm_id FROM calls)')	do_query(query, 'ALTER TABLE ptwrite '					'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')	do_query(query, 'ALTER TABLE  cbr '					'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')	do_query(query, 'ALTER TABLE  mwait '					'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')	do_query(query, 'ALTER TABLE  pwre '					'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')	do_query(query, 'ALTER TABLE  exstop '					'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')	do_query(query, 'ALTER TABLE  pwrx '					'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')	do_query(query, 'ALTER TABLE  context_switches '					'ADD CONSTRAINT machinefk   FOREIGN KEY (machine_id)    REFERENCES machines (id),'					'ADD CONSTRAINT toutfk      FOREIGN KEY (thread_out_id) REFERENCES threads  (id),'					'ADD CONSTRAINT tinfk       FOREIGN KEY (thread_in_id)  REFERENCES threads  (id),'					'ADD CONSTRAINT coutfk      FOREIGN KEY (comm_out_id)   REFERENCES comms    (id),'					'ADD CONSTRAINT cinfk       FOREIGN KEY (comm_in_id)    REFERENCES comms    (id)') 	printdate("Dropping unused tables")	if is_table_empty("ptwrite"):		drop("ptwrite")	if is_table_empty("mwait") and is_table_empty("pwre") and is_table_empty("exstop") and is_table_empty("pwrx"):		do_query(query, 'DROP VIEW power_events_view');		drop("mwait")		drop("pwre")		drop("exstop")		drop("pwrx")		if is_table_empty("cbr"):			drop("cbr")	if is_table_empty("context_switches"):		drop("context_switches") 	if (unhandled_count):		printdate("Warning: ", unhandled_count, " unhandled events")	printdate("Done") def trace_unhandled(event_name, context, event_fields_dict):	global unhandled_count	unhandled_count += 1 def sched__sched_switch(*x):	pass def evsel_table(evsel_id, evsel_name, *x):	evsel_name = toserverstr(evsel_name)	n = len(evsel_name)	fmt = "!hiqi" + str(n) + "s"	value = struct.pack(fmt, 2, 8, evsel_id, n, evsel_name)	evsel_file.write(value) def machine_table(machine_id, pid, root_dir, *x):	root_dir = toserverstr(root_dir)	n = len(root_dir)	fmt = "!hiqiii" + str(n) + "s"	value = struct.pack(fmt, 3, 8, machine_id, 4, pid, n, root_dir)	machine_file.write(value) def thread_table(thread_id, machine_id, process_id, pid, tid, *x):	value = struct.pack("!hiqiqiqiiii", 5, 8, thread_id, 8, machine_id, 8, process_id, 4, pid, 4, tid)	thread_file.write(value) def comm_table(comm_id, comm_str, thread_id, time, exec_flag, *x):	comm_str = toserverstr(comm_str)	n = len(comm_str)	fmt = "!hiqi" + str(n) + "s" + "iqiqiB"	value = struct.pack(fmt, 5, 8, comm_id, n, comm_str, 8, thread_id, 8, time, 1, exec_flag)	comm_file.write(value) def comm_thread_table(comm_thread_id, comm_id, thread_id, *x):	fmt = "!hiqiqiq"	value = struct.pack(fmt, 3, 8, comm_thread_id, 8, comm_id, 8, thread_id)

Lines 501–1000 of 1111. Previous lines