From: Jon D. <jo...@to...> - 2003-11-07 17:41:40
|
Hi I'm using twisted 110 and the adbapi ConnectionPool class. I have a small 'toy' script which starts up and runs three of four queries under the twisted event loop, (which will actually do the query in a seperate thread.) If I compile the Sybase module without the WANT_THREADS flag, the script appears to work. When compiled with the FLAG, it sometimes hangs or SEGV's. I managed to get Sybase built with debug info and the stack trace is below. I only compiled the Module with the flag set after reading that twisted would defer the call to a thread, is it necessary. Context: Python 2.3.2, solaris 5.6, sun compiler cc dbx) where current thread: t@5 [1] netp_checkextfds(0x403d00, 0xef00506c, 0x29c340, 0x29c3a8, 0x403d00, 0x47798c), at 0xee85d1ec [2] netp_callback_poll(0x403d00, 0x1388, 0xef10716c, 0x2b659c, 0x1, 0x0), at 0xee85a660 [3] syb_net_callback(0x403d00, 0x1388, 0xef10716c, 0x2b659c, 0x0, 0x0), at 0xee85007c [4] np_ctx_wait(0x3ba860, 0x23e190, 0x1388, 0x0, 0xef1071d4, 0x0), at 0xee8d1658 [5] com_async_poll(0x3ba860, 0x23e190, 0x1388, 0x5, 0x0, 0x0), at 0xee78609c [6] ct__api_connect_async(0x47e8b0, 0x0, 0xfffffff7, 0x0, 0x0, 0x0), at 0xee8a5ff0 [7] ct_connect(0x47e8b0, 0x1eda5c, 0xfffffff7, 0x1eda48, 0x2a6584, 0x63745f63), at 0xee8a6278 =>[8] CS_CONNECTION_ct_connect(self = 0x4835c0, args = 0x3faad0), line 310 in "conn.c" [9] call_function(0xef107518, 0x3faad0, 0x12035c, 0x0, 0x1, 0x1), at 0x7df50 [10] eval_frame(0x3c3880, 0x2a6574, 0x1219a4, 0x13c120, 0x13c114, 0x0), at 0x7b34c [11] fast_function(0x3f82f0, 0xef107780, 0x1, 0x405230, 0x2a6428, 0x480ef8), at 0x7e1a4 [12] call_function(0xef107780, 0x47e87c, 0x480e90, 0x0, 0x1, 0x1), at 0x7e040 [13] eval_frame(0x3c3810, 0x47e84c, 0x1219a4, 0x13c120, 0x13c114, 0x0), at 0x7b34c [14] PyEval_EvalCodeEx(0x3d4aa0, 0x9, 0x9, 0x0, 0x3f88bc, 0x0), at 0x7c944 [15] function_call(0x3f81f0, 0x3f88b0, 0x0, 0x5, 0x3de2ac, 0x0), at 0xbc930 [16] PyObject_Call(0x3f81f0, 0x3f88b0, 0x0, 0x19de60, 0x272, 0x1e), at 0x2b6ac [17] instancemethod_call(0x8, 0x3f88b0, 0x0, 0x3f6660, 0x3f81f0, 0x480e90), at 0x318fc [18] PyObject_Call(0x480a30, 0x1e3af0, 0x0, 0x480a30, 0x3de2dc, 0x233068), at 0x2b6ac [19] PyEval_CallObjectWithKeywords(0x480a30, 0x1e3af0, 0x0, 0x0, 0x0, 0x1e3b1d), at 0x7dc38 [20] PyInstance_New(0x152000, 0x1e3af0, 0x0, 0x480a30, 0x480e90, 0xef108144), at 0x2d7bc [21] PyObject_Call(0x3f6660, 0x1e3af0, 0x0, 0x2a9970, 0x3afcf8, 0x1a8), at 0x2b6ac [22] do_call(0x0, 0xef107f10, 0x8, 0x0, 0x3f6660, 0x0), at 0x7e5c4 [23] call_function(0xef107f10, 0x2a6230, 0x62f8d952, 0x0, 0x8, 0x8), at 0x7e05c [24] eval_frame(0x3d64b0, 0x2a620c, 0x1219a4, 0x13c120, 0x13c114, 0x0), at 0x7b34c [25] PyEval_EvalCodeEx(0x3da060, 0x3de2dc, 0x14, 0x20, 0x5, 0x0), at 0x7c944 [26] function_call(0x3f1730, 0x1e8300, 0x1, 0x5, 0x3de2dc, 0x233068), at 0xbc930 [27] PyObject_Call(0x3f1730, 0x1e8300, 0x3cf390, 0x4805a4, 0x13c114, 0x3), at 0x2b6ac [28] PyEval_CallObjectWithKeywords(0x3f1730, 0x1e8300, 0x3cf390, 0x3, 0xef108138, 0xef108144), at 0x7dc38 [29] builtin_apply(0x0, 0x480af8, 0x0, 0x7019c, 0x0, 0x480b11), at 0x702fc [30] call_function(0xef108330, 0x480af8, 0x12035c, 0x0, 0x3, 0x3), at 0x7df50 [31] eval_frame(0x1f01e0, 0x2a73a4, 0x1219a4, 0x13c120, 0x13c114, 0x0), at 0x7b34c [32] fast_function(0x2075b0, 0xef108598, 0x1, 0x405230, 0x2a7258, 0x8), at 0x7e1a4 [33] call_function(0xef108598, 0x2a2bc0, 0x1f39e0, 0x0, 0x1, 0x1), at 0x7e040 [34] eval_frame(0x18bf80, 0x2a2ba4, 0x1219a4, 0x13c120, 0x13c114, 0x0), at 0x7b34c [35] PyEval_EvalCodeEx(0x1ef7a0, 0x1, 0x2, 0x487ae0, 0x480564, 0x0), at 0x7c944 [36] function_call(0x2078b0, 0x480558, 0x0, 0x0, 0x0, 0x233028), at 0xbc930 [37] PyObject_Call(0x2078b0, 0x480558, 0x487150, 0xef1088e8, 0x2dc0f8, 0x2), at 0x2b6ac [38] ext_do_call(0x2078b0, 0x1, 0x3, 0x0, 0x480558, 0x487150), at 0x7e7f8 [39] eval_frame(0x1f37b0, 0x2a71f4, 0x1219a4, 0x13c120, 0x13c114, 0x0), at 0x7b4b4 [40] PyEval_EvalCodeEx(0x1f41e0, 0x4, 0x4, 0x0, 0x4834ec, 0x0), at 0x7c944 [41] function_call(0x1f45b0, 0x4834e0, 0x0, 0x0, 0x0, 0x233008), at 0xbc930 [42] PyObject_Call(0x1f45b0, 0x4834e0, 0x4879c0, 0xef108c38, 0x480b20, 0x0), at 0x2b6ac [43] ext_do_call(0x1f45b0, 0x4, 0x3, 0x0, 0x4834e0, 0x4879c0), at 0x7e7f8 [44] eval_frame(0x2141e8, 0x2a29d4, 0x1219a4, 0x13c120, 0x13c114, 0x0), at 0x7b4b4 [45] PyEval_EvalCodeEx(0x21fee0, 0x3, 0x7, 0x4879c0, 0x3f33f4, 0x0), at 0x7c944 [46] function_call(0x2d0d70, 0x3f33e8, 0x0, 0x0, 0x0, 0x233018), at 0xbc930 [47] PyObject_Call(0x2d0d70, 0x3f33e8, 0x487780, 0xef108f88, 0x2a2888, 0x8), at 0x2b6ac [48] ext_do_call(0x2d0d70, 0x4, 0x3, 0x0, 0x3f33e8, 0x487780), at 0x7e7f8 [49] eval_frame(0x271030, 0x2a7044, 0x1219a4, 0x13c120, 0x13c114, 0x0), at 0x7b4b4 [50] PyEval_EvalCodeEx(0x2d0b20, 0x3, 0x7, 0x487780, 0x3f318c, 0x0), at 0x7c944 [51] function_call(0x2d0e70, 0x3f3180, 0x0, 0x0, 0x0, 0x232ff8), at 0xbc930 [52] PyObject_Call(0x2d0e70, 0x3f3180, 0x487300, 0xef1092d8, 0x2a6ef8, 0x8), at 0x2b6ac [53] ext_do_call(0x2d0e70, 0x4, 0x3, 0x0, 0x3f3180, 0x487300), at 0x7e7f8 [54] eval_frame(0x1fbad0, 0x2a1824, 0x1219a4, 0x13c120, 0x13c114, 0x0), at 0x7b4b4 [55] PyEval_EvalCodeEx(0x3f8560, 0x2, 0x2, 0x0, 0x48049c, 0x0), at 0x7c944 [56] function_call(0x481f70, 0x480490, 0x0, 0x0, 0x0, 0x232fe8), at 0xbc930 [57] PyObject_Call(0x481f70, 0x480490, 0x3e2c00, 0xef109628, 0x13c114, 0x3), at 0x2b6ac [58] ext_do_call(0x481f70, 0x1, 0x3, 0x0, 0x480490, 0x3e2c00), at 0x7e7f8 [59] eval_frame(0x3e3f50, 0x299874, 0x1219a4, 0x13c120, 0x13c114, 0x0), at 0x7b4b4 [60] fast_function(0x3f0eb0, 0xef109890, 0x1, 0x405230, 0x299728, 0x3e2afc), at 0x7e1a4 [61] call_function(0xef109890, 0x2a4490, 0x3faa10, 0x0, 0x1, 0x1), at 0x7e040 [62] eval_frame(0x3e6bf0, 0x2a4484, 0x1219a4, 0x13c120, 0x13c114, 0x0), at 0x7b34c [63] PyEval_EvalCodeEx(0x3e6d60, 0x1, 0x1, 0x0, 0x3faa5c, 0x0), at 0x7c944 [64] function_call(0x3f0ef0, 0x3faa50, 0x0, 0x0, 0x0, 0x0), at 0xbc930 [65] PyObject_Call(0x3f0ef0, 0x3faa50, 0x0, 0x534d, 0x2b0858, 0x2b0840), at 0x2b6ac [66] instancemethod_call(0x0, 0x3faa50, 0x0, 0x40bdc8, 0x3f0ef0, 0x3faa10), at 0x318fc [67] PyObject_Call(0x480a08, 0x158030, 0x0, 0x0, 0x0, 0x0), at 0x2b6ac [68] PyEval_CallObjectWithKeywords(0x480a08, 0x158030, 0x0, 0x0, 0x0, 0x0), at 0x7dc38 [69] t_bootstrap(0x234f28, 0x405230, 0x1, 0xef518340, 0x1, 0xef516bf0), at 0xa116c (dbx) the listing is the SEGV is line 310 in ct_connect. (dbx) list 285 330 285 286 static PyObject *CS_CONNECTION_ct_connect(CS_CONNECTIONObj *self, PyObject *args) 287 { 288 CS_RETCODE status; 289 char *dsn = NULL; 290 291 if (!PyArg_ParseTuple(args, "|s", &dsn)) 292 return NULL; 293 294 if (self->conn == NULL) { 295 PyErr_SetString(PyExc_TypeError, "CS_CONNECTION has been dropped"); 296 return NULL; 297 } 298 299 /* PyErr_Clear(); */ 300 if (dsn == NULL) { 301 SY_CONN_BEGIN_THREADS(self); 302 status = ct_connect(self->conn, NULL, 0); 303 SY_CONN_END_THREADS(self); 304 305 if (self->debug) 306 debug_msg("ct_connect(conn%d, NULL, 0) -> %s\n", 307 self->serial, value_str(VAL_STATUS, status)); 308 } else { 309 SY_CONN_BEGIN_THREADS(self); 310 status = ct_connect(self->conn, dsn, CS_NULLTERM); 311 SY_CONN_END_THREADS(self); 312 313 if (self->debug) 314 debug_msg("ct_connect(conn%d, \"%s\", CS_NULLTERM) -> %s\n", 315 self->serial, dsn, value_str(VAL_STATUS, status)); 316 } 317 if (PyErr_Occurred()) 318 return NULL; 319 320 return PyInt_FromLong(status); 321 } some local variables are :- (dbx) print status status = 1 (dbx) print dsn dsn = 0x1eda5c "SQL_MIDOFF_PDS1" (dbx) print *self *self = { ob_refcnt = 4 ob_type = 0xee9cb3f0 ctx = 0x3c3f70 conn = 0x47e8b0 strip = 0 debug = 0 serial = 0 lock = (nil) thread_state = 0x405230 released_lock = 1 reenter_count = 0 next = (nil) } (dbx) print *args *args = { ob_refcnt = 1 ob_type = 0x12500c Any ideas Jon |