SEGV on solaris when WANT_THREADS defined

Jon Dyte <[email protected]>
Newsgroups gmane.comp.python.sybase
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.