digitalmars.D - C -> D conversion segfault
- teqDruid (69/69) Aug 03 2004 I'm attempting to write some D bindings, however I'm having trouble
-
Arcane Jill
(8/8)
Aug 03 2004
In article
, teqDruid says.... - teqDruid (5/19) Aug 03 2004 Yeah... that did it. Actually, I had hoped that this was a good test ca...
- teqDruid (69/74) Aug 03 2004 I was hoping that the previous post was a shorted test case of something
I'm attempting to write some D bindings, however I'm having trouble porting some code. The output (correct output) from the C version is this: showEnv: No Fault showEnv: XMLRPC-Fault: test (3) Where as the output from the D Version is: showEnv: No Fault Segmentation fault In various other places, things like this have been happening, where this xmlrpc_env struct becomes corrupted, and causes these segfaults. I'm not sure what I'm doing wrong... or perhaps it's not my bug? I'm running DMD 0.97 on Linux TIA John Here's the code: -----C Version--------- typedef signed int xmlrpc_int32; typedef struct _xmlrpc_env { int fault_occurred; xmlrpc_int32 fault_code; char* fault_string; } xmlrpc_env; extern void xmlrpc_env_init (xmlrpc_env* env); extern void xmlrpc_env_set_fault (xmlrpc_env *env, int code, char *string); void showEnv(xmlrpc_env* env) { printf("showEnv: "); if (env->fault_occurred) printf("XMLRPC-Fault: %s (%d)\n", env->fault_string, env->fault_code); else printf("No Fault\n"); } int main(void) { xmlrpc_env env; xmlrpc_env_init(&env); showEnv(&env); xmlrpc_env_set_fault(&env, 3, "test"); showEnv(&env); return 0; } --------End C Version------------- --------D Version--------------- typedef int xmlrpc_int32; struct xmlrpc_env { int fault_occurred; xmlrpc_int32 fault_code; char* fault_string; } extern(C) void xmlrpc_env_init (xmlrpc_env* env); extern(C) void xmlrpc_env_set_fault (xmlrpc_env *env, int code, char *string); void showEnv(xmlrpc_env* env) { printf("showEnv: \0"); if (env.fault_occurred) printf("XMLRPC-Fault: %.*s (%d)\n\0", env.fault_string, env.fault_code); else printf("No Fault\n\0"); } void main() { xmlrpc_env env; xmlrpc_env_init(&env); showEnv(&env); xmlrpc_env_set_fault(&env, 3, "test\0"); showEnv(&env); } ------------End D Version
Aug 03 2004
In article <pan.2004.08.03.21.10.08.997592 teqdruid.com>, teqDruid says... Just a thought, but maybe: should be because env.fault_string is a (char*), not a (char[]). (Fingers crossed) Jill
Aug 03 2004
Yeah... that did it. Actually, I had hoped that this was a good test case for the other problems I've been having... but I guess not. I don't think this'll be the end of this, but thanks... for now. John On Tue, 03 Aug 2004 21:22:10 +0000, Arcane Jill wrote:In article <pan.2004.08.03.21.10.08.997592 teqdruid.com>, teqDruid says... Just a thought, but maybe: should be because env.fault_string is a (char*), not a (char[]). (Fingers crossed) Jill
Aug 03 2004
I was hoping that the previous post was a shorted test case of something like this. Here, print_state_name_callback is a callback that the C library calls. The pointer to an xmlrpc_env struct is... not right. I'm not sure what's wrong with it, but the output (from the die_if_fault_occurred function) is: env.fault_occurred: 1886680168 Segmentation fault I can post xmlrpcd.xmlrpcd and xmlrpcd.client if necessary, but they're rather long. They're ports of xmlrpc.h and xmlrpc-client.h. The D program below is a slightly modified port of: http://xmlrpc-c.sourceforge.net/examples/asynch_client.c The C version works fine. Any advice? TIA John import xmlrpcd.xmlrpcd; import xmlrpcd.client; void die_if_fault_occurred (xmlrpc_env* env) { printf("env.fault_occurred: %d\n\0", env.fault_occurred); if (env.fault_occurred) { printf("XML-RPC Fault:\0"); printf("%s (%d)\n\0", env.fault_string, env.fault_code); throw new Exception("XML-RPC Fault"); } } static void print_state_name_callback (char *server_url, char *method_name, xmlrpc_value *param_array, void *user_data, xmlrpc_env* env, xmlrpc_value* result) { int state_number; char *state_name; /* Check to see if a fault occurred. */ die_if_fault_occurred(env); /* Get our state name. */ xmlrpc_parse_value(env, result, "s", &state_name); die_if_fault_occurred(env); printf("State: %s\n", state_name); } void main() { xmlrpc_value *result; char *state_name; int i; /* Start up our XML-RPC client library. */ xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, "Name", "Version"); /* Make a whole bunch of asynch calls. */ for (i = 40; i < 45; i++) { xmlrpc_client_call_asynch("http://localhost:8080/RPC2", "mirror.Random", &print_state_name_callback, null, "()"); } /* Wait for all calls to complete. */ xmlrpc_client_event_loop_finish_asynch(); /* shutdown our XML-RPC client library. */ xmlrpc_client_cleanup(); } On Tue, 03 Aug 2004 17:10:09 -0400, teqDruid wrote:In various other places, things like this have been happening, where this xmlrpc_env struct becomes corrupted, and causes these segfaults. I'm not sure what I'm doing wrong... or perhaps it's not my bug? I'm running DMD 0.97 on Linux
Aug 03 2004