Browse Source

Remove use of packed structs.

Remove use of packed structs, now that the infrastructure for consistently
aligning types between 32-bit and 64-bit platforms is in place. This fixes
crashes on platforms which enforce alignment rules (because there are
places in the code where pointers to packed fields are used).

Also, it theoretically improves performance, though I haven't actually
performed any measurements.

ABI implications:

jack_latency_range_t and jack_position_t are no longer packed. The layouts
of these structs themselves are unmodified, though the layouts of any
structs which include these structs as members may be affected.
pull/25/head
Basil Nutmeg Robin Gareus 13 years ago
parent
commit
b540b2489e
15 changed files with 57 additions and 80 deletions
  1. +2
    -2
      common/JackActivationCount.h
  2. +4
    -4
      common/JackAtomicArrayState.h
  3. +4
    -4
      common/JackAtomicState.h
  4. +2
    -2
      common/JackClientControl.h
  5. +12
    -12
      common/JackConnectionManager.h
  6. +2
    -2
      common/JackEngineControl.h
  7. +8
    -8
      common/JackEngineProfiling.h
  8. +6
    -6
      common/JackFilters.h
  9. +4
    -4
      common/JackFrameTimer.h
  10. +2
    -2
      common/JackGraphManager.h
  11. +2
    -2
      common/JackPort.h
  12. +2
    -2
      common/JackTransportEngine.h
  13. +1
    -24
      common/jack/systemdeps.h
  14. +4
    -4
      common/jack/types.h
  15. +2
    -2
      common/shm.h

+ 2
- 2
common/JackActivationCount.h View File

@@ -33,7 +33,7 @@ struct JackClientControl;
\brief Client activation counter.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
class JackActivationCount
{

@@ -74,7 +74,7 @@ class JackActivationCount
return fValue;
}

} POST_PACKED_STRUCTURE;
};

} // end of namespace



+ 4
- 4
common/JackAtomicArrayState.h View File

@@ -30,7 +30,7 @@ namespace Jack
/*!
\brief Counter for CAS
*/
PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct AtomicArrayCounter
{
union {
@@ -68,7 +68,7 @@ struct AtomicArrayCounter
return *this;
}
} POST_PACKED_STRUCTURE;
};

#define Counter1(e) (e).info.fLongVal
#define GetIndex1(e, state) ((e).info.scounter.fByteVal[state])
@@ -109,7 +109,7 @@ Requirement:

// CHECK livelock

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
template <class T>
class JackAtomicArrayState
{
@@ -249,7 +249,7 @@ class JackAtomicArrayState
WriteNextStateStopAux(state);
}

} POST_PACKED_STRUCTURE;
};

} // end of namespace



+ 4
- 4
common/JackAtomicState.h View File

@@ -31,7 +31,7 @@ namespace Jack
\brief Counter for CAS
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct AtomicCounter
{
union {
@@ -70,7 +70,7 @@ struct AtomicCounter
return *this;
}

} POST_PACKED_STRUCTURE;
};

#define Counter(e) (e).info.fLongVal
#define CurIndex(e) (e).info.scounter.fShortVal1
@@ -85,7 +85,7 @@ struct AtomicCounter

// CHECK livelock

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
template <class T>
class JackAtomicState
{
@@ -254,7 +254,7 @@ class JackAtomicState
}
*/
} POST_PACKED_STRUCTURE;
};

} // end of namespace



+ 2
- 2
common/JackClientControl.h View File

@@ -34,7 +34,7 @@ namespace Jack
\brief Client control possibly in shared memory.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct JackClientControl : public JackShmMemAble
{
char fName[JACK_CLIENT_NAME_SIZE + 1];
@@ -88,7 +88,7 @@ struct JackClientControl : public JackShmMemAble
fSessionID = uuid;
}

} POST_PACKED_STRUCTURE;
};

} // end of namespace



+ 12
- 12
common/JackConnectionManager.h View File

@@ -36,7 +36,7 @@ struct JackClientControl;
\brief Utility class.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
template <int SIZE>
class JackFixedArray
{
@@ -117,13 +117,13 @@ class JackFixedArray
return fCounter;
}

} POST_PACKED_STRUCTURE;
};

