summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2015-03-20 01:07:59 -0400
committerMark Benvenuto <mark.benvenuto@mongodb.com>2015-03-25 13:50:13 -0400
commit17bd2356a5b17893e626749be399fb8fda23db1e (patch)
treed7f7ef0425ba516fc617ba6715fb6a06ea2f2a93
parenta09b0ab2e97a839832e0174871f18353a3303ba3 (diff)
downloadmongo-17bd2356a5b17893e626749be399fb8fda23db1e.tar.gz
Use beginthreadex, and ensure we use the correct C calling conventions in all callbacks
-rw-r--r--SConstruct8
-rw-r--r--dist/s_string.ok1
-rw-r--r--src/async/async_worker.c7
-rw-r--r--src/btree/bt_slvg.c17
-rw-r--r--src/config/config_collapse.c2
-rw-r--r--src/conn/conn_cache_pool.c4
-rw-r--r--src/conn/conn_ckpt.c4
-rw-r--r--src/conn/conn_log.c14
-rw-r--r--src/conn/conn_stat.c4
-rw-r--r--src/conn/conn_sweep.c4
-rw-r--r--src/evict/evict_lru.c16
-rw-r--r--src/include/extern.h8
-rw-r--r--src/include/os_windows.h14
-rw-r--r--src/include/posix.h12
-rw-r--r--src/lsm/lsm_manager.c6
-rw-r--r--src/lsm/lsm_worker.c6
-rw-r--r--src/meta/meta_ckpt.c2
-rw-r--r--src/os_posix/os_thread.c2
-rw-r--r--src/os_win/os_fallocate.c2
-rw-r--r--src/os_win/os_mtx_cond.c4
-rw-r--r--src/os_win/os_once.c2
-rw-r--r--src/os_win/os_thread.c8
-rw-r--r--src/os_win/os_time.c4
-rw-r--r--src/support/huffman.c8
-rw-r--r--src/txn/txn.c2
-rw-r--r--test/mciproject.yml16
-rw-r--r--test/windows/windows_shim.c7
27 files changed, 122 insertions, 62 deletions
diff --git a/SConstruct b/SConstruct
index 5c4b90992f2..8e9fae28ac6 100644
--- a/SConstruct
+++ b/SConstruct
@@ -68,7 +68,11 @@ var.Add('CFLAGS', 'C Compiler Flags', [
"/wd4090", # Ignore warning about mismatched const qualifiers
"/wd4996", # Ignore deprecated functions
"/W3", # Warning level 3
+ #"/we4244", # Possible loss of data
"/we4013", # Error on undefined functions
+ #"/we4047", # Indirection differences in types
+ #"/we4024", # Differences in parameter types
+ #"/we4100", # Unreferenced local parameter
"/TC", # Compile as C code
#"/Od", # Disable optimization
"/Ob1", # inline expansion
@@ -76,7 +80,7 @@ var.Add('CFLAGS', 'C Compiler Flags', [
"/GF", # enable string pooling
"/EHsc", # extern "C" does not throw
#"/RTC1", # enable stack checks
- "/GS", # enable secrutiy checks
+ "/GS", # enable security checks
"/Gy", # separate functions for linker
"/Zc:wchar_t",
"/Gd",
@@ -97,6 +101,8 @@ var.Add('TOOLS', 'SCons tools', [
"textfile"
])
+var.Add('SWIG', 'SWIG binary location', swig_binary)
+
env = Environment(
variables = var
)
diff --git a/dist/s_string.ok b/dist/s_string.ok
index 8589f50fd21..587cef16c51 100644
--- a/dist/s_string.ok
+++ b/dist/s_string.ok
@@ -423,6 +423,7 @@ autoheader
bInheritHandle
basecfg
bdb
+beginthreadex
bigram
bitcnt
bitfield
diff --git a/src/async/async_worker.c b/src/async/async_worker.c
index ec68598b8c8..fed917f253a 100644
--- a/src/async/async_worker.c
+++ b/src/async/async_worker.c
@@ -75,7 +75,8 @@ retry:
*/
my_slot = my_consume % async->async_qsize;
prev_slot = last_consume % async->async_qsize;
- *op = WT_ATOMIC_STORE8(async->async_queue[my_slot], NULL);
+ *op = (WT_ASYNC_OP_IMPL*)WT_ATOMIC_STORE8(
+ async->async_queue[my_slot], NULL);
WT_ASSERT(session, async->cur_queue > 0);
WT_ASSERT(session, *op != NULL);
@@ -281,7 +282,7 @@ __async_worker_op(WT_SESSION_IMPL *session, WT_ASYNC_OP_IMPL *op,
* __async_worker --
* The async worker threads.
*/
-void *
+WT_THREAD_RET /* Quiet style.py */
__wt_async_worker(void *arg)
{
WT_ASYNC *async;
@@ -354,5 +355,5 @@ err: WT_PANIC_MSG(session, ret, "async worker error");
__wt_free(session, ac);
ac = acnext;
}
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
diff --git a/src/btree/bt_slvg.c b/src/btree/bt_slvg.c
index 6f0d4946aa5..ba1802116d0 100644
--- a/src/btree/bt_slvg.c
+++ b/src/btree/bt_slvg.c
@@ -124,7 +124,7 @@ static int __slvg_col_range_overlap(
WT_SESSION_IMPL *, uint32_t, uint32_t, WT_STUFF *);
static void __slvg_col_trk_update_start(uint32_t, WT_STUFF *);
static int __slvg_merge_block_free(WT_SESSION_IMPL *, WT_STUFF *);
-static int __slvg_ovfl_compare(const void *, const void *);
+static int WT_CDECL __slvg_ovfl_compare(const void *, const void *);
static int __slvg_ovfl_discard(WT_SESSION_IMPL *, WT_STUFF *);
static int __slvg_ovfl_reconcile(WT_SESSION_IMPL *, WT_STUFF *);
static int __slvg_ovfl_ref(WT_SESSION_IMPL *, WT_TRACK *, int);
@@ -140,9 +140,9 @@ static int __slvg_row_range_overlap(
WT_SESSION_IMPL *, uint32_t, uint32_t, WT_STUFF *);
static int __slvg_row_trk_update_start(
WT_SESSION_IMPL *, WT_ITEM *, uint32_t, WT_STUFF *);
-static int __slvg_trk_compare_addr(const void *, const void *);
-static int __slvg_trk_compare_gen(const void *, const void *);
-static int __slvg_trk_compare_key(const void *, const void *);
+static int WT_CDECL __slvg_trk_compare_addr(const void *, const void *);
+static int WT_CDECL __slvg_trk_compare_gen(const void *, const void *);
+static int WT_CDECL __slvg_trk_compare_key(const void *, const void *);
static int __slvg_trk_free(WT_SESSION_IMPL *, WT_TRACK **, int);
static void __slvg_trk_free_addr(WT_SESSION_IMPL *, WT_TRACK *);
static int __slvg_trk_init(WT_SESSION_IMPL *, uint8_t *,
@@ -2098,7 +2098,7 @@ __slvg_row_ovfl(WT_SESSION_IMPL *session,
* __slvg_trk_compare_addr --
* Compare two WT_TRACK array entries by address cookie.
*/
-static int
+static int WT_CDECL
__slvg_trk_compare_addr(const void *a, const void *b)
{
WT_DECL_RET;
@@ -2124,7 +2124,7 @@ __slvg_trk_compare_addr(const void *a, const void *b)
* __slvg_ovfl_compare --
* Bsearch comparison routine for the overflow array.
*/
-static int
+static int WT_CDECL
__slvg_ovfl_compare(const void *a, const void *b)
{
WT_ADDR *addr;
@@ -2163,6 +2163,7 @@ __slvg_ovfl_reconcile(WT_SESSION_IMPL *session, WT_STUFF *ss)
* with the lowest LSNs until overflow pages are only referenced once.
*
* This requires sorting the page list by LSN, and the overflow array
+
* by address cookie.
*/
qsort(ss->pages,
@@ -2246,7 +2247,7 @@ err: __wt_free(session, slot);
* __slvg_trk_compare_key --
* Compare two WT_TRACK array entries by key, and secondarily, by LSN.
*/
-static int
+static int WT_CDECL
__slvg_trk_compare_key(const void *a, const void *b)
{
WT_SESSION_IMPL *session;
@@ -2303,7 +2304,7 @@ __slvg_trk_compare_key(const void *a, const void *b)
* __slvg_trk_compare_gen --
* Compare two WT_TRACK array entries by LSN.
*/
-static int
+static int WT_CDECL
__slvg_trk_compare_gen(const void *a, const void *b)
{
WT_TRACK *a_trk, *b_trk;
diff --git a/src/config/config_collapse.c b/src/config/config_collapse.c
index f54e4fc2074..23cb03c9b3a 100644
--- a/src/config/config_collapse.c
+++ b/src/config/config_collapse.c
@@ -314,7 +314,7 @@ err: __wt_scr_free(session, &build);
* __config_merge_cmp --
* Qsort function: sort the config merge array.
*/
-static int
+static int WT_CDECL
__config_merge_cmp(const void *a, const void *b)
{
WT_CONFIG_MERGE_ENTRY *ae, *be;
diff --git a/src/conn/conn_cache_pool.c b/src/conn/conn_cache_pool.c
index 7bf090496a8..488864ce351 100644
--- a/src/conn/conn_cache_pool.c
+++ b/src/conn/conn_cache_pool.c
@@ -596,7 +596,7 @@ __cache_pool_adjust(WT_SESSION_IMPL *session,
* __wt_cache_pool_server --
* Thread to manage cache pool among connections.
*/
-void *
+WT_THREAD_RET
__wt_cache_pool_server(void *arg)
{
WT_CACHE *cache;
@@ -642,5 +642,5 @@ __wt_cache_pool_server(void *arg)
if (0) {
err: WT_PANIC_MSG(session, ret, "cache pool manager server error");
}
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
diff --git a/src/conn/conn_ckpt.c b/src/conn/conn_ckpt.c
index 503c22110f9..74f27d8bd18 100644
--- a/src/conn/conn_ckpt.c
+++ b/src/conn/conn_ckpt.c
@@ -69,7 +69,7 @@ err: __wt_scr_free(session, &tmp);
* __ckpt_server --
* The checkpoint server thread.
*/
-static void *
+static WT_THREAD_RET
__ckpt_server(void *arg)
{
WT_CONNECTION_IMPL *conn;
@@ -112,7 +112,7 @@ __ckpt_server(void *arg)
if (0) {
err: WT_PANIC_MSG(session, ret, "checkpoint server error");
}
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
/*
diff --git a/src/conn/conn_log.c b/src/conn/conn_log.c
index 4b995114b09..a6d53134ec2 100644
--- a/src/conn/conn_log.c
+++ b/src/conn/conn_log.c
@@ -273,7 +273,7 @@ err:
* __log_close_server --
* The log close server thread.
*/
-static void *
+static WT_THREAD_RET
__log_close_server(void *arg)
{
WT_CONNECTION_IMPL *conn;
@@ -332,7 +332,7 @@ err: __wt_err(session, ret, "log close server error");
}
if (locked)
__wt_spin_unlock(session, &log->log_sync_lock);
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
/*
@@ -347,7 +347,7 @@ typedef struct {
* __log_wrlsn_cmp --
* The log wrlsn comparison function for qsort.
*/
-static int
+static int WT_CDECL
__log_wrlsn_cmp(const void *a, const void *b)
{
WT_LOG_WRLSN_ENTRY *ae, *be;
@@ -361,7 +361,7 @@ __log_wrlsn_cmp(const void *a, const void *b)
* __log_wrlsn_server --
* The log wrlsn server thread.
*/
-static void *
+static WT_THREAD_RET
__log_wrlsn_server(void *arg)
{
WT_CONNECTION_IMPL *conn;
@@ -450,14 +450,14 @@ __log_wrlsn_server(void *arg)
if (0)
err: __wt_err(session, ret, "log wrlsn server error");
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
/*
* __log_server --
* The log server thread.
*/
-static void *
+static WT_THREAD_RET
__log_server(void *arg)
{
WT_CONNECTION_IMPL *conn;
@@ -502,7 +502,7 @@ err: __wt_err(session, ret, "log server error");
}
if (locked)
(void)__wt_writeunlock(session, log->log_archive_lock);
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
/*
diff --git a/src/conn/conn_stat.c b/src/conn/conn_stat.c
index 83c8d539662..0d008939d8c 100644
--- a/src/conn/conn_stat.c
+++ b/src/conn/conn_stat.c
@@ -380,7 +380,7 @@ err: __wt_scr_free(session, &tmp);
* __statlog_server --
* The statistics server thread.
*/
-static void *
+static WT_THREAD_RET
__statlog_server(void *arg)
{
WT_CONNECTION_IMPL *conn;
@@ -419,7 +419,7 @@ err: WT_PANIC_MSG(session, ret, "statistics log server error");
}
__wt_buf_free(session, &path);
__wt_buf_free(session, &tmp);
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
/*
diff --git a/src/conn/conn_sweep.c b/src/conn/conn_sweep.c
index 0e6b4b61c93..2a862758e08 100644
--- a/src/conn/conn_sweep.c
+++ b/src/conn/conn_sweep.c
@@ -132,7 +132,7 @@ __sweep(WT_SESSION_IMPL *session)
* __sweep_server --
* The handle sweep server thread.
*/
-static void *
+static WT_THREAD_RET
__sweep_server(void *arg)
{
WT_CONNECTION_IMPL *conn;
@@ -158,7 +158,7 @@ __sweep_server(void *arg)
if (0) {
err: WT_PANIC_MSG(session, ret, "handle sweep server error");
}
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
/*
diff --git a/src/evict/evict_lru.c b/src/evict/evict_lru.c
index 2ebd699c579..482bf3c9f59 100644
--- a/src/evict/evict_lru.c
+++ b/src/evict/evict_lru.c
@@ -10,13 +10,13 @@
static int __evict_clear_walks(WT_SESSION_IMPL *);
static int __evict_has_work(WT_SESSION_IMPL *, uint32_t *);
-static int __evict_lru_cmp(const void *, const void *);
+static int WT_CDECL __evict_lru_cmp(const void *, const void *);
static int __evict_lru_pages(WT_SESSION_IMPL *, int);
static int __evict_lru_walk(WT_SESSION_IMPL *, uint32_t);
static int __evict_pass(WT_SESSION_IMPL *);
static int __evict_walk(WT_SESSION_IMPL *, uint32_t);
static int __evict_walk_file(WT_SESSION_IMPL *, u_int *, uint32_t);
-static void *__evict_worker(void *);
+static WT_THREAD_RET __evict_worker(void *);
static int __evict_server_work(WT_SESSION_IMPL *);
/*
@@ -54,7 +54,7 @@ __evict_read_gen(const WT_EVICT_ENTRY *entry)
* __evict_lru_cmp --
* Qsort function: sort the eviction array.
*/
-static int
+static int WT_CDECL
__evict_lru_cmp(const void *a, const void *b)
{
uint64_t a_lru, b_lru;
@@ -94,7 +94,7 @@ __wt_evict_list_clear_page(WT_SESSION_IMPL *session, WT_REF *ref)
WT_EVICT_ENTRY *evict;
uint32_t i, elem;
- WT_ASSERT(session,
+ WT_ASSERT(session,
__wt_ref_is_root(ref) || ref->state == WT_REF_LOCKED);
/* Fast path: if the page isn't on the queue, don't bother searching. */
@@ -150,7 +150,7 @@ __wt_evict_server_wake(WT_SESSION_IMPL *session)
* __evict_server --
* Thread to evict pages from the cache.
*/
-static void *
+static WT_THREAD_RET
__evict_server(void *arg)
{
WT_CACHE *cache;
@@ -232,7 +232,7 @@ __evict_server(void *arg)
if (0) {
err: WT_PANIC_MSG(session, ret, "cache eviction server error");
}
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
/*
@@ -384,7 +384,7 @@ __wt_evict_destroy(WT_SESSION_IMPL *session)
* __evict_worker --
* Thread to help evict pages from the cache.
*/
-static void *
+static WT_THREAD_RET
__evict_worker(void *arg)
{
WT_CACHE *cache;
@@ -413,7 +413,7 @@ __evict_worker(void *arg)
if (0) {
err: WT_PANIC_MSG(session, ret, "cache eviction worker error");
}
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
/*
diff --git a/src/include/extern.h b/src/include/extern.h
index fe717f47853..f8ea5eca6e9 100644
--- a/src/include/extern.h
+++ b/src/include/extern.h
@@ -8,7 +8,7 @@ extern int __wt_async_flush(WT_SESSION_IMPL *session);
extern int __wt_async_new_op(WT_SESSION_IMPL *session, const char *uri, const char *config, const char *cfg[], WT_ASYNC_CALLBACK *cb, WT_ASYNC_OP_IMPL **opp);
extern int __wt_async_op_enqueue(WT_SESSION_IMPL *session, WT_ASYNC_OP_IMPL *op);
extern int __wt_async_op_init(WT_SESSION_IMPL *session);
-extern void *__wt_async_worker(void *arg);
+extern WT_THREAD_RET /*Quiet style.py */ __wt_async_worker(void *arg);
extern int __wt_block_addr_to_buffer(WT_BLOCK *block, uint8_t **pp, wt_off_t offset, uint32_t size, uint32_t cksum);
extern int __wt_block_buffer_to_addr(WT_BLOCK *block, const uint8_t *p, wt_off_t *offsetp, uint32_t *sizep, uint32_t *cksump);
extern int __wt_block_addr_valid(WT_SESSION_IMPL *session, WT_BLOCK *block, const uint8_t *addr, size_t addr_size, int live);
@@ -220,7 +220,7 @@ extern int __wt_cache_destroy(WT_SESSION_IMPL *session);
extern int __wt_cache_pool_config(WT_SESSION_IMPL *session, const char **cfg);
extern int __wt_conn_cache_pool_open(WT_SESSION_IMPL *session);
extern int __wt_conn_cache_pool_destroy(WT_SESSION_IMPL *session);
-extern void *__wt_cache_pool_server(void *arg);
+extern WT_THREAD_RET __wt_cache_pool_server(void *arg);
extern int __wt_checkpoint_server_create(WT_SESSION_IMPL *session, const char *cfg[]);
extern int __wt_checkpoint_server_destroy(WT_SESSION_IMPL *session);
extern int __wt_checkpoint_signal(WT_SESSION_IMPL *session, wt_off_t logsize);
@@ -496,7 +496,7 @@ extern int __wt_fprintf(WT_SESSION_IMPL *session, FILE *fp, const char *fmt, ...
extern int __wt_fflush(WT_SESSION_IMPL *session, FILE *fp);
extern int __wt_fclose(WT_SESSION_IMPL *session, FILE **fpp, WT_FHANDLE_MODE mode_flag);
extern uint64_t __wt_strtouq(const char *nptr, char **endptr, int base);
-extern int __wt_thread_create(WT_SESSION_IMPL *session, wt_thread_t *tidret, void *(*func)(void *), void *arg);
+extern int __wt_thread_create(WT_SESSION_IMPL *session, wt_thread_t *tidret, WT_THREAD_CALLBACK(*func)(void *), void *arg);
extern int __wt_thread_join(WT_SESSION_IMPL *session, wt_thread_t tid);
extern void __wt_thread_id(char *buf, size_t buflen);
extern int __wt_seconds(WT_SESSION_IMPL *session, time_t *timep);
@@ -654,7 +654,7 @@ extern void __wt_stat_refresh_dsrc_stats(void *stats_arg);
extern void __wt_stat_aggregate_dsrc_stats(const void *child, const void *parent);
extern void __wt_stat_init_connection_stats(WT_CONNECTION_STATS *stats);
extern void __wt_stat_refresh_connection_stats(void *stats_arg);
-extern int __wt_txnid_cmp(const void *v1, const void *v2);
+extern int WT_CDECL __wt_txnid_cmp(const void *v1, const void *v2);
extern void __wt_txn_release_snapshot(WT_SESSION_IMPL *session);
extern void __wt_txn_update_oldest(WT_SESSION_IMPL *session);
extern void __wt_txn_refresh(WT_SESSION_IMPL *session, int get_snapshot);
diff --git a/src/include/os_windows.h b/src/include/os_windows.h
index a9c1cf5f65a..49cf4d2a126 100644
--- a/src/include/os_windows.h
+++ b/src/include/os_windows.h
@@ -14,6 +14,18 @@ typedef CONDITION_VARIABLE wt_cond_t;
typedef CRITICAL_SECTION wt_mutex_t;
typedef HANDLE wt_thread_t;
+/*
+ * Thread callbacks need to match the return signature of _beginthreadex.
+ */
+#define WT_THREAD_CALLBACK(x) unsigned (__stdcall x)
+#define WT_THREAD_RET unsigned __stdcall
+#define WT_THREAD_RET_VALUE 0
+
+/*
+ * WT declaration for calling convention type
+ */
+#define WT_CDECL __cdecl
+
#if _MSC_VER < 1900
/* Timespec is a POSIX structure not defined in Windows */
struct timespec {
@@ -29,7 +41,7 @@ struct timespec {
*/
typedef uint32_t u_int;
typedef unsigned char u_char;
-typedef unsigned long u_long;
+typedef uint64_t u_long;
/* <= VS 2013 is not C99 compat */
#if _MSC_VER < 1900
diff --git a/src/include/posix.h b/src/include/posix.h
index 14249e3ed37..1aa629c98e7 100644
--- a/src/include/posix.h
+++ b/src/include/posix.h
@@ -26,3 +26,15 @@
typedef pthread_cond_t wt_cond_t;
typedef pthread_mutex_t wt_mutex_t;
typedef pthread_t wt_thread_t;
+
+/*
+ * Thread callbacks need to match the platform specific callback types
+ */
+#define WT_THREAD_CALLBACK(x) void* (x)
+#define WT_THREAD_RET void*
+#define WT_THREAD_RET_VALUE NULL
+
+/*
+ * WT declaration for calling convention type
+ */
+#define WT_CDECL
diff --git a/src/lsm/lsm_manager.c b/src/lsm/lsm_manager.c
index 75d3e8ef6e8..12b24984fcb 100644
--- a/src/lsm/lsm_manager.c
+++ b/src/lsm/lsm_manager.c
@@ -11,7 +11,7 @@
static int __lsm_manager_aggressive_update(WT_SESSION_IMPL *, WT_LSM_TREE *);
static int __lsm_manager_run_server(WT_SESSION_IMPL *);
-static void * __lsm_worker_manager(void *);
+static WT_THREAD_RET __lsm_worker_manager(void *);
/*
* __wt_lsm_manager_config --
@@ -500,7 +500,7 @@ err: if (dhandle_locked) {
* A thread that manages all open LSM trees, and the shared LSM worker
* threads.
*/
-static void *
+static WT_THREAD_RET
__lsm_worker_manager(void *arg)
{
WT_DECL_RET;
@@ -518,7 +518,7 @@ __lsm_worker_manager(void *arg)
err: WT_PANIC_MSG(session, ret, "LSM worker manager thread error");
}
F_CLR(S2C(session), WT_CONN_SERVER_LSM);
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
/*
diff --git a/src/lsm/lsm_worker.c b/src/lsm/lsm_worker.c
index a376a81f4eb..d1272df763d 100644
--- a/src/lsm/lsm_worker.c
+++ b/src/lsm/lsm_worker.c
@@ -10,7 +10,7 @@
static int __lsm_worker_general_op(
WT_SESSION_IMPL *, WT_LSM_WORKER_ARGS *, int *);
-static void * __lsm_worker(void *);
+static WT_THREAD_RET __lsm_worker(void *);
/*
* __wt_lsm_worker_start --
@@ -82,7 +82,7 @@ err: __wt_lsm_manager_free_work_unit(session, entry);
* __lsm_worker --
* A thread that executes work units for all open LSM trees.
*/
-static void *
+static WT_THREAD_RET
__lsm_worker(void *arg)
{
WT_CONNECTION_IMPL *conn;
@@ -166,5 +166,5 @@ err: __wt_lsm_manager_free_work_unit(session, entry);
WT_PANIC_MSG(session, ret,
"Error in LSM worker thread %d", cookie->id);
}
- return (NULL);
+ return (WT_THREAD_RET_VALUE);
}
diff --git a/src/meta/meta_ckpt.c b/src/meta/meta_ckpt.c
index 0a8557c7a33..70c9bf8dfcd 100644
--- a/src/meta/meta_ckpt.c
+++ b/src/meta/meta_ckpt.c
@@ -230,7 +230,7 @@ err: __wt_free(session, namep);
* __ckpt_compare_order --
* Qsort comparison routine for the checkpoint list.
*/
-static int
+static int WT_CDECL
__ckpt_compare_order(const void *a, const void *b)
{
WT_CKPT *ackpt, *bckpt;
diff --git a/src/os_posix/os_thread.c b/src/os_posix/os_thread.c
index 392f997f1ac..c70a04c8df7 100644
--- a/src/os_posix/os_thread.c
+++ b/src/os_posix/os_thread.c
@@ -14,7 +14,7 @@
*/
int
__wt_thread_create(WT_SESSION_IMPL *session,
- wt_thread_t *tidret, void *(*func)(void *), void *arg)
+ wt_thread_t *tidret, WT_THREAD_CALLBACK(*func)(void *), void *arg)
{
WT_DECL_RET;
diff --git a/src/os_win/os_fallocate.c b/src/os_win/os_fallocate.c
index 9d0a86882c6..f01ef0e101a 100644
--- a/src/os_win/os_fallocate.c
+++ b/src/os_win/os_fallocate.c
@@ -15,6 +15,8 @@
void
__wt_fallocate_config(WT_SESSION_IMPL *session, WT_FH *fh)
{
+ WT_UNUSED(session);
+
fh->fallocate_available = WT_FALLOCATE_AVAILABLE;
/*
diff --git a/src/os_win/os_mtx_cond.c b/src/os_win/os_mtx_cond.c
index a09b744720f..51f6d6533c8 100644
--- a/src/os_win/os_mtx_cond.c
+++ b/src/os_win/os_mtx_cond.c
@@ -46,7 +46,7 @@ __wt_cond_wait(WT_SESSION_IMPL *session, WT_CONDVAR *cond, uint64_t usecs)
DWORD milliseconds;
WT_DECL_RET;
uint64_t milliseconds64;
- int lasterror, locked;
+ int locked;
locked = 0;
@@ -76,7 +76,7 @@ __wt_cond_wait(WT_SESSION_IMPL *session, WT_CONDVAR *cond, uint64_t usecs)
*/
if (milliseconds64 >= INFINITE)
milliseconds64 = INFINITE - 1;
- milliseconds = milliseconds64;
+ milliseconds = (DWORD)milliseconds64;
/*
* 0 would mean the CV sleep becomes a TryCV which we do not
diff --git a/src/os_win/os_once.c b/src/os_win/os_once.c
index 179c1bc97f7..bec8c08777c 100644
--- a/src/os_win/os_once.c
+++ b/src/os_win/os_once.c
@@ -19,6 +19,8 @@ BOOL CALLBACK _wt_init_once_callback(
)
{
void(*init_routine)(void) = Parameter;
+ WT_UNUSED(InitOnce);
+ WT_UNUSED(Context);
init_routine();
diff --git a/src/os_win/os_thread.c b/src/os_win/os_thread.c
index 05f7dc15914..b5f13aea4e9 100644
--- a/src/os_win/os_thread.c
+++ b/src/os_win/os_thread.c
@@ -14,14 +14,14 @@
*/
int
__wt_thread_create(WT_SESSION_IMPL *session,
- wt_thread_t *tidret, void *(*func)(void *), void *arg)
+ wt_thread_t *tidret, WT_THREAD_CALLBACK(*func)(void *), void *arg)
{
/* Spawn a new thread of control. */
- *tidret = CreateThread(NULL, 0, func, arg, 0, NULL);
- if (*tidret != NULL)
+ *tidret = (HANDLE)_beginthreadex(NULL, 0, func, arg, 0, NULL);
+ if (*tidret != 0)
return (0);
- WT_RET_MSG(session, __wt_errno(), "CreateThread");
+ WT_RET_MSG(session, errno, "_beginthreadex");
}
/*
diff --git a/src/os_win/os_time.c b/src/os_win/os_time.c
index 30fde045c54..c51db118ce1 100644
--- a/src/os_win/os_time.c
+++ b/src/os_win/os_time.c
@@ -32,8 +32,10 @@ int
__wt_epoch(WT_SESSION_IMPL *session, struct timespec *tsp)
{
uint64_t ns100;
-
FILETIME time;
+
+ WT_UNUSED(session);
+
GetSystemTimeAsFileTime(&time);
ns100 = (((int64_t)time.dwHighDateTime << 32) + time.dwLowDateTime)
diff --git a/src/support/huffman.c b/src/support/huffman.c
index 12f98184b5c..48361551ba1 100644
--- a/src/support/huffman.c
+++ b/src/support/huffman.c
@@ -96,8 +96,8 @@ typedef struct __indexed_byte {
uint32_t frequency;
} INDEXED_SYMBOL;
-static int indexed_freq_compare(const void *, const void *);
-static int indexed_symbol_compare(const void *, const void *);
+static int WT_CDECL indexed_freq_compare(const void *, const void *);
+static int WT_CDECL indexed_symbol_compare(const void *, const void *);
static void make_table(
WT_SESSION_IMPL *, uint8_t *, uint16_t, WT_HUFFMAN_CODE *, u_int);
static void node_queue_close(WT_SESSION_IMPL *, NODE_QUEUE *);
@@ -117,7 +117,7 @@ static void set_codes(WT_FREQTREE_NODE *, WT_HUFFMAN_CODE *, uint16_t, uint8_t);
* indexed_symbol_compare --
* Qsort comparator to order the table by symbol, lowest to highest.
*/
-static int
+static int WT_CDECL
indexed_symbol_compare(const void *a, const void *b)
{
return (((INDEXED_SYMBOL *)a)->symbol >
@@ -131,7 +131,7 @@ indexed_symbol_compare(const void *a, const void *b)
* Qsort comparator to order the table by frequency (the most frequent
* symbols will be at the end of the array).
*/
-static int
+static int WT_CDECL
indexed_freq_compare(const void *a, const void *b)
{
return (((INDEXED_SYMBOL *)a)->frequency >
diff --git a/src/txn/txn.c b/src/txn/txn.c
index 6c06a0af820..a1bec569ce7 100644
--- a/src/txn/txn.c
+++ b/src/txn/txn.c
@@ -12,7 +12,7 @@
* __wt_txnid_cmp --
* Compare transaction IDs for sorting / searching.
*/
-int
+int WT_CDECL
__wt_txnid_cmp(const void *v1, const void *v2)
{
uint64_t id1, id2;
diff --git a/test/mciproject.yml b/test/mciproject.yml
index d7f66212b2a..64007bdbd92 100644
--- a/test/mciproject.yml
+++ b/test/mciproject.yml
@@ -57,6 +57,21 @@ tasks:
${test_env_vars|} python ./test/suite/run.py -v 2
+ - name: compile-windows-alt
+ commands:
+ - func: "fetch source"
+ - command: git.apply_patch
+ params:
+ directory: wiredtiger
+ - command: shell.exec
+ params:
+ working_dir: "wiredtiger"
+ script: |
+ set -o errexit
+ set -o verbose
+
+ scons.bat ${smp_command|} "CFLAGS=/Gv /wd4090 /wd4996 /we4047 /we4024 /TC /we4100" wiredtiger.dll libwiredtiger.lib
+
buildvariants:
- name: ubuntu1404
display_name: Ubuntu 14.04
@@ -89,6 +104,7 @@ buildvariants:
smp_command: -j$(grep -c ^processor /proc/cpuinfo)
tasks:
- name: compile-windows
+ - name: compile-windows-alt
- name: osx-108
display_name: OS X 10.8
diff --git a/test/windows/windows_shim.c b/test/windows/windows_shim.c
index 646ebf0c441..8b0f05bfe2d 100644
--- a/test/windows/windows_shim.c
+++ b/test/windows/windows_shim.c
@@ -59,6 +59,7 @@ usleep(useconds_t useconds)
int
pthread_rwlock_destroy(pthread_rwlock_t *lock)
{
+ lock = lock;
return (0);
}
@@ -66,6 +67,7 @@ int
pthread_rwlock_init(pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *ignored)
{
+ ignored = ignored;
InitializeSRWLock(&rwlock->rwlock);
rwlock->exclusive_locked = 0;
@@ -99,13 +101,15 @@ pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
rwlock->exclusive_locked = GetCurrentThreadId();
return (0);
-
}
+#pragma warning( once : 4024 )
+#pragma warning( once : 4047 )
int
pthread_create(pthread_t *tidret, const pthread_attr_t *ignored,
void *(*func)(void *), void * arg)
{
+ ignored = ignored;
*tidret = CreateThread(NULL, 0, func, arg, 0, NULL);
if (*tidret != NULL)
@@ -117,6 +121,7 @@ pthread_create(pthread_t *tidret, const pthread_attr_t *ignored,
int
pthread_join(pthread_t thread, void **ignored)
{
+ ignored = ignored;
WaitForSingleObject(thread, INFINITE);
return (0);
}