Skip to content

Commit 0c3c81b

Browse files
Apply __cdecl to all exported callbacks (#1966)
Resolves CDRIVER-2737 and CDRIVER-5678. Add `BSON_CALL` to public callbacks to support consumers building with non-cdecl calling convention. libmongoc and libbson are expected to only be built with cdecl. --------- Co-authored-by: Ezra Chung <[email protected]>
1 parent 845e1de commit 0c3c81b

File tree

13 files changed

+101
-97
lines changed

13 files changed

+101
-97
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Unreleased (2.0.0)
4343
* Old behavior: `authMechanismProperties=A:B,C:D:E,F:G` is parsed as `{'A': 'B', 'C': 'D:E,F:G'}`.
4444
* New behavior: `authMechanismProperties=A:B,C:D:E,F:G` is parsed as `{'A': 'B': 'C': 'D:E', 'F': 'G'}`.
4545
* Calling `mongoc_bulk_operation_execute` on the same `mongoc_bulk_operation_t` repeatedly is an error. Previously this was only discouraged in documentation.
46+
* Consistently apply `__cdecl` calling convention to function declarations in public API. Intended to support consumers building their code using a different [default calling convention](https://learn.microsoft.com/en-us/cpp/build/reference/gd-gr-gv-gz-calling-convention) with MSVC. The mongoc and bson libraries only support being built with the `__cdecl` default calling convention.
4647

4748
## Removals
4849

src/libbson/src/bson/bson-json.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ bson_json_opts_destroy (bson_json_opts_t *opts);
6464
BSON_EXPORT (void)
6565
bson_json_opts_set_outermost_array (bson_json_opts_t *opts, bool is_outermost_array);
6666

67-
typedef ssize_t (*bson_json_reader_cb) (void *handle, uint8_t *buf, size_t count);
68-
typedef void (*bson_json_destroy_cb) (void *handle);
67+
typedef ssize_t (BSON_CALL *bson_json_reader_cb) (void *handle, uint8_t *buf, size_t count);
68+
typedef void (BSON_CALL *bson_json_destroy_cb) (void *handle);
6969

7070

7171
BSON_EXPORT (bson_json_reader_t *)

src/libbson/src/bson/bson-memory.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@
2828
BSON_BEGIN_DECLS
2929

3030

31-
typedef void *(*bson_realloc_func) (void *mem, size_t num_bytes, void *ctx);
31+
typedef void *(BSON_CALL *bson_realloc_func) (void *mem, size_t num_bytes, void *ctx);
3232

3333

3434
typedef struct _bson_mem_vtable_t {
35-
void *(*malloc) (size_t num_bytes);
36-
void *(*calloc) (size_t n_members, size_t num_bytes);
37-
void *(*realloc) (void *mem, size_t num_bytes);
38-
void (*free) (void *mem);
39-
void *(*aligned_alloc) (size_t alignment, size_t num_bytes);
35+
void *(BSON_CALL *malloc) (size_t num_bytes);
36+
void *(BSON_CALL *calloc) (size_t n_members, size_t num_bytes);
37+
void *(BSON_CALL *realloc) (void *mem, size_t num_bytes);
38+
void (BSON_CALL *free) (void *mem);
39+
void *(BSON_CALL *aligned_alloc) (size_t alignment, size_t num_bytes);
4040
void *padding[3];
4141
} bson_mem_vtable_t;
4242

src/libbson/src/bson/bson-reader.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ BSON_BEGIN_DECLS
5959
*--------------------------------------------------------------------------
6060
*/
6161

62-
typedef ssize_t (*bson_reader_read_func_t) (void *handle, /* IN */
63-
void *buf, /* IN */
64-
size_t count); /* IN */
62+
typedef ssize_t (BSON_CALL *bson_reader_read_func_t) (void *handle, /* IN */
63+
void *buf, /* IN */
64+
size_t count); /* IN */
6565

6666

6767
/*
@@ -84,7 +84,7 @@ typedef ssize_t (*bson_reader_read_func_t) (void *handle, /* IN */
8484
*--------------------------------------------------------------------------
8585
*/
8686

87-
typedef void (*bson_reader_destroy_func_t) (void *handle); /* IN */
87+
typedef void (BSON_CALL *bson_reader_destroy_func_t) (void *handle); /* IN */
8888

8989

9090
BSON_EXPORT (bson_reader_t *)

src/libbson/src/bson/bson-types.h

Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -389,57 +389,59 @@ typedef struct {
389389
*/
390390
typedef struct {
391391
/* run before / after descending into a document */
392-
bool (*visit_before) (const bson_iter_t *iter, const char *key, void *data);
393-
bool (*visit_after) (const bson_iter_t *iter, const char *key, void *data);
392+
bool (BSON_CALL *visit_before) (const bson_iter_t *iter, const char *key, void *data);
393+
bool (BSON_CALL *visit_after) (const bson_iter_t *iter, const char *key, void *data);
394394
/* corrupt BSON, or unsupported type and visit_unsupported_type not set */
395-
void (*visit_corrupt) (const bson_iter_t *iter, void *data);
395+
void (BSON_CALL *visit_corrupt) (const bson_iter_t *iter, void *data);
396396
/* normal bson field callbacks */
397-
bool (*visit_double) (const bson_iter_t *iter, const char *key, double v_double, void *data);
398-
bool (*visit_utf8) (const bson_iter_t *iter, const char *key, size_t v_utf8_len, const char *v_utf8, void *data);
399-
bool (*visit_document) (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data);
400-
bool (*visit_array) (const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data);
401-
bool (*visit_binary) (const bson_iter_t *iter,
402-
const char *key,
403-
bson_subtype_t v_subtype,
404-
size_t v_binary_len,
405-
const uint8_t *v_binary,
406-
void *data);
397+
bool (BSON_CALL *visit_double) (const bson_iter_t *iter, const char *key, double v_double, void *data);
398+
bool (BSON_CALL *visit_utf8) (
399+
const bson_iter_t *iter, const char *key, size_t v_utf8_len, const char *v_utf8, void *data);
400+
bool (BSON_CALL *visit_document) (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data);
401+
bool (BSON_CALL *visit_array) (const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data);
402+
bool (BSON_CALL *visit_binary) (const bson_iter_t *iter,
403+
const char *key,
404+
bson_subtype_t v_subtype,
405+
size_t v_binary_len,
406+
const uint8_t *v_binary,
407+
void *data);
407408
/* normal field with deprecated "Undefined" BSON type */
408-
bool (*visit_undefined) (const bson_iter_t *iter, const char *key, void *data);
409-
bool (*visit_oid) (const bson_iter_t *iter, const char *key, const bson_oid_t *v_oid, void *data);
410-
bool (*visit_bool) (const bson_iter_t *iter, const char *key, bool v_bool, void *data);
411-
bool (*visit_date_time) (const bson_iter_t *iter, const char *key, int64_t msec_since_epoch, void *data);
412-
bool (*visit_null) (const bson_iter_t *iter, const char *key, void *data);
413-
bool (*visit_regex) (
409+
bool (BSON_CALL *visit_undefined) (const bson_iter_t *iter, const char *key, void *data);
410+
bool (BSON_CALL *visit_oid) (const bson_iter_t *iter, const char *key, const bson_oid_t *v_oid, void *data);
411+
bool (BSON_CALL *visit_bool) (const bson_iter_t *iter, const char *key, bool v_bool, void *data);
412+
bool (BSON_CALL *visit_date_time) (const bson_iter_t *iter, const char *key, int64_t msec_since_epoch, void *data);
413+
bool (BSON_CALL *visit_null) (const bson_iter_t *iter, const char *key, void *data);
414+
bool (BSON_CALL *visit_regex) (
414415
const bson_iter_t *iter, const char *key, const char *v_regex, const char *v_options, void *data);
415-
bool (*visit_dbpointer) (const bson_iter_t *iter,
416-
const char *key,
417-
size_t v_collection_len,
418-
const char *v_collection,
419-
const bson_oid_t *v_oid,
420-
void *data);
421-
bool (*visit_code) (const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, void *data);
422-
bool (*visit_symbol) (
416+
bool (BSON_CALL *visit_dbpointer) (const bson_iter_t *iter,
417+
const char *key,
418+
size_t v_collection_len,
419+
const char *v_collection,
420+
const bson_oid_t *v_oid,
421+
void *data);
422+
bool (BSON_CALL *visit_code) (
423+
const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, void *data);
424+
bool (BSON_CALL *visit_symbol) (
423425
const bson_iter_t *iter, const char *key, size_t v_symbol_len, const char *v_symbol, void *data);
424-
bool (*visit_codewscope) (const bson_iter_t *iter,
425-
const char *key,
426-
size_t v_code_len,
427-
const char *v_code,
428-
const bson_t *v_scope,
429-
void *data);
430-
bool (*visit_int32) (const bson_iter_t *iter, const char *key, int32_t v_int32, void *data);
431-
bool (*visit_timestamp) (
426+
bool (BSON_CALL *visit_codewscope) (const bson_iter_t *iter,
427+
const char *key,
428+
size_t v_code_len,
429+
const char *v_code,
430+
const bson_t *v_scope,
431+
void *data);
432+
bool (BSON_CALL *visit_int32) (const bson_iter_t *iter, const char *key, int32_t v_int32, void *data);
433+
bool (BSON_CALL *visit_timestamp) (
432434
const bson_iter_t *iter, const char *key, uint32_t v_timestamp, uint32_t v_increment, void *data);
433-
bool (*visit_int64) (const bson_iter_t *iter, const char *key, int64_t v_int64, void *data);
434-
bool (*visit_maxkey) (const bson_iter_t *iter, const char *key, void *data);
435-
bool (*visit_minkey) (const bson_iter_t *iter, const char *key, void *data);
435+
bool (BSON_CALL *visit_int64) (const bson_iter_t *iter, const char *key, int64_t v_int64, void *data);
436+
bool (BSON_CALL *visit_maxkey) (const bson_iter_t *iter, const char *key, void *data);
437+
bool (BSON_CALL *visit_minkey) (const bson_iter_t *iter, const char *key, void *data);
436438
/* if set, called instead of visit_corrupt when an apparently valid BSON
437439
* includes an unrecognized field type (reading future version of BSON) */
438-
void (*visit_unsupported_type) (const bson_iter_t *iter, const char *key, uint32_t type_code, void *data);
439-
bool (*visit_decimal128) (const bson_iter_t *iter,
440-
const char *key,
441-
const bson_decimal128_t *v_decimal128,
442-
void *data);
440+
void (BSON_CALL *visit_unsupported_type) (const bson_iter_t *iter, const char *key, uint32_t type_code, void *data);
441+
bool (BSON_CALL *visit_decimal128) (const bson_iter_t *iter,
442+
const char *key,
443+
const bson_decimal128_t *v_decimal128,
444+
void *data);
443445

444446
void *padding[7];
445447
} bson_visitor_t;

src/libmongoc/src/mongoc/mongoc-apm.h

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -311,18 +311,19 @@ mongoc_apm_server_heartbeat_failed_get_awaited (const mongoc_apm_server_heartbea
311311
* callbacks
312312
*/
313313

314-
typedef void (*mongoc_apm_command_started_cb_t) (const mongoc_apm_command_started_t *event);
315-
typedef void (*mongoc_apm_command_succeeded_cb_t) (const mongoc_apm_command_succeeded_t *event);
316-
typedef void (*mongoc_apm_command_failed_cb_t) (const mongoc_apm_command_failed_t *event);
317-
typedef void (*mongoc_apm_server_changed_cb_t) (const mongoc_apm_server_changed_t *event);
318-
typedef void (*mongoc_apm_server_opening_cb_t) (const mongoc_apm_server_opening_t *event);
319-
typedef void (*mongoc_apm_server_closed_cb_t) (const mongoc_apm_server_closed_t *event);
320-
typedef void (*mongoc_apm_topology_changed_cb_t) (const mongoc_apm_topology_changed_t *event);
321-
typedef void (*mongoc_apm_topology_opening_cb_t) (const mongoc_apm_topology_opening_t *event);
322-
typedef void (*mongoc_apm_topology_closed_cb_t) (const mongoc_apm_topology_closed_t *event);
323-
typedef void (*mongoc_apm_server_heartbeat_started_cb_t) (const mongoc_apm_server_heartbeat_started_t *event);
324-
typedef void (*mongoc_apm_server_heartbeat_succeeded_cb_t) (const mongoc_apm_server_heartbeat_succeeded_t *event);
325-
typedef void (*mongoc_apm_server_heartbeat_failed_cb_t) (const mongoc_apm_server_heartbeat_failed_t *event);
314+
typedef void (BSON_CALL *mongoc_apm_command_started_cb_t) (const mongoc_apm_command_started_t *event);
315+
typedef void (BSON_CALL *mongoc_apm_command_succeeded_cb_t) (const mongoc_apm_command_succeeded_t *event);
316+
typedef void (BSON_CALL *mongoc_apm_command_failed_cb_t) (const mongoc_apm_command_failed_t *event);
317+
typedef void (BSON_CALL *mongoc_apm_server_changed_cb_t) (const mongoc_apm_server_changed_t *event);
318+
typedef void (BSON_CALL *mongoc_apm_server_opening_cb_t) (const mongoc_apm_server_opening_t *event);
319+
typedef void (BSON_CALL *mongoc_apm_server_closed_cb_t) (const mongoc_apm_server_closed_t *event);
320+
typedef void (BSON_CALL *mongoc_apm_topology_changed_cb_t) (const mongoc_apm_topology_changed_t *event);
321+
typedef void (BSON_CALL *mongoc_apm_topology_opening_cb_t) (const mongoc_apm_topology_opening_t *event);
322+
typedef void (BSON_CALL *mongoc_apm_topology_closed_cb_t) (const mongoc_apm_topology_closed_t *event);
323+
typedef void (BSON_CALL *mongoc_apm_server_heartbeat_started_cb_t) (const mongoc_apm_server_heartbeat_started_t *event);
324+
typedef void (BSON_CALL *mongoc_apm_server_heartbeat_succeeded_cb_t) (
325+
const mongoc_apm_server_heartbeat_succeeded_t *event);
326+
typedef void (BSON_CALL *mongoc_apm_server_heartbeat_failed_cb_t) (const mongoc_apm_server_heartbeat_failed_t *event);
326327

327328
/*
328329
* registering callbacks

src/libmongoc/src/mongoc/mongoc-client-session.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@
2727

2828
BSON_BEGIN_DECLS
2929

30-
typedef bool (*mongoc_client_session_with_transaction_cb_t) (mongoc_client_session_t *session,
31-
void *ctx,
32-
bson_t **reply,
33-
bson_error_t *error);
30+
typedef bool (BSON_CALL *mongoc_client_session_with_transaction_cb_t) (mongoc_client_session_t *session,
31+
void *ctx,
32+
bson_t **reply,
33+
bson_error_t *error);
3434

3535
typedef enum {
3636
MONGOC_TRANSACTION_NONE = 0,

src/libmongoc/src/mongoc/mongoc-client-side-encryption.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ BSON_BEGIN_DECLS
4545

4646
typedef struct _mongoc_auto_encryption_opts_t mongoc_auto_encryption_opts_t;
4747

48-
typedef bool (*mongoc_kms_credentials_provider_callback_fn) (void *userdata,
49-
const bson_t *params,
50-
bson_t *out,
51-
bson_error_t *error);
48+
typedef bool (BSON_CALL *mongoc_kms_credentials_provider_callback_fn) (void *userdata,
49+
const bson_t *params,
50+
bson_t *out,
51+
bson_error_t *error);
5252

5353
MONGOC_EXPORT (mongoc_auto_encryption_opts_t *)
5454
mongoc_auto_encryption_opts_new (void) BSON_GNUC_WARN_UNUSED_RESULT;

src/libmongoc/src/mongoc/mongoc-client.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,10 @@ typedef struct _mongoc_transaction_opt_t mongoc_transaction_opt_t;
9595
*
9696
* Returns: A newly allocated mongoc_stream_t or NULL on failure.
9797
*/
98-
typedef mongoc_stream_t *(*mongoc_stream_initiator_t) (const mongoc_uri_t *uri,
99-
const mongoc_host_list_t *host,
100-
void *user_data,
101-
bson_error_t *error);
98+
typedef mongoc_stream_t *(BSON_CALL *mongoc_stream_initiator_t) (const mongoc_uri_t *uri,
99+
const mongoc_host_list_t *host,
100+
void *user_data,
101+
bson_error_t *error);
102102

103103

104104
MONGOC_EXPORT (mongoc_client_t *)

src/libmongoc/src/mongoc/mongoc-log.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ typedef enum {
6161
* libmongoc library. This is useful if you would like to show them in a
6262
* user interface or alternate storage.
6363
*/
64-
typedef void (*mongoc_log_func_t) (mongoc_log_level_t log_level,
65-
const char *log_domain,
66-
const char *message,
67-
void *user_data);
64+
typedef void (BSON_CALL *mongoc_log_func_t) (mongoc_log_level_t log_level,
65+
const char *log_domain,
66+
const char *message,
67+
void *user_data);
6868

6969

7070
/**

src/libmongoc/src/mongoc/mongoc-sleep.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ BSON_BEGIN_DECLS
1414
* @usec: Number of microseconds to sleep for.
1515
* @user_data: User data provided to mongoc_client_set_usleep_impl().
1616
*/
17-
typedef void (*mongoc_usleep_func_t) (int64_t usec, void *user_data);
17+
typedef void (BSON_CALL *mongoc_usleep_func_t) (int64_t usec, void *user_data);
1818

1919
/**
2020
* mongoc_client_set_usleep_impl:

src/libmongoc/src/mongoc/mongoc-stream.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,19 @@ typedef struct _mongoc_stream_poll_t {
3737

3838
struct _mongoc_stream_t {
3939
int type;
40-
void (*destroy) (mongoc_stream_t *stream);
41-
int (*close) (mongoc_stream_t *stream);
42-
int (*flush) (mongoc_stream_t *stream);
43-
ssize_t (*writev) (mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec);
44-
ssize_t (*readv) (
40+
void (BSON_CALL *destroy) (mongoc_stream_t *stream);
41+
int (BSON_CALL *close) (mongoc_stream_t *stream);
42+
int (BSON_CALL *flush) (mongoc_stream_t *stream);
43+
ssize_t (BSON_CALL *writev) (mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec);
44+
ssize_t (BSON_CALL *readv) (
4545
mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec);
46-
int (*setsockopt) (mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen);
47-
mongoc_stream_t *(*get_base_stream) (mongoc_stream_t *stream);
48-
bool (*check_closed) (mongoc_stream_t *stream);
49-
ssize_t (*poll) (mongoc_stream_poll_t *streams, size_t nstreams, int32_t timeout);
50-
void (*failed) (mongoc_stream_t *stream);
51-
bool (*timed_out) (mongoc_stream_t *stream);
52-
bool (*should_retry) (mongoc_stream_t *stream);
46+
int (BSON_CALL *setsockopt) (mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen);
47+
mongoc_stream_t *(BSON_CALL *get_base_stream) (mongoc_stream_t *stream);
48+
bool (BSON_CALL *check_closed) (mongoc_stream_t *stream);
49+
ssize_t (BSON_CALL *poll) (mongoc_stream_poll_t *streams, size_t nstreams, int32_t timeout);
50+
void (BSON_CALL *failed) (mongoc_stream_t *stream);
51+
bool (BSON_CALL *timed_out) (mongoc_stream_t *stream);
52+
bool (BSON_CALL *should_retry) (mongoc_stream_t *stream);
5353
void *padding[3];
5454
};
5555

src/libmongoc/src/mongoc/mongoc-structured-log.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ typedef struct mongoc_structured_log_entry_t mongoc_structured_log_entry_t;
4848

4949
typedef struct mongoc_structured_log_opts_t mongoc_structured_log_opts_t;
5050

51-
typedef void (*mongoc_structured_log_func_t) (const mongoc_structured_log_entry_t *entry, void *user_data);
51+
typedef void (BSON_CALL *mongoc_structured_log_func_t) (const mongoc_structured_log_entry_t *entry, void *user_data);
5252

5353
MONGOC_EXPORT (mongoc_structured_log_opts_t *)
5454
mongoc_structured_log_opts_new (void);

0 commit comments

Comments
 (0)