LINUX.ORG.RU

История изменений

Исправление cvs-255, (текущая версия) :

Здесь я вызываю callback, который хранится в conn->dgram_send_cb

static void dgram_send_cb(struct rdp_connection_s *c, const uint8_t *d, size_t l)
{
    PyObject *connection = c->user_arg;
    struct py_rdp_connection_s *conn = PyCapsule_GetPointer(connection, "RDP Connection");
    if (conn->dgram_send_cb != Py_None)
    {
        printf("TYPE: %s\n", Py_TYPE(conn->dgram_send_cb)->tp_name);
        printf("SEND %i bytes\n", l);
        //PyObject *args = Py_BuildValue("(Oy#)", connection, d, l);
        PyObject_CallObject(conn->dgram_send_cb, Py_BuildValue("()"));
        printf("READY\n");
    }
}

А тут я сохраняю этот callback

static PyObject* py_rdp_set_dgram_send_cb(PyObject* self, PyObject* args)
{
    PyObject *connection;
    PyObject *cb;
    if (!PyArg_ParseTuple(args, "OO", &connection, &cb))
        return NULL;
    struct py_rdp_connection_s *conn = PyCapsule_GetPointer(connection, "RDP Connection");
    if (conn == NULL)
        return NULL;
    conn->dgram_send_cb = cb;
    Py_RETURN_NONE;
}

Дальше питоновский код:

Вот так все работает:

import rdp.wrapper
import serial
import sys

def cb(*args, **kwargs):
    print("CALLBACK")

conn = rdp.wrapper.create_connection()
rdp.wrapper.set_dgram_send_cb(conn, cb)
rdp.wrapper.connect(conn,1,1)

А вот так падает (я пока временно убрал передачу аргументов в callback)

import rdp.wrapper
import serial
import sys

class test(object):
    def cb(self):
        print("CALLBACK")

    def __init__(self):
        self.conn = rdp.wrapper.create_connection()
        rdp.wrapper.set_dgram_send_cb(self.conn, self.cb)

    def connect(self):
        rdp.wrapper.connect(self.conn,1,1)

t = test()
t.connect()

Причем CALLBACK он успевает написать

Исходная версия cvs-255, :

Здесь я вызываю callback, который хранится в conn->dgram_send_cb

static void dgram_send_cb(struct rdp_connection_s *c, const uint8_t *d, size_t l)
{
    PyObject *connection = c->user_arg;
    struct py_rdp_connection_s *conn = PyCapsule_GetPointer(connection, "RDP Connection");
    if (conn->dgram_send_cb != Py_None)
    {
        printf("TYPE: %s\n", Py_TYPE(conn->dgram_send_cb)->tp_name);
        printf("SEND %i bytes\n", l);
        //PyObject *args = Py_BuildValue("(Oy#)", connection, d, l);
        PyObject_CallObject(conn->dgram_send_cb, Py_BuildValue("()"));
        printf("READY\n");
    }
}

А тут я сохраняю этот callback

static PyObject* py_rdp_set_dgram_send_cb(PyObject* self, PyObject* args)
{
    PyObject *connection;
    PyObject *cb;
    if (!PyArg_ParseTuple(args, "OO", &connection, &cb))
        return NULL;
    struct py_rdp_connection_s *conn = PyCapsule_GetPointer(connection, "RDP Connection");
    if (conn == NULL)
        return NULL;
    conn->dgram_send_cb = cb;
    Py_RETURN_NONE;
}

Дальше питоновский код:

Вот так все работает:

import rdp.wrapper
import serial
import sys

def cb(*args, **kwargs):
    print("CALLBACK")

conn = rdp.wrapper.create_connection()
rdp.wrapper.set_dgram_send_cb(conn, cb)
rdp.wrapper.connect(conn,1,1)

А вот так падает

import rdp.wrapper
import serial
import sys

class test(object):
    def cb(self):
        print("CALLBACK")

    def __init__(self):
        self.conn = rdp.wrapper.create_connection()
        rdp.wrapper.set_dgram_send_cb(self.conn, self.cb)

    def connect(self):
        rdp.wrapper.connect(self.conn,1,1)

t = test()
t.connect()

Причем CALLBACK он успевает написать