mirror of
https://github.com/nasa/trick.git
synced 2025-06-13 04:38:25 +00:00
trick comm byteswap functions can't handle sizes above 65536 bytes
Backporting fix that adds pthread specific swap buffer for both tc_read and tc_write. refs #187
This commit is contained in:
@ -25,6 +25,11 @@ short trick_byteswap_short(short input);
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct SwapBuffer {
|
||||||
|
unsigned int size ;
|
||||||
|
char * swap_space ;
|
||||||
|
} ;
|
||||||
|
|
||||||
#define TRICK_GET_BYTE_ORDER(IND) \
|
#define TRICK_GET_BYTE_ORDER(IND) \
|
||||||
{ \
|
{ \
|
||||||
union { \
|
union { \
|
||||||
|
@ -4,14 +4,23 @@
|
|||||||
* byte orders are different.
|
* byte orders are different.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
#include "../include/tc.h"
|
#include "../include/tc.h"
|
||||||
#include "../include/tc_proto.h"
|
#include "../include/tc_proto.h"
|
||||||
|
#include "../include/trick_byteswap.h"
|
||||||
|
|
||||||
|
static pthread_key_t key ;
|
||||||
|
static pthread_once_t key_once = PTHREAD_ONCE_INIT ;
|
||||||
|
static void make_key() {
|
||||||
|
pthread_key_create(&key, NULL) ;
|
||||||
|
}
|
||||||
|
|
||||||
int tc_read_byteswap(TCDevice * device, char *buffer, int size, ATTRIBUTES * attr)
|
int tc_read_byteswap(TCDevice * device, char *buffer, int size, ATTRIBUTES * attr)
|
||||||
{
|
{
|
||||||
char local_byteorder;
|
char local_byteorder;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
static char swap[65536];
|
struct SwapBuffer * swap_buffer ;
|
||||||
|
|
||||||
if (!device) {
|
if (!device) {
|
||||||
TrickErrorHndlr *temp_error_hndlr = NULL;
|
TrickErrorHndlr *temp_error_hndlr = NULL;
|
||||||
@ -20,12 +29,27 @@ int tc_read_byteswap(TCDevice * device, char *buffer, int size, ATTRIBUTES * att
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_once(&key_once, make_key) ;
|
||||||
|
if (( swap_buffer = pthread_getspecific(key)) == NULL ) {
|
||||||
|
swap_buffer = malloc(sizeof(struct SwapBuffer)) ;
|
||||||
|
swap_buffer->size = 0 ;
|
||||||
|
pthread_setspecific(key, swap_buffer) ;
|
||||||
|
}
|
||||||
|
if ( (unsigned int)size > swap_buffer->size ) {
|
||||||
|
unsigned int new_size = (unsigned int)size ;
|
||||||
|
if ( new_size % 4 ) {
|
||||||
|
new_size = new_size - ( new_size % 4 ) + 4 ;
|
||||||
|
}
|
||||||
|
swap_buffer->swap_space = malloc(new_size) ;
|
||||||
|
swap_buffer->size = new_size ;
|
||||||
|
}
|
||||||
|
|
||||||
TRICK_GET_BYTE_ORDER(local_byteorder)
|
TRICK_GET_BYTE_ORDER(local_byteorder)
|
||||||
|
|
||||||
if (device->byte_info[TC_BYTE_ORDER_NDX] != local_byteorder) {
|
if (device->byte_info[TC_BYTE_ORDER_NDX] != local_byteorder) {
|
||||||
memset(swap, 0, (size_t) size);
|
memset(swap_buffer->swap_space, 0, (size_t) size);
|
||||||
ret = tc_read(device, (char *) swap, size);
|
ret = tc_read(device, (char *) swap_buffer->swap_space, size);
|
||||||
trick_bswap_buffer(buffer, swap, attr, 0);
|
trick_bswap_buffer(buffer, swap_buffer->swap_space, attr, 0);
|
||||||
return (ret);
|
return (ret);
|
||||||
} else {
|
} else {
|
||||||
return (tc_read(device, (char *) buffer, size));
|
return (tc_read(device, (char *) buffer, size));
|
||||||
|
@ -4,14 +4,23 @@
|
|||||||
* byte orders are different.
|
* byte orders are different.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
#include "../include/tc.h"
|
#include "../include/tc.h"
|
||||||
#include "../include/tc_proto.h"
|
#include "../include/tc_proto.h"
|
||||||
|
#include "../include/trick_byteswap.h"
|
||||||
|
|
||||||
|
static pthread_key_t key ;
|
||||||
|
static pthread_once_t key_once = PTHREAD_ONCE_INIT ;
|
||||||
|
static void make_key() {
|
||||||
|
pthread_key_create(&key, NULL) ;
|
||||||
|
}
|
||||||
|
|
||||||
int tc_write_byteswap(TCDevice * device, char *buffer, int size, ATTRIBUTES * attr)
|
int tc_write_byteswap(TCDevice * device, char *buffer, int size, ATTRIBUTES * attr)
|
||||||
{
|
{
|
||||||
char local_byteorder;
|
char local_byteorder;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
static char swap[65536];
|
struct SwapBuffer * swap_buffer ;
|
||||||
|
|
||||||
if (!device) {
|
if (!device) {
|
||||||
TrickErrorHndlr *temp_error_hndlr = NULL;
|
TrickErrorHndlr *temp_error_hndlr = NULL;
|
||||||
@ -20,12 +29,27 @@ int tc_write_byteswap(TCDevice * device, char *buffer, int size, ATTRIBUTES * at
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_once(&key_once, make_key) ;
|
||||||
|
if (( swap_buffer = pthread_getspecific(key)) == NULL ) {
|
||||||
|
swap_buffer = malloc(sizeof(struct SwapBuffer)) ;
|
||||||
|
swap_buffer->size = 0 ;
|
||||||
|
pthread_setspecific(key, swap_buffer) ;
|
||||||
|
}
|
||||||
|
if ( (unsigned int)size > swap_buffer->size ) {
|
||||||
|
unsigned int new_size = (unsigned int)size ;
|
||||||
|
if ( new_size % 4 ) {
|
||||||
|
new_size = new_size - ( new_size % 4 ) + 4 ;
|
||||||
|
}
|
||||||
|
swap_buffer->swap_space = malloc(new_size) ;
|
||||||
|
swap_buffer->size = new_size ;
|
||||||
|
}
|
||||||
|
|
||||||
TRICK_GET_BYTE_ORDER(local_byteorder)
|
TRICK_GET_BYTE_ORDER(local_byteorder)
|
||||||
|
|
||||||
if (device->byte_info[TC_BYTE_ORDER_NDX] != local_byteorder) {
|
if (device->byte_info[TC_BYTE_ORDER_NDX] != local_byteorder) {
|
||||||
memset(swap, 0, (size_t) size);
|
memset(swap_buffer->swap_space, 0, (size_t) size);
|
||||||
trick_bswap_buffer(swap, buffer, attr, 1);
|
trick_bswap_buffer(swap_buffer->swap_space, buffer, attr, 1);
|
||||||
ret = tc_write(device, (char *) swap, size);
|
ret = tc_write(device, (char *) swap_buffer->swap_space, size);
|
||||||
return (ret);
|
return (ret);
|
||||||
} else {
|
} else {
|
||||||
return (tc_write(device, (char *) buffer, size));
|
return (tc_write(device, (char *) buffer, size));
|
||||||
|
Reference in New Issue
Block a user