add msgpack/sysdep.h

This commit is contained in:
frsyuki
2009-12-10 07:22:39 +09:00
parent ba3ba0367c
commit 35929b46ae
9 changed files with 143 additions and 65 deletions

View File

@@ -8,5 +8,6 @@ nobase_include_HEADERS = \
msgpack/pack_define.h \
msgpack/pack_template.h \
msgpack/unpack_define.h \
msgpack/unpack_template.h
msgpack/unpack_template.h \
msgpack/sysdep.h

View File

@@ -19,7 +19,7 @@
#define MSGPACK_OBJECT_H__
#include "msgpack/zone.h"
#include "msgpack/sys.h"
#include "msgpack/sysdep.h"
#include <stdio.h>
#ifdef __cplusplus

View File

@@ -141,48 +141,31 @@ static inline int template_callback_raw(unpack_user* u, const char* b, const cha
#define CTX_CAST(m) ((template_context*)(m))
#define CTX_REFERENCED(mpac) CTX_CAST((mpac)->ctx)->user.referenced
#ifndef _MSC_VER
typedef unsigned int counter_t;
#else
typedef long counter_t;
#endif
#define COUNTER_SIZE (sizeof(volatile counter_t))
#define COUNTER_SIZE (sizeof(_msgpack_atomic_counter_t))
static inline void init_count(void* buffer)
{
*(volatile counter_t*)buffer = 1;
*(volatile _msgpack_atomic_counter_t*)buffer = 1;
}
static inline void decl_count(void* buffer)
{
// atomic if(--*(counter_t*)buffer == 0) { free(buffer); }
if(
#ifndef _MSC_VER
__sync_sub_and_fetch((counter_t*)buffer, 1) == 0
#else
InterlockedDecrement((volatile counter_t*)&buffer) == 0
#endif
) {
// atomic if(--*(_msgpack_atomic_counter_t*)buffer == 0) { free(buffer); }
if(_msgpack_sync_decr_and_fetch((volatile _msgpack_atomic_counter_t*)buffer)) {
free(buffer);
}
}
static inline void incr_count(void* buffer)
{
// atomic ++*(counter_t*)buffer;
#ifndef _MSC_VER
__sync_add_and_fetch((counter_t*)buffer, 1);
#else
InterlockedIncrement((volatile counter_t*)&buffer);
#endif
// atomic ++*(_msgpack_atomic_counter_t*)buffer;
_msgpack_sync_incr_and_fetch((volatile _msgpack_atomic_counter_t*)buffer);
}
static inline counter_t get_count(void* buffer)
static inline _msgpack_atomic_counter_t get_count(void* buffer)
{
return *(volatile counter_t*)buffer;
return *(volatile _msgpack_atomic_counter_t*)buffer;
}

View File

@@ -1,6 +1,6 @@
AC_INIT(msgpack/unpack_template.h)
AC_CONFIG_AUX_DIR(ac)
AM_INIT_AUTOMAKE(msgpack, 0.3.8)
AM_INIT_AUTOMAKE(msgpack, 0.3.9)
AC_CONFIG_HEADER(config.h)
AC_SUBST(CFLAGS)

View File

@@ -18,7 +18,7 @@
#ifndef MSGPACK_PACK_DEFINE_H__
#define MSGPACK_PACK_DEFINE_H__
#include "msgpack/sys.h"
#include "msgpack/sysdep.h"
#include <limits.h>
#endif /* msgpack/pack_define.h */

View File

@@ -69,7 +69,7 @@ do { \
} else { \
/* unsigned 16 */ \
unsigned char buf[3]; \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = msgpack_be16(d); \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \
msgpack_pack_append_buffer(x, buf, 3); \
} \
} while(0)
@@ -89,12 +89,12 @@ do { \
if(d < (1<<16)) { \
/* unsigned 16 */ \
unsigned char buf[3]; \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = msgpack_be16(d); \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \
msgpack_pack_append_buffer(x, buf, 3); \
} else { \
/* unsigned 32 */ \
unsigned char buf[5]; \
buf[0] = 0xce; *(uint32_t*)&buf[1] = msgpack_be32(d); \
buf[0] = 0xce; *(uint32_t*)&buf[1] = _msgpack_be32(d); \
msgpack_pack_append_buffer(x, buf, 5); \
} \
} \
@@ -115,17 +115,17 @@ do { \
if(d < (1ULL<<16)) { \
/* signed 16 */ \
unsigned char buf[3]; \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = msgpack_be16(d); \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \
msgpack_pack_append_buffer(x, buf, 3); \
} else if(d < (1ULL<<32)) { \
/* signed 32 */ \
unsigned char buf[5]; \
buf[0] = 0xce; *(uint32_t*)&buf[1] = msgpack_be32(d); \
buf[0] = 0xce; *(uint32_t*)&buf[1] = _msgpack_be32(d); \
msgpack_pack_append_buffer(x, buf, 5); \
} else { \
/* signed 64 */ \
unsigned char buf[9]; \
buf[0] = 0xcf; *(uint64_t*)&buf[1] = msgpack_be64(d); \
buf[0] = 0xcf; *(uint64_t*)&buf[1] = _msgpack_be64(d); \
msgpack_pack_append_buffer(x, buf, 9); \
} \
} \
@@ -149,7 +149,7 @@ do { \
if(d < -(1<<7)) { \
/* signed 16 */ \
unsigned char buf[3]; \
buf[0] = 0xd1; *(uint16_t*)&buf[1] = msgpack_be16(d); \
buf[0] = 0xd1; *(uint16_t*)&buf[1] = _msgpack_be16(d); \
msgpack_pack_append_buffer(x, buf, 3); \
} else { \
/* signed 8 */ \
@@ -167,7 +167,7 @@ do { \
} else { \
/* unsigned 16 */ \
unsigned char buf[3]; \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = msgpack_be16(d); \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \
msgpack_pack_append_buffer(x, buf, 3); \
} \
} \
@@ -179,12 +179,12 @@ do { \
if(d < -(1<<15)) { \
/* signed 32 */ \
unsigned char buf[5]; \
buf[0] = 0xd2; *(uint32_t*)&buf[1] = msgpack_be32(d); \
buf[0] = 0xd2; *(uint32_t*)&buf[1] = _msgpack_be32(d); \
msgpack_pack_append_buffer(x, buf, 5); \
} else if(d < -(1<<7)) { \
/* signed 16 */ \
unsigned char buf[3]; \
buf[0] = 0xd1; *(uint16_t*)&buf[1] = msgpack_be16(d); \
buf[0] = 0xd1; *(uint16_t*)&buf[1] = _msgpack_be16(d); \
msgpack_pack_append_buffer(x, buf, 3); \
} else { \
/* signed 8 */ \
@@ -202,12 +202,12 @@ do { \
} else if(d < (1<<16)) { \
/* unsigned 16 */ \
unsigned char buf[3]; \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = msgpack_be16(d); \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \
msgpack_pack_append_buffer(x, buf, 3); \
} else { \
/* unsigned 32 */ \
unsigned char buf[5]; \
buf[0] = 0xce; *(uint32_t*)&buf[1] = msgpack_be32(d); \
buf[0] = 0xce; *(uint32_t*)&buf[1] = _msgpack_be32(d); \
msgpack_pack_append_buffer(x, buf, 5); \
} \
} \
@@ -220,19 +220,19 @@ do { \
if(d < -(1LL<<31)) { \
/* signed 64 */ \
unsigned char buf[9]; \
buf[0] = 0xd3; *(uint64_t*)&buf[1] = msgpack_be64(d); \
buf[0] = 0xd3; *(uint64_t*)&buf[1] = _msgpack_be64(d); \
msgpack_pack_append_buffer(x, buf, 9); \
} else { \
/* signed 32 */ \
unsigned char buf[5]; \
buf[0] = 0xd2; *(uint32_t*)&buf[1] = msgpack_be32(d); \
buf[0] = 0xd2; *(uint32_t*)&buf[1] = _msgpack_be32(d); \
msgpack_pack_append_buffer(x, buf, 5); \
} \
} else { \
if(d < -(1<<7)) { \
/* signed 16 */ \
unsigned char buf[3]; \
buf[0] = 0xd1; *(uint16_t*)&buf[1] = msgpack_be16(d); \
buf[0] = 0xd1; *(uint16_t*)&buf[1] = _msgpack_be16(d); \
msgpack_pack_append_buffer(x, buf, 3); \
} else { \
/* signed 8 */ \
@@ -252,19 +252,19 @@ do { \
} else { \
/* unsigned 16 */ \
unsigned char buf[3]; \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = msgpack_be16(d); \
buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \
msgpack_pack_append_buffer(x, buf, 3); \
} \
} else { \
if(d < (1LL<<32)) { \
/* unsigned 32 */ \
unsigned char buf[5]; \
buf[0] = 0xce; *(uint32_t*)&buf[1] = msgpack_be32(d); \
buf[0] = 0xce; *(uint32_t*)&buf[1] = _msgpack_be32(d); \
msgpack_pack_append_buffer(x, buf, 5); \
} else { \
/* unsigned 64 */ \
unsigned char buf[9]; \
buf[0] = 0xcf; *(uint64_t*)&buf[1] = msgpack_be64(d); \
buf[0] = 0xcf; *(uint64_t*)&buf[1] = _msgpack_be64(d); \
msgpack_pack_append_buffer(x, buf, 9); \
} \
} \
@@ -283,21 +283,21 @@ msgpack_pack_inline_func_fastint(_uint8)(msgpack_pack_user x, uint8_t d)
msgpack_pack_inline_func_fastint(_uint16)(msgpack_pack_user x, uint16_t d)
{
unsigned char buf[3];
buf[0] = 0xcd; *(uint16_t*)&buf[1] = msgpack_be16(d);
buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d);
msgpack_pack_append_buffer(x, buf, 3);
}
msgpack_pack_inline_func_fastint(_uint32)(msgpack_pack_user x, uint32_t d)
{
unsigned char buf[5];
buf[0] = 0xce; *(uint32_t*)&buf[1] = msgpack_be32(d);
buf[0] = 0xce; *(uint32_t*)&buf[1] = _msgpack_be32(d);
msgpack_pack_append_buffer(x, buf, 5);
}
msgpack_pack_inline_func_fastint(_uint64)(msgpack_pack_user x, uint64_t d)
{
unsigned char buf[9];
buf[0] = 0xcf; *(uint64_t*)&buf[1] = msgpack_be64(d);
buf[0] = 0xcf; *(uint64_t*)&buf[1] = _msgpack_be64(d);
msgpack_pack_append_buffer(x, buf, 9);
}
@@ -310,21 +310,21 @@ msgpack_pack_inline_func_fastint(_int8)(msgpack_pack_user x, int8_t d)
msgpack_pack_inline_func_fastint(_int16)(msgpack_pack_user x, int16_t d)
{
unsigned char buf[3];
buf[0] = 0xd1; *(uint16_t*)&buf[1] = msgpack_be16(d);
buf[0] = 0xd1; *(uint16_t*)&buf[1] = _msgpack_be16(d);
msgpack_pack_append_buffer(x, buf, 3);
}
msgpack_pack_inline_func_fastint(_int32)(msgpack_pack_user x, int32_t d)
{
unsigned char buf[5];
buf[0] = 0xd2; *(uint32_t*)&buf[1] = msgpack_be32(d);
buf[0] = 0xd2; *(uint32_t*)&buf[1] = _msgpack_be32(d);
msgpack_pack_append_buffer(x, buf, 5);
}
msgpack_pack_inline_func_fastint(_int64)(msgpack_pack_user x, int64_t d)
{
unsigned char buf[9];
buf[0] = 0xd3; *(uint64_t*)&buf[1] = msgpack_be64(d);
buf[0] = 0xd3; *(uint64_t*)&buf[1] = _msgpack_be64(d);
msgpack_pack_append_buffer(x, buf, 9);
}
@@ -557,7 +557,7 @@ msgpack_pack_inline_func(_float)(msgpack_pack_user x, float d)
union { char buf[4]; uint32_t num; } f;
*((float*)&f.buf) = d; // FIXME
unsigned char buf[5];
buf[0] = 0xca; *(uint32_t*)&buf[1] = msgpack_be32(f.num);
buf[0] = 0xca; *(uint32_t*)&buf[1] = _msgpack_be32(f.num);
msgpack_pack_append_buffer(x, buf, 5);
}
@@ -566,7 +566,7 @@ msgpack_pack_inline_func(_double)(msgpack_pack_user x, double d)
union { char buf[8]; uint64_t num; } f;
*((double*)&f.buf) = d; // FIXME
unsigned char buf[9];
buf[0] = 0xcb; *(uint64_t*)&buf[1] = msgpack_be64(f.num);
buf[0] = 0xcb; *(uint64_t*)&buf[1] = _msgpack_be64(f.num);
msgpack_pack_append_buffer(x, buf, 9);
}
@@ -610,11 +610,11 @@ msgpack_pack_inline_func(_array)(msgpack_pack_user x, unsigned int n)
msgpack_pack_append_buffer(x, &d, 1);
} else if(n < 65536) {
unsigned char buf[3];
buf[0] = 0xdc; *(uint16_t*)&buf[1] = msgpack_be16(n);
buf[0] = 0xdc; *(uint16_t*)&buf[1] = _msgpack_be16(n);
msgpack_pack_append_buffer(x, buf, 3);
} else {
unsigned char buf[5];
buf[0] = 0xdd; *(uint32_t*)&buf[1] = msgpack_be32(n);
buf[0] = 0xdd; *(uint32_t*)&buf[1] = _msgpack_be32(n);
msgpack_pack_append_buffer(x, buf, 5);
}
}
@@ -631,11 +631,11 @@ msgpack_pack_inline_func(_map)(msgpack_pack_user x, unsigned int n)
msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
} else if(n < 65536) {
unsigned char buf[3];
buf[0] = 0xde; *(uint16_t*)&buf[1] = msgpack_be16(n);
buf[0] = 0xde; *(uint16_t*)&buf[1] = _msgpack_be16(n);
msgpack_pack_append_buffer(x, buf, 3);
} else {
unsigned char buf[5];
buf[0] = 0xdf; *(uint32_t*)&buf[1] = msgpack_be32(n);
buf[0] = 0xdf; *(uint32_t*)&buf[1] = _msgpack_be32(n);
msgpack_pack_append_buffer(x, buf, 5);
}
}
@@ -652,11 +652,11 @@ msgpack_pack_inline_func(_raw)(msgpack_pack_user x, size_t l)
msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
} else if(l < 65536) {
unsigned char buf[3];
buf[0] = 0xda; *(uint16_t*)&buf[1] = msgpack_be16(l);
buf[0] = 0xda; *(uint16_t*)&buf[1] = _msgpack_be16(l);
msgpack_pack_append_buffer(x, buf, 3);
} else {
unsigned char buf[5];
buf[0] = 0xdb; *(uint32_t*)&buf[1] = msgpack_be32(l);
buf[0] = 0xdb; *(uint32_t*)&buf[1] = _msgpack_be32(l);
msgpack_pack_append_buffer(x, buf, 5);
}
}

