/**Increment a message reference count. * * @relatesalso msg_s * * Creates a reference to a message. The * referenced message is not freed until all the references have been * destroyed. * * @param msg message of which a reference is created * * @return * A pointer to a message. */ msg_t *msg_ref_create(msg_t *msg) { if (msg) { su_home_mutex_lock(msg->m_home); msg->m_refs++; su_home_mutex_unlock(msg->m_home); } return msg; }
static int test_lock(void) { su_home_t home[1] = { SU_HOME_INIT(home) }; BEGIN(); TEST(su_home_mutex_lock(home), -1); TEST(su_home_mutex_unlock(home), -1); TEST(su_home_lock(home), -1); TEST(su_home_trylock(home), -1); TEST(su_home_unlock(home), -1); TEST(su_home_init(home), 0); TEST(su_home_mutex_lock(home), 0); TEST(su_home_trylock(home), -1); TEST(su_home_mutex_unlock(home), 0); TEST(su_home_trylock(home), -1); TEST(su_home_threadsafe(home), 0); TEST(su_home_mutex_lock(home), 0); TEST(su_home_trylock(home), EBUSY); TEST(su_home_mutex_unlock(home), 0); TEST(su_home_lock(home), 0); TEST(su_home_trylock(home), EBUSY); TEST(su_home_unlock(home), 0); TEST(su_home_trylock(home), 0); TEST(su_home_unlock(home), 0); TEST_VOID(su_home_deinit(home)); END(); }
/**Deinitialize and free a message. * * @relatesalso msg_s * * @param msg message to be destroyed */ void msg_destroy(msg_t *msg) { msg_t *parent; for (; msg; msg = parent) { int refs; su_home_mutex_lock(msg->m_home); parent = msg->m_parent; if (msg->m_refs) msg->m_refs--; refs = msg->m_refs; su_home_mutex_unlock(msg->m_home); if (refs) break; su_home_zap(msg->m_home); } }