bool TestExtIpc::test_message_queue() { char filename[64]; strcpy(filename, "/tmp/XXXXXX"); close(mkstemp(filename)); int64 token = f_ftok(filename, "a"); Object queue = f_msg_get_queue(token); VERIFY(queue.get()); int pid = fork(); if (pid == 0) { Object q = f_msg_get_queue(token); assert(q.get()); assert(f_msg_send(q, 2, "start")); Variant type, msg; assert(f_msg_receive(q, 1, ref(type), 100, ref(msg))); assert(f_msg_send(q, 2, msg)); // echo _exit(-1); } Variant type, msg; VERIFY(f_msg_receive(queue, 2, ref(type), 100, ref(msg))); VERIFY(same(msg, "start")); VERIFY(f_msg_send(queue, 1, "ok")); VERIFY(f_msg_receive(queue, 2, ref(type), 100, ref(msg))); VERIFY(same(msg, "ok")); Array ret = f_msg_stat_queue(queue); VS(ret["msg_qnum"], 0); f_msg_set_queue(queue, CREATE_MAP1("msg_perm.mode", 0666)); f_msg_remove_queue(queue); int status = -1; wait(&status); return Count(true); }
Array Crutch::invoke(String func, Array schema, Array params) { if (!m_php) init(); Array message = CREATE_VECTOR4(func, schema, params.size(), params); if (!f_msg_send(m_queue, 1, message)) { terminate(); throw SystemCallFailure("f_msg_send"); } Variant type, ret; if (!f_msg_receive(m_queue, 2, ref(type), MSG_MAX_SIZE, ref(ret))) { terminate(); throw SystemCallFailure("f_msg_receive"); } return ret.toArray(); }