94
msgpack/sysdep.h Normal file
View File

@@ -0,0 +1,94 @@
/*
* MessagePack system dependencies
*
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MSGPACK_SYSDEP_H__
#define MSGPACK_SYSDEP_H__
#ifdef _MSC_VER
typedef __int8 int8_t;
typedef unsigned __int8 uint8_t;
typedef __int16 int16_t;
typedef unsigned __int16 uint16_t;
typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
#else
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#endif
#ifdef _WIN32
typedef long _msgpack_atomic_counter_t;
#define _msgpack_sync_decr_and_fetch(ptr) InterlockedDecrement(ptr)
#define _msgpack_sync_incr_and_fetch(ptr) InterlockedIncrement(ptr)
#else
typedef unsigned int _msgpack_atomic_counter_t;
#define _msgpack_sync_decr_and_fetch(ptr) __sync_sub_and_fetch(ptr, 1)
#define _msgpack_sync_incr_and_fetch(ptr) __sync_add_and_fetch(ptr, 1)
#endif
#ifdef _WIN32
#include <winsock2.h>
#else
#include <arpa/inet.h> /* __BYTE_ORDER */
#endif
#if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
#if __BYTE_ORDER == __LITTLE_ENDIAN
#define __LITTLE_ENDIAN__
#elif __BYTE_ORDER == __BIG_ENDIAN
#define __BIG_ENDIAN__
#endif
#endif
#ifdef __LITTLE_ENDIAN__
#define _msgpack_be16(x) ntohs(x)
#define _msgpack_be32(x) ntohl(x)
#if defined(_byteswap_uint64)
# define _msgpack_be64(x) (_byteswap_uint64(x))
#elif defined(bswap_64)
# define _msgpack_be64(x) bswap_64(x)
#elif defined(__DARWIN_OSSwapInt64)
# define _msgpack_be64(x) __DARWIN_OSSwapInt64(x)
#else
#define _msgpack_be64(x) \
( ((((uint64_t)x) << 56) & 0xff00000000000000ULL ) | \
((((uint64_t)x) << 40) & 0x00ff000000000000ULL ) | \
((((uint64_t)x) << 24) & 0x0000ff0000000000ULL ) | \
((((uint64_t)x) << 8) & 0x000000ff00000000ULL ) | \
((((uint64_t)x) >> 8) & 0x00000000ff000000ULL ) | \
((((uint64_t)x) >> 24) & 0x0000000000ff0000ULL ) | \
((((uint64_t)x) >> 40) & 0x000000000000ff00ULL ) | \
((((uint64_t)x) >> 56) & 0x00000000000000ffULL ) )
#endif
#else
#define _msgpack_be16(x) (x)
#define _msgpack_be32(x) (x)
#define _msgpack_be64(x) (x)
#endif
#endif /* msgpack/sysdep.h */

View File

@@ -18,7 +18,7 @@
#ifndef MSGPACK_UNPACK_DEFINE_H__
#define MSGPACK_UNPACK_DEFINE_H__
#include "msgpack/sys.h"
#include "msgpack/sysdep.h"
#include <string.h>
#include <assert.h>
#include <stdio.h>

View File

@@ -131,9 +131,9 @@ msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const c
((unsigned int)*p & 0x1f)
#define PTR_CAST_8(ptr) (*(uint8_t*)ptr)
#define PTR_CAST_16(ptr) msgpack_be16(*(uint16_t*)ptr)
#define PTR_CAST_32(ptr) msgpack_be32(*(uint32_t*)ptr)
#define PTR_CAST_64(ptr) msgpack_be64(*(uint64_t*)ptr)
#define PTR_CAST_16(ptr) _msgpack_be16(*(uint16_t*)ptr)
#define PTR_CAST_32(ptr) _msgpack_be32(*(uint32_t*)ptr)
#define PTR_CAST_64(ptr) _msgpack_be64(*(uint64_t*)ptr)
#ifdef USE_CASE_RANGE
#define SWITCH_RANGE_BEGIN switch(*p) {