/*!
\brief Utility class.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
template <int SIZE>
class JackFixedArray1 : public JackFixedArray<SIZE>
{
@@ -154,13 +154,13 @@ class JackFixedArray1 : public JackFixedArray<SIZE>
}
}

} POST_PACKED_STRUCTURE;
};

/*!
\brief Utility class.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
template <int SIZE>
class JackFixedMatrix
{
@@ -250,13 +250,13 @@ class JackFixedMatrix
}


} POST_PACKED_STRUCTURE;
};

/*!
\brief Utility class.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
template <int SIZE>
class JackLoopFeedback
{
@@ -364,13 +364,13 @@ class JackLoopFeedback
return -1;
}

} POST_PACKED_STRUCTURE;
};

/*!
\brief For client timing measurements.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct JackClientTiming
{
jack_time_t fSignaledAt;
@@ -393,7 +393,7 @@ struct JackClientTiming
fStatus = NotTriggered;
}

} POST_PACKED_STRUCTURE;
};

/*!
\brief Connection manager.
@@ -407,7 +407,7 @@ struct JackClientTiming
</UL>
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
class SERVER_EXPORT JackConnectionManager
{

@@ -487,7 +487,7 @@ class SERVER_EXPORT JackConnectionManager
int SuspendRefNum(JackClientControl* control, JackSynchro* table, JackClientTiming* timing, long time_out_usec);
void TopologicalSort(std::vector<jack_int_t>& sorted);

} POST_PACKED_STRUCTURE;
};

} // end of namespace



+ 2
- 2
common/JackEngineControl.h View File

@@ -47,7 +47,7 @@ typedef JACK_ALIGNED_TYPE(UInt64) jack_UInt64;
\brief Engine control in shared memory.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct SERVER_EXPORT JackEngineControl : public JackShmMem
{
// Shared state
@@ -183,7 +183,7 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem
void CalcCPULoad(JackClientInterface** table, JackGraphManager* manager, jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end);
void ResetRollingUsecs();

} POST_PACKED_STRUCTURE;
};

} // end of namespace



+ 8
- 8
common/JackEngineProfiling.h View File

@@ -37,7 +37,7 @@ namespace Jack
\brief Timing stucture for a client.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct JackTimingMeasureClient
{
int fRefNum;
@@ -54,13 +54,13 @@ struct JackTimingMeasureClient
fStatus((jack_client_state_t)0)
{}
} POST_PACKED_STRUCTURE;
};

/*!
\brief Timing interval in the global table for a given client
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct JackTimingClientInterval
{
int fRefNum;
@@ -74,13 +74,13 @@ struct JackTimingClientInterval
fEndInterval(-1)
{}
} POST_PACKED_STRUCTURE;
};

/*!
\brief Timing stucture for a table of clients.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct JackTimingMeasure
{
unsigned int fAudioCycle;
@@ -96,7 +96,7 @@ struct JackTimingMeasure
fPrevCycleEnd(0)
{}
} POST_PACKED_STRUCTURE;
};

/*!
\brief Client timing monitoring.
@@ -105,7 +105,7 @@ struct JackTimingMeasure
class JackClientInterface;
class JackGraphManager;

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
class SERVER_EXPORT JackEngineProfiling
{

@@ -132,7 +132,7 @@ class SERVER_EXPORT JackEngineProfiling
JackTimingMeasure* GetCurMeasure();

} POST_PACKED_STRUCTURE;
};

} // end of namespace



+ 6
- 6
common/JackFilters.h View File

@@ -38,7 +38,7 @@ namespace Jack

#define MAX_SIZE 64

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct JackFilter
{

@@ -64,9 +64,9 @@ namespace Jack
return mean / MAX_SIZE;
}

} POST_PACKED_STRUCTURE;
};

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
class JackDelayLockedLoop
{

@@ -147,9 +147,9 @@ namespace Jack
return fCurrentWakeup;
}

} POST_PACKED_STRUCTURE;
};

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
class JackAtomicDelayLockedLoop : public JackAtomicState<JackDelayLockedLoop>
{
public:
@@ -213,7 +213,7 @@ namespace Jack

return res;
}
} POST_PACKED_STRUCTURE;
};

#endif



+ 4
- 4
common/JackFrameTimer.h View File

@@ -32,7 +32,7 @@ namespace Jack
\brief A structure used for time management.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
class SERVER_EXPORT JackTimer
{

@@ -69,13 +69,13 @@ class SERVER_EXPORT JackTimer
return fCurrentWakeup;
}

} POST_PACKED_STRUCTURE;
};

/*!
\brief A class using the JackAtomicState to manage jack time.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
class SERVER_EXPORT JackFrameTimer : public JackAtomicState<JackTimer>
{

@@ -97,7 +97,7 @@ class SERVER_EXPORT JackFrameTimer : public JackAtomicState<JackTimer>
void IncFrameTime(jack_nframes_t buffer_size, jack_time_t callback_usecs, jack_time_t period_usecs);
void ReadFrameTime(JackTimer* timer);

} POST_PACKED_STRUCTURE;
};


} // end of namespace


+ 2
- 2
common/JackGraphManager.h View File

@@ -36,7 +36,7 @@ namespace Jack
\brief Graph manager: contains the connection manager and the port array.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
class SERVER_EXPORT JackGraphManager : public JackShmMem, public JackAtomicState<JackConnectionManager>
{

@@ -137,7 +137,7 @@ class SERVER_EXPORT JackGraphManager : public JackShmMem, public JackAtomicState
static JackGraphManager* Allocate(int port_max);
static void Destroy(JackGraphManager* manager);

} POST_PACKED_STRUCTURE;
};


} // end of namespace


+ 2
- 2
common/JackPort.h View File

@@ -35,7 +35,7 @@ namespace Jack
\brief Base class for port.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
class SERVER_EXPORT JackPort
{

@@ -113,7 +113,7 @@ class SERVER_EXPORT JackPort

int GetRefNum() const;

} POST_PACKED_STRUCTURE;
};

} // end of namespace



+ 2
- 2
common/JackTransportEngine.h View File

@@ -89,7 +89,7 @@ We have:

class JackClientInterface;

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
class SERVER_EXPORT JackTransportEngine : public JackAtomicArrayState<jack_position_t>
{

@@ -194,7 +194,7 @@ class SERVER_EXPORT JackTransportEngine : public JackAtomicArrayState<jack_posit
fNetworkSync = sync;
}

} POST_PACKED_STRUCTURE;
};

} // end of namespace



+ 1
- 24
common/jack/systemdeps.h View File

@@ -20,19 +20,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#ifndef __jack_systemdeps_h__
#define __jack_systemdeps_h__

#ifndef POST_PACKED_STRUCTURE
#ifndef JACK_ALIGNED_TYPE

#ifdef __GNUC__
/* POST_PACKED_STRUCTURE needs to be a macro which
expands into a compiler directive. The directive must
tell the compiler to arrange the preceding structure
declaration so that it is packed on byte-boundaries rather
than use the natural alignment of the processor and/or
compiler.
*/

