void *LogWriter::run_helper(void *context) { px4_prctl(PR_SET_NAME, "log_writer", px4_getpid()); reinterpret_cast<LogWriter *>(context)->run(); return nullptr; }
int uORB::DeviceNode::close(device::file_t *filp) { //warnx("uORB::DeviceNode::close fd = %d", filp->fd); /* is this the publisher closing? */ if (px4_getpid() == _publisher) { _publisher = 0; } else { SubscriberData *sd = filp_to_sd(filp); if (sd != nullptr) { hrt_cancel(&sd->update_call); remove_internal_subscriber(); delete sd; sd = nullptr; } } return VDev::close(filp); }
int uORB::DeviceNode::open(device::file_t *filp) { int ret; /* is this a publisher? */ if (filp->flags == PX4_F_WRONLY) { /* become the publisher if we can */ lock(); if (_publisher == 0) { _publisher = px4_getpid(); ret = PX4_OK; } else { ret = -EBUSY; } unlock(); /* now complete the open */ if (ret == PX4_OK) { ret = VDev::open(filp); /* open failed - not the publisher anymore */ if (ret != PX4_OK) { _publisher = 0; } } return ret; } /* is this a new subscriber? */ if (filp->flags == PX4_F_RDONLY) { /* allocate subscriber data */ SubscriberData *sd = new SubscriberData; if (nullptr == sd) { return -ENOMEM; } memset(sd, 0, sizeof(*sd)); /* default to no pending update */ sd->generation = _generation; /* set priority */ sd->priority = _priority; filp->priv = (void *)sd; ret = VDev::open(filp); add_internal_subscriber(); if (ret != PX4_OK) { warnx("ERROR: VDev::open failed\n"); delete sd; } //warnx("uORB::DeviceNode::Open: fd = %d flags = %d, priv = %p cdev = %p\n", filp->fd, filp->flags, filp->priv, filp->cdev); return ret; } /* can only be pub or sub, not both */ return -EINVAL; }
int uORB::DeviceNode::open(cdev::file_t *filp) { int ret; /* is this a publisher? */ if (FILE_FLAGS(filp) == PX4_F_WRONLY) { /* become the publisher if we can */ lock(); if (_publisher == 0) { _publisher = px4_getpid(); ret = PX4_OK; } else { ret = -EBUSY; } unlock(); /* now complete the open */ if (ret == PX4_OK) { ret = CDev::open(filp); /* open failed - not the publisher anymore */ if (ret != PX4_OK) { _publisher = 0; } } return ret; } /* is this a new subscriber? */ if (FILE_FLAGS(filp) == PX4_F_RDONLY) { /* allocate subscriber data */ SubscriberData *sd = new SubscriberData{}; if (nullptr == sd) { return -ENOMEM; } /* If there were any previous publications, allow the subscriber to read them */ sd->generation = _generation - (_queue_size < _generation ? _queue_size : _generation); /* set priority */ sd->set_priority(_priority); FILE_PRIV(filp) = (void *)sd; ret = CDev::open(filp); add_internal_subscriber(); if (ret != PX4_OK) { PX4_ERR("CDev::open failed"); delete sd; } return ret; } if (FILE_FLAGS(filp) == 0) { return CDev::open(filp); } /* can only be pub or sub, not both */ return -EINVAL; }