BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
ROSFragment.cxx
Go to the documentation of this file.
1// Dear emacs, this is -*- c++ -*-
2
3/**
4 * @file ROSFragment.cxx
5 * @author <a href="mailto:Andre.dos.Anjos@cern.ch">Andre DOS ANJOS</a>
6 * $Author: maqm $
7 * $Revision: 1.2 $
8 * $Date: 2011/02/20 23:38:21 $
9 *
10 * Implements the ROS fragment writing helper class
11 */
12
13#include "eformat/write/ROSFragment.h"
14#include "eformat/HeaderMarker.h"
15#include "eformat/Status.h"
16#include "eformat/write/SubDetectorFragment.h"
17#include "ers/StreamFactory.h"
18#include <cstring>
20 uint32_t lvl1_id, uint32_t bc_id )
21 : m_parent( 0 ), m_child( 0 ), m_last( 0 ), m_next( 0 ), m_extra_count( 0 ) {
22 m_header[0] = eformat::ROS; // marker
23 m_header[1] = 11; // this header size + status size
24 m_header[2] = 11; // this header size + status size
25 m_header[3] = eformat::DEFAULT_VERSION; // format version
26 m_header[4] = source_id;
27 m_header[5] = 1; // number of status
28 m_header[6] = 3; // number of fragment specific
29 m_header[7] = run_no;
30 m_header[8] = lvl1_id;
31 m_header[9] = bc_id;
32
33 // now initialize pages
34 set( m_node[0], m_header, 6, &m_node[1] );
35 set( m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2] );
36 set( m_node[2], &m_header[6], 4, 0 );
37 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
38 "Built (write) ros fragment from scratch, with", ROSFragment::source_id(),
40}
41
43 : m_parent( 0 ), m_child( 0 ), m_last( 0 ), m_next( 0 ), m_extra_count( 0 ) {
44 // now initialize pages
45 set( m_node[0], ros, 6, &m_node[1] );
46 set( m_node[1], &ros[6], ros[5], &m_node[2] );
47 set( m_node[2], &ros[6 + ros[5]], 4, &m_extra );
48 eformat::write::set( m_extra, &ros[10 + ros[5]], ros[1] - ros[2] );
49 ++m_extra_count;
50 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
51 "Built (write) ros fragment from contiguous memory, with", source_id(),
52 lvl1_id(), run_no() );
53}
54
56 : m_parent( 0 ), m_child( 0 ), m_last( 0 ), m_next( 0 ), m_extra_count( 0 ) {
57 // now initialize pages
58 set( m_node[0], ros->base, 6, &m_node[1] );
59 set( m_node[1], &ros->base[6], ros->base[5], &m_node[2] );
60 set( m_node[2], &ros->base[6 + ros->base[5]], 4, &m_extra );
61 eformat::write::set( m_extra, &ros->base[10 + ros->base[5]], ros->size_word - ros->base[2],
62 ros->next );
63 m_extra_count += eformat::write::count( m_extra );
64 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
65 "Built (write) ros fragment from paged memory, with", source_id(), lvl1_id(),
66 run_no() );
67}
68
70 : m_parent( 0 ), m_child( 0 ), m_last( 0 ), m_next( 0 ), m_extra_count( 0 ) {
71 m_header[0] = eformat::ROS; // marker
72 m_header[1] = 11; // this header size + status size
73 m_header[2] = 11; // this header size + status size
74 m_header[3] = eformat::DEFAULT_VERSION; // format version
75 m_header[4] = 0; // source identifier
76 m_header[5] = 1; // number of status
77 m_header[6] = 3; // number of fragment specific
78 m_header[7] = 0; // run number
79 m_header[8] = 0; // LVL1 identifier
80 m_header[9] = 0; // bunch crossing identifier
81
82 // now initialize pages
83 set( m_node[0], m_header, 6, &m_node[1] );
84 set( m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2] );
85 set( m_node[2], &m_header[6], 4, 0 );
86 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
87 "Built empty (write) ros fragment from scratch, with", ROSFragment::source_id(),
89}
90
92 : m_parent( 0 ), m_child( 0 ), m_last( 0 ), m_next( 0 ), m_extra_count( 0 ) {
93 *this = other;
94 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
95 "Built (write) ros fragment from copy, with", ROSFragment::source_id(),
97}
98
101 memcpy( reinterpret_cast<void*>( m_header ),
102 reinterpret_cast<const void*>( other.m_node[0].base ), 6 * sizeof( uint32_t ) );
103 memcpy( reinterpret_cast<void*>( m_header + 6 ),
104 reinterpret_cast<const void*>( other.m_node[2].base ), 4 * sizeof( uint32_t ) );
105
106 // now initialize pages
107 set( m_node[0], m_header, 6, &m_node[1] );
108 set( m_node[1], other.m_node[1].base, other.m_node[1].size_word, &m_node[2] );
109 set( m_node[2], &m_header[6], 4, 0 );
110 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
111 "Copied (write) ros fragment, with", ROSFragment::source_id(),
113 return *this;
114}
115
116void eformat::write::ROSFragment::status( uint32_t n, const uint32_t* status ) {
117 if ( m_parent )
118 m_parent->size_change( m_node[0].base[1], m_node[0].base[1] - m_node[0].base[5] + n );
119 m_node[0].base[1] -= m_node[0].base[5]; // remove count from previous status
120 m_node[0].base[2] -= m_node[0].base[5]; // remove count from previous status
121 m_node[1].size_word = m_node[0].base[5] = n; // set new values
122 m_node[0].base[1] += n;
123 m_node[0].base[2] += n;
124 m_node[1].base = const_cast<uint32_t*>( status );
125}
126
127void eformat::write::ROSFragment::size_change( uint32_t o, uint32_t n ) {
128 uint32_t old_size = m_node[0].base[1];
129 m_node[0].base[1] -= o;
130 m_node[0].base[1] += n;
131 if ( m_parent ) m_parent->size_change( old_size, m_node[0].base[1] );
132}
133
135 ERS_DEBUG_3( "%s Source Id. = 0x%x to ros fragment with Source Id. = 0x%x",
136 "Appending rob fragment with", rob->source_id(), source_id() );
137 rob->parent( this );
138 uint32_t old_size = m_node[0].base[1];
139 m_node[0].base[1] += rob->size_word();
140
141 // adjust `m_last' and `m_child' to point to the new last ROB
142 if ( m_last ) m_last->next( rob );
143 else m_child = rob;
144 m_last = rob;
145
146 // propagate changes to my parent
147 if ( m_parent ) m_parent->size_change( old_size, m_node[0].base[1] );
148}
149
151 uint32_t retval = 3 + m_extra_count;
152 for ( const ROBFragment* curr = m_child; curr; curr = curr->next() )
153 retval += curr->page_count();
154 return retval;
155}
156
158 // the header is already concatenated by construction
159 eformat::write::node_t* last = &m_node[2];
160 if ( m_extra_count )
161 {
162 last = &m_extra;
163 while ( last->next ) last = last->next;
164 }
165 for ( const ROBFragment* curr = m_child; curr; curr = curr->next() )
166 {
167 last->next = const_cast<eformat::write::node_t*>( curr->bind() );
168 while ( last->next ) last = last->next; // advance until end
169 }
170 return m_node;
171}
const Int_t n
#define ERS_DEBUG_3(...)
uint32_t page_count(void) const
void size_change(uint32_t o, uint32_t n)
void status(uint32_t n, const uint32_t *status)
ROSFragment & operator=(const ROSFragment &other)
const eformat::write::node_t * bind(void)
void append(eformat::write::ROBFragment *rob)
uint32_t count(const node_t &list)
Definition node.cxx:38
void set(node_t &i, const uint32_t *b, size_t l, node_t *n=0)
Definition node.cxx:16
uint32_t * base
The base address for this page.
size_t size_word
The size, in 4-byte words for this page.