#define PRE_PACKED_STRUCTURE
#define POST_PACKED_STRUCTURE __attribute__((__packed__))

#define JACK_ALIGN(N) __attribute__((__aligned__(N)))

@@ -42,18 +33,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#else
#ifdef _MSC_VER
#define PRE_PACKED_STRUCTURE1 __pragma(pack(push,1))
#define PRE_PACKED_STRUCTURE PRE_PACKED_STRUCTURE1
/* PRE_PACKED_STRUCTURE needs to be a macro which
expands into a compiler directive. The directive must
tell the compiler to arrange the following structure
declaration so that it is packed on byte-boundaries rather
than use the natural alignment of the processor and/or
compiler.
*/
#define POST_PACKED_STRUCTURE ;__pragma(pack(pop))
/* and POST_PACKED_STRUCTURE needs to be a macro which
restores the packing to its previous setting */

#define JACK_ALIGN(N) __declspec(align(N))

@@ -61,8 +40,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#define JACK_ALIGNED_TYPE(T) JACK_ALIGN(sizeof(T)) T

#else
#define PRE_PACKED_STRUCTURE
#define POST_PACKED_STRUCTURE

#define JACK_ALIGN(N)
#define JACK_ALIGNED_TYPE(T) T


+ 4
- 4
common/jack/types.h View File

@@ -267,7 +267,7 @@ typedef void (*JackLatencyCallback)(jack_latency_callback_mode_t mode, void *arg
/**
* the new latency API operates on Ranges.
*/
PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct _jack_latency_range
{
/**
@@ -278,7 +278,7 @@ struct _jack_latency_range
* maximum latency
*/
jack_nframes_t max;
} POST_PACKED_STRUCTURE;
};

typedef struct _jack_latency_range jack_latency_range_t;

@@ -557,7 +557,7 @@ typedef enum {
#define JACK_POSITION_MASK (JackPositionBBT|JackPositionTimecode)
#define EXTENDED_TIME_INFO

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct _jack_position {

/* these four cannot be set from clients: the server sets them */
@@ -624,7 +624,7 @@ struct _jack_position {
/* When (unique_1 == unique_2) the contents are consistent. */
jack_unique_t unique_2; /**< unique ID */

} POST_PACKED_STRUCTURE;
};

typedef struct _jack_position jack_position_t;



+ 2
- 2
common/shm.h View File

@@ -149,7 +149,7 @@ extern "C"
* attached to the address space.
*/

PRE_PACKED_STRUCTURE
/* Note: This class must be kept 32/64 clean! */
struct _jack_shm_info {
jack_shm_registry_index_t index; /* offset into the registry */
uint32_t size;
@@ -157,7 +157,7 @@ extern "C"
void *attached_at; /* address where attached */
char ptr_size[8];
} ptr; /* a "pointer" that has the same 8 bytes size when compling in 32 or 64 bits */
} POST_PACKED_STRUCTURE;
};
typedef struct _jack_shm_info jack_shm_info_t;


Loading…
Cancel
Save