Example #1
0
/**
 * Called by Java's Socket::monitor(String addr, int events).
 */
JNIEXPORT jboolean JNICALL Java_org_zeromq_ZMQ_00024Socket_monitor (JNIEnv *env,
                                                                jobject obj,
                                                                jstring addr,
																jint events)
{
    void *s = get_socket (env, obj);

    if (addr == NULL) {
        raise_exception (env, EINVAL);
        return false;
    }

    const char *c_addr = env->GetStringUTFChars (addr, NULL);
    if (c_addr == NULL) {
        raise_exception (env, EINVAL);
        return false;
    }

    int rc = 0;
	if (c_addr && strlen(c_addr))
		rc = zmq_socket_monitor(s, c_addr, events);
	else
		rc = zmq_socket_monitor(s, 0, 0);

    int err = zmq_errno();
    env->ReleaseStringUTFChars (addr, c_addr);

    if (rc != 0) {
        raise_exception (env, err);
        return false;
    }
	return true;
}
Example #2
0
 inline void init_monitor(const char *addr_, int events)
 {
     int rc = zmq_socket_monitor(ptr, addr_, events);
     if (rc != 0)
         throw error_t ();
     monaddr = std::string(addr_);
 }
Example #3
0
static int luazmq_skt_monitor (lua_State *L) {
  zsocket *skt = luazmq_getsocket(L);
  char endpoint[128];
  const char *bind;
  int ret, events;

  
  if( 
    (lua_gettop(L) == 1) ||         /* s:monitor()          */
    (lua_type(L, 2) == LUA_TNUMBER) /* s:monitor(EVENT_ALL) */
  ){
#ifdef _MSC_VER
    sprintf_s(endpoint, sizeof(endpoint), "inproc://lzmq.monitor.%p", skt->skt);
#else
    sprintf(endpoint, "inproc://lzmq.monitor.%p", skt->skt);
#endif
    bind = endpoint;
    events = luaL_optint(L, 2, ZMQ_EVENT_ALL);
  }
  else{
    bind = luaL_checkstring(L, 2);
    events = luaL_optint(L, 3, ZMQ_EVENT_ALL);
  }

  ret = zmq_socket_monitor (skt->skt, bind, events);
  if(-1 == ret){
    return luazmq_fail(L, skt);
  }

  lua_pushstring(L, bind);
  return 1;
}
Example #4
0
zmonitor_t *
zmonitor_new (zctx_t *ctx, void *socket, int events)
{
    zmonitor_t *self = (zmonitor_t *) zmalloc (sizeof (zmonitor_t));
    assert (self);

    //  Start background agent to connect to the inproc monitor socket
    assert (ctx);
    self->pipe = zthread_fork (ctx, s_agent_task, NULL);
    if (self->pipe) {
        self->socket = socket;
        
        //  Register a monitor endpoint on the socket
        char *monitor_endpoint = (char *) zmalloc (100);
        sprintf (monitor_endpoint, "inproc://zmonitor-%p", self->socket);
        int rc = zmq_socket_monitor (self->socket, monitor_endpoint, events);
        assert (rc == 0);
        
        //  Configure backend agent with monitor endpoint
        zstr_sendf (self->pipe, "%s", monitor_endpoint);
        free (monitor_endpoint);

        char *status = zstr_recv (self->pipe);
        if (strneq (status, "OK"))
            zmonitor_destroy (&self);
        zstr_free (&status);
    }
    else {
        free (self);
        self = NULL;
    }
    return self;
}
Example #5
0
static int luazmq_skt_reset_monitor (lua_State *L) {
  zsocket *skt = luazmq_getsocket(L);
  int ret = zmq_socket_monitor (skt->skt, NULL, 0);
  if(-1 == ret){
    return luazmq_fail(L, skt);
  }

  return luazmq_pass(L);
}
Example #6
0
void Van::init() {
  scheduler_ = parseNode(FLAGS_scheduler);
  myNode_ = parseNode(FLAGS_my_node);
  LOG(INFO) << "I'm \n[" << myNode_.DebugString() << "]";

  context_ = zmq_ctx_new();
  CHECK(context_ != nullptr) << "Create 0mq context failed";

  zmq_ctx_set(context_, ZMQ_MAX_SOCKETS, 65536);
  bind();
  connect(scheduler_);

  if (isScheduler()) {
    CHECK(!zmq_socket_monitor(receiver_, "inproc://monitor", ZMQ_EVENT_ALL));
  } else {
    CHECK(!zmq_socket_monitor(senders_[scheduler_.id()], "inproc://monitor",
                              ZMQ_EVENT_ALL));
  }
  monitorThread_ = new std::thread(&Van::monitor, this);
  monitorThread_->detach();
}
Example #7
0
	Bool CZmq::StartMonitor(UInt32 iEvents, const AString& sAddr)
	{
		if (m_pHandle)
		{
			Long lMonitorId = (Long)m_pHandle;
			Char sMonitorAddr[DEFAULT_SIZE] = {0};
			
			if (sAddr.size())
				sprintf(sMonitorAddr, "%s", sAddr.c_str());
			else
				sprintf(sMonitorAddr, "inproc://project-monitor-%ld", lMonitorId);
			
			if (zmq_socket_monitor(m_pHandle, sMonitorAddr, (Int32)iEvents) == UTIL_ERROR)
				return false;

			if (!sAddr.size())
			{
				if (m_pMonitor)
				{
					zmq_close(m_pMonitor);
					m_pMonitor = 0;
				}

				m_pMonitor = zmq_socket(g_ZmqManager->GetZmqCtx(), HZMQ_PAIR);
				if (!m_pMonitor)
				{
					FillErr();
					return false;
				}

				Int32 iLinger = 0;
				zmq_setsockopt (m_pMonitor, ZMQ_LINGER, &iLinger, sizeof(iLinger));
				
				Int32 iTimeout = HZMQ_TIMEOUT;
				zmq_setsockopt (m_pMonitor, ZMQ_RCVTIMEO, &iTimeout, sizeof(iTimeout));
				zmq_setsockopt (m_pMonitor, ZMQ_SNDTIMEO, &iTimeout, sizeof(iTimeout));

				Int32 iRet = zmq_connect(m_pMonitor, sMonitorAddr);
				if (iRet == UTIL_ERROR)
				{
					FillErr();			
					return false;
				}
			}
			return true;
		}

		return false;
	}
Example #8
0
static void
s_self_destroy (self_t **self_p)
{
    assert (self_p);
    if (*self_p) {
        self_t *self = *self_p;
#if defined (ZMQ_EVENT_ALL)
        zmq_socket_monitor (self->monitored, NULL, 0);
#endif
        zpoller_destroy (&self->poller);
        zsock_destroy (&self->sink);
        free (self);
        *self_p = NULL;
    }
}
Example #9
0
void
zmonitor_destroy (zmonitor_t **self_p)
{
    assert (self_p);
    if (*self_p) {
        zmonitor_t *self = *self_p;
        //  Deregister monitor endpoint
        zmq_socket_monitor (self->socket, NULL, 0);
        zstr_send (self->pipe, "TERMINATE");
        char *reply = zstr_recv (self->pipe);
        zstr_free (&reply);
        free (self);
        *self_p = NULL;
    }
}
Example #10
0
	Bool CZmq::StopMonitor()
	{
		if (m_pHandle)
		{
			if (m_pMonitor)
			{
				zmq_close(m_pMonitor);
				m_pMonitor = 0;
			}

			if (zmq_socket_monitor(m_pHandle, 0, 0) == UTIL_ERROR)
				return false;

			return true;
		}
		return false;
	}
Example #11
0
static void
s_self_start (self_t *self)
{
    assert (!self->sink);
    char *endpoint = zsys_sprintf ("inproc://zmonitor-%p", self->monitored);
    int rc;
#if defined (ZMQ_EVENT_ALL)
    rc = zmq_socket_monitor (self->monitored, endpoint, self->events);
    assert (rc == 0);
#endif
    self->sink = zsock_new (ZMQ_PAIR);
    assert (self->sink);
    rc = zsock_connect (self->sink, "%s", endpoint);
    assert (rc == 0);
    zpoller_add (self->poller, self->sink);
    free (endpoint);
}
Example #12
0
static void prep_server_socket (int set_heartbeats_,
                                int is_curve_,
                                void **server_out_,
                                void **mon_out_,
                                char *endpoint_,
                                size_t ep_length_,
                                int socket_type_)
{
    //  We'll be using this socket in raw mode
    void *server = test_context_socket (socket_type_);

    int value = 0;
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_setsockopt (server, ZMQ_LINGER, &value, sizeof (value)));

    if (set_heartbeats_) {
        value = 50;
        TEST_ASSERT_SUCCESS_ERRNO (
          zmq_setsockopt (server, ZMQ_HEARTBEAT_IVL, &value, sizeof (value)));
    }

    if (is_curve_)
        setup_curve (server, 1);

    bind_loopback_ipv4 (server, endpoint_, ep_length_);

    //  Create and connect a socket for collecting monitor events on dealer
    void *server_mon = test_context_socket (ZMQ_PAIR);

    TEST_ASSERT_SUCCESS_ERRNO (zmq_socket_monitor (
      server, "inproc://monitor-dealer",
      ZMQ_EVENT_CONNECTED | ZMQ_EVENT_DISCONNECTED | ZMQ_EVENT_ACCEPTED));

    //  Connect to the inproc endpoint so we'll get events
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_connect (server_mon, "inproc://monitor-dealer"));

    *server_out_ = server;
    *mon_out_ = server_mon;
}
static void
prep_server_socket(void * ctx, int set_heartbeats, int is_curve, void ** server_out, void ** mon_out)
{
    int rc;
    //  We'll be using this socket in raw mode
    void *server = zmq_socket (ctx, ZMQ_ROUTER);
    assert (server);

    int value = 0;
    rc = zmq_setsockopt (server, ZMQ_LINGER, &value, sizeof (value));
    assert (rc == 0);

    if(set_heartbeats) {
        value = 50;
        rc = zmq_setsockopt (server, ZMQ_HEARTBEAT_IVL, &value, sizeof(value));
        assert (rc == 0);
    }

    if(is_curve)
        setup_curve(server, 1);

    rc = zmq_bind (server, "tcp://127.0.0.1:5556");
    assert (rc == 0);

    //  Create and connect a socket for collecting monitor events on dealer
    void *server_mon = zmq_socket (ctx, ZMQ_PAIR);
    assert (server_mon);

    rc = zmq_socket_monitor (server, "inproc://monitor-dealer",
          ZMQ_EVENT_CONNECTED | ZMQ_EVENT_DISCONNECTED | ZMQ_EVENT_ACCEPTED);
    assert (rc == 0);

    //  Connect to the inproc endpoint so we'll get events
    rc = zmq_connect (server_mon, "inproc://monitor-dealer");
    assert (rc == 0);

    *server_out = server;
    *mon_out = server_mon;
}
Example #14
0
JNIEXPORT jboolean JNICALL Java_org_zeromq_ZMQ_00024Socket_monitor (JNIEnv *env,
                                                                    jobject obj,
                                                                    jstring addr,
                                                                    jint events)
{
#if ZMQ_VERSION >= ZMQ_MAKE_VERSION(3,2,0)
    void *socket = get_socket (env, obj);

    const char *c_addr = addr ? env->GetStringUTFChars (addr, NULL) : NULL;

    int rc = zmq_socket_monitor(socket , c_addr, events);
    int err = rc < 0 ? zmq_errno() : 0;

    env->ReleaseStringUTFChars (addr, c_addr);

    if (rc < 0) {
        raise_exception (env, err);
        return JNI_FALSE;
    }
    return JNI_TRUE;
#else
    return JNI_FALSE;
#endif
}
Example #15
0
int main (void)
{
    setup_test_environment();

    void *ctx = zmq_ctx_new ();
    assert (ctx);
    
    //  We'll monitor these two sockets
    void *client = zmq_socket (ctx, ZMQ_DEALER);
    assert (client);
    void *server = zmq_socket (ctx, ZMQ_DEALER);
    assert (server);

    //  Socket monitoring only works over inproc://
    int rc = zmq_socket_monitor (client, "tcp://127.0.0.1:9999", 0);
    assert (rc == -1);
    assert (zmq_errno () == EPROTONOSUPPORT);

    //  Monitor all events on client and server sockets
    rc = zmq_socket_monitor (client, "inproc://monitor-client", ZMQ_EVENT_ALL);
    assert (rc == 0);
    rc = zmq_socket_monitor (server, "inproc://monitor-server", ZMQ_EVENT_ALL);
    assert (rc == 0);

    //  Create two sockets for collecting monitor events
    void *client_mon = zmq_socket (ctx, ZMQ_PAIR);
    assert (client_mon);
    void *server_mon = zmq_socket (ctx, ZMQ_PAIR);
    assert (server_mon);

    //  Connect these to the inproc endpoints so they'll get events
    rc = zmq_connect (client_mon, "inproc://monitor-client");
    assert (rc == 0);
    rc = zmq_connect (server_mon, "inproc://monitor-server");
    assert (rc == 0);
    
    //  Now do a basic ping test
    rc = zmq_bind (server, "tcp://127.0.0.1:9998");
    assert (rc == 0);
    rc = zmq_connect (client, "tcp://127.0.0.1:9998");
    assert (rc == 0);
    bounce (client, server);

    //  Close client and server
    close_zero_linger (client);
    close_zero_linger (server);
    
    //  Now collect and check events from both sockets
    int event = get_monitor_event (client_mon, NULL, NULL);
    if (event == ZMQ_EVENT_CONNECT_DELAYED)
        event = get_monitor_event (client_mon, NULL, NULL);
    assert (event == ZMQ_EVENT_CONNECTED);
    event = get_monitor_event (client_mon, NULL, NULL);
    assert (event == ZMQ_EVENT_MONITOR_STOPPED);

    //  This is the flow of server events
    event = get_monitor_event (server_mon, NULL, NULL);
    assert (event == ZMQ_EVENT_LISTENING);
    event = get_monitor_event (server_mon, NULL, NULL);
    assert (event == ZMQ_EVENT_ACCEPTED);
    event = get_monitor_event (server_mon, NULL, NULL);
    assert (event == ZMQ_EVENT_CLOSED);
    event = get_monitor_event (server_mon, NULL, NULL);
    assert (event == ZMQ_EVENT_MONITOR_STOPPED);
    
    //  Close down the sockets
    close_zero_linger (client_mon);
    close_zero_linger (server_mon);
    zmq_ctx_term (ctx);

    return 0 ;
}
Example #16
0
int main (void)
{
    setup_test_environment();
    int rc;
    void *req;
    void *req2;
    void *rep;
    void* threads [3];

    addr = "tcp://127.0.0.1:5560";

    //  Create the infrastructure
    void *ctx = zmq_ctx_new ();
    assert (ctx);

    // REP socket
    rep = zmq_socket (ctx, ZMQ_REP);
    assert (rep);

    // Assert supported protocols
    rc =  zmq_socket_monitor (rep, addr.c_str(), 0);
    assert (rc == -1);
    assert (zmq_errno() == EPROTONOSUPPORT);

    // Deregister monitor
    rc =  zmq_socket_monitor (rep, NULL, 0);
    assert (rc == 0);

    // REP socket monitor, all events
    rc = zmq_socket_monitor (rep, "inproc://monitor.rep", ZMQ_EVENT_ALL);
    assert (rc == 0);
    threads [0] = zmq_threadstart(&rep_socket_monitor, ctx);
    
    // REQ socket
    req = zmq_socket (ctx, ZMQ_REQ);
    assert (req);

    // REQ socket monitor, all events
    rc = zmq_socket_monitor (req, "inproc://monitor.req", ZMQ_EVENT_ALL);
    assert (rc == 0);
    threads [1] = zmq_threadstart(&req_socket_monitor, ctx);
    zmq_sleep(1);

    // Bind REQ and REP
    rc = zmq_bind (rep, addr.c_str());
    assert (rc == 0);

    rc = zmq_connect (req, addr.c_str());
    assert (rc == 0);

    bounce (rep, req);
    
    // 2nd REQ socket
    req2 = zmq_socket (ctx, ZMQ_REQ);
    assert (req2);

    // 2nd REQ socket monitor, connected event only
    rc = zmq_socket_monitor (req2, "inproc://monitor.req2", ZMQ_EVENT_CONNECTED);
    assert (rc == 0);
    threads [2] = zmq_threadstart(&req2_socket_monitor, ctx);

    rc = zmq_connect (req2, addr.c_str());
    assert (rc == 0);

    // Close the REP socket
    rc = zmq_close (rep);
    assert (rc == 0);

    // Allow some time for detecting error states
    zmq_sleep(1);

    //  Close the REQ socket
    rc = zmq_close (req);
    assert (rc == 0);

    //  Close the 2nd REQ socket
    rc = zmq_close (req2);
    assert (rc == 0);

    zmq_ctx_term (ctx);

    // Expected REP socket events
    assert (rep_socket_events & ZMQ_EVENT_LISTENING);
    assert (rep_socket_events & ZMQ_EVENT_ACCEPTED);
    assert (rep_socket_events & ZMQ_EVENT_CLOSED);

    // Expected REQ socket events
    assert (req_socket_events & ZMQ_EVENT_CONNECTED);
    assert (req_socket_events & ZMQ_EVENT_DISCONNECTED);
    assert (req_socket_events & ZMQ_EVENT_CLOSED);

    // Expected 2nd REQ socket events
    assert (req2_socket_events & ZMQ_EVENT_CONNECTED);
    assert (!(req2_socket_events & ZMQ_EVENT_CLOSED));

    for (unsigned int i = 0; i < 3; ++i)
        zmq_threadclose(threads [i]);

    return 0 ;
}
Example #17
0
int main (void)
{
    setup_test_environment ();

    size_t len = MAX_SOCKET_STRING;
    char my_endpoint[MAX_SOCKET_STRING];
    void *ctx = zmq_ctx_new ();
    assert (ctx);

    //  We'll monitor these two sockets
    void *client = zmq_socket (ctx, ZMQ_DEALER);
    assert (client);
    void *server = zmq_socket (ctx, ZMQ_DEALER);
    assert (server);

    //  Socket monitoring only works over inproc://
    int rc = zmq_socket_monitor (client, "tcp://127.0.0.1:*", 0);
    assert (rc == -1);
    assert (zmq_errno () == EPROTONOSUPPORT);

    //  Monitor all events on client and server sockets
    rc = zmq_socket_monitor (client, "inproc://monitor-client", ZMQ_EVENT_ALL);
    assert (rc == 0);
    rc = zmq_socket_monitor (server, "inproc://monitor-server", ZMQ_EVENT_ALL);
    assert (rc == 0);

    //  Create two sockets for collecting monitor events
    void *client_mon = zmq_socket (ctx, ZMQ_PAIR);
    assert (client_mon);
    void *server_mon = zmq_socket (ctx, ZMQ_PAIR);
    assert (server_mon);

    //  Connect these to the inproc endpoints so they'll get events
    rc = zmq_connect (client_mon, "inproc://monitor-client");
    assert (rc == 0);
    rc = zmq_connect (server_mon, "inproc://monitor-server");
    assert (rc == 0);

    //  Now do a basic ping test
    rc = zmq_bind (server, "tcp://127.0.0.1:*");
    assert (rc == 0);
    rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len);
    assert (rc == 0);
    rc = zmq_connect (client, my_endpoint);
    assert (rc == 0);
    bounce (server, client);

    //  Close client and server
    close_zero_linger (client);
    close_zero_linger (server);

    //  Now collect and check events from both sockets
    int event = get_monitor_event (client_mon, NULL, NULL);
    if (event == ZMQ_EVENT_CONNECT_DELAYED)
        event = get_monitor_event (client_mon, NULL, NULL);
    assert (event == ZMQ_EVENT_CONNECTED);
#ifdef ZMQ_BUILD_DRAFT_API
    expect_monitor_event (client_mon, ZMQ_EVENT_HANDSHAKE_SUCCEEDED);
#endif
    expect_monitor_event (client_mon, ZMQ_EVENT_MONITOR_STOPPED);

    //  This is the flow of server events
    expect_monitor_event (server_mon, ZMQ_EVENT_LISTENING);
    expect_monitor_event (server_mon, ZMQ_EVENT_ACCEPTED);
#ifdef ZMQ_BUILD_DRAFT_API
    expect_monitor_event (server_mon, ZMQ_EVENT_HANDSHAKE_SUCCEEDED);
#endif
    event = get_monitor_event (server_mon, NULL, NULL);
    //  Sometimes the server sees the client closing before it gets closed.
    if (event != ZMQ_EVENT_DISCONNECTED) {
        assert (event == ZMQ_EVENT_CLOSED);
        event = get_monitor_event (server_mon, NULL, NULL);
    }
    if (event != ZMQ_EVENT_DISCONNECTED) {
        assert (event == ZMQ_EVENT_MONITOR_STOPPED);
    }

    //  Close down the sockets
    close_zero_linger (client_mon);
    close_zero_linger (server_mon);
    zmq_ctx_term (ctx);

    return 0;
}
Example #18
0
int zero_native_monitor(mq_socket_t *socket, char *address, int events)
{
    return(zmq_socket_monitor(socket->arg, address, events));
}
  // TODO: read/write external should use buffer->valid_db_size instead of passing in additional
  // parameters
  void *DiskIOThread::run_thread(void *_thr_info){
    DiskIOThread *diskio = (DiskIOThread *) _thr_info;

    int ret = zmq_socket_monitor(diskio->sock, "inproc://monitor.router_sock", ZMQ_EVENT_CONNECTED | ZMQ_EVENT_ACCEPTED | ZMQ_EVENT_DISCONNECTED);
    if(ret < 0){
      diskio->status = -1;
      return NULL;
    }

    zmq::socket_t monitor_sock(*diskio->zmq_ctx, ZMQ_PAIR);
    try{
      monitor_sock.connect("inproc://monitor.router_sock");
    }catch(zmq::error_t &e){
      std::cout << "monitor socket create failed" << std::endl;
      return NULL;
    }

    zmq::pollitem_t pollitems[3];
    pollitems[0].socket = diskio->sock;
    pollitems[0].events = ZMQ_POLLIN;
    pollitems[1].socket = monitor_sock;
    pollitems[1].events = ZMQ_POLLIN;
    pollitems[2].socket = diskio->cancel_sock;
    pollitems[2].events = ZMQ_POLLIN;

    while(true){
      try {
        zmq::poll(pollitems, 3);
      }catch(...){
        std::cout << "error from poll!" << std::endl;
        return NULL;
      }

      if(pollitems[2].revents){
        int32_t cid;
        boost::shared_array<uint8_t> data;
        int32_t len = recv_msg(diskio->cancel_sock, cid, data);
        if(len < 0){
          diskio->status = -1;
          return NULL;
        }

        EMsgType type = *((EMsgType *) data.get());
        int32_t extern_cid, sock_idx;

        switch(type){
        case DiskIOCancel:
          extern_cid = zmq_rid_to_cid(cid);
          sock_idx = cid_to_sock_idx(extern_cid);
          diskio->client_valid[sock_idx] = false;
          break;
        case DiskIOEnable:
          extern_cid = zmq_rid_to_cid(cid);
          sock_idx = cid_to_sock_idx(extern_cid);
          diskio->client_valid[sock_idx] = true;
          break;
        default:
          assert(0);
          diskio->status = -1;
          return NULL;
        }
        continue;
      }

      if(pollitems[0].revents){
        int32_t cid;
        boost::shared_array<uint8_t> data;
        int32_t len = recv_msg(diskio->sock, cid, data);
        if(len < 0){
          assert(0);
          diskio->status = -1;
          return NULL;
        }
        //std::cout << "received from cid = " << std::hex << cid << std::dec << std::endl;
        EMsgType type = *((EMsgType *) data.get());
        Buffer *buf;
        std::string base; // for DiskIOExternal, base is actually fullpath
        int32_t extern_cid;
        int32_t sock_idx;
        if(type == DiskIORead || type == DiskIOWrite || type == DiskIOReadExternal
            || type == DiskIOWriteExternal || type == DiskIOWriteRead){
          len = recv_msg(diskio->sock, data);
          if(len < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          buf = *((Buffer **) data.get());
          len = recv_msg(diskio->sock, data);
          if(len < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          base = std::string((char *) data.get());
        }

        //std::cout << "request type = " << type << std::endl;

        block_id_t bid;
        int32_t extern_size;
        int32_t dbsize;
        int64_t offset;
        int32_t fidx;
        int32_t suc;
        std::string fname;
        int32_t rsize;
        int32_t wsuc;
        int32_t rd_db_id;
        EMsgType re_type;
        switch(type){
        case DiskIORead:
          bid = buf->get_block_id();

          dbsize = buf->get_db_size();
          fidx = get_file_idx(bid, dbsize, offset);
          fname = build_filename(diskio->datapath, base, fidx);

          extern_cid = zmq_rid_to_cid(cid);
          sock_idx = cid_to_sock_idx(extern_cid);
          if(!diskio->client_valid[sock_idx]){
            rsize = 0;
            re_type = DiskIOReadNotDone;
          }else{
            // read data from specified file, with
            rsize = dir_read(buf->get_db_ptr(), dbsize, fname.c_str(), offset);
            re_type = DiskIOReadDone;
          }

          // finished reading send back message
          suc = send_msg(diskio->sock, cid, (uint8_t *) &re_type, sizeof(Buffer *), ZMQ_SNDMORE);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          send_msg(diskio->sock, (uint8_t *) &buf, sizeof(Buffer *), ZMQ_SNDMORE);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          suc = send_msg(diskio->sock, (uint8_t *) &rsize, sizeof(int32_t), 0);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          break;

        case DiskIOWrite:

          bid = buf->get_block_id();

          dbsize = buf->get_db_size();
          fidx = get_file_idx(bid, dbsize, offset);
          fname = build_filename(diskio->datapath, base, fidx);
          // read data from specified file, with
          wsuc = dir_write(buf->get_db_ptr(), dbsize, fname.c_str(), offset);
          re_type = DiskIOWriteDone;

          // finished reading send back message
          suc = send_msg(diskio->sock, cid, (uint8_t *) &re_type, sizeof(Buffer *), ZMQ_SNDMORE);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          send_msg(diskio->sock, (uint8_t *) &buf, sizeof(Buffer *), ZMQ_SNDMORE);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          suc = send_msg(diskio->sock, (uint8_t *) &wsuc, sizeof(int32_t), 0);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          break;
        case DiskIOWriteRead:
          len = recv_msg(diskio->sock, data);
          if(len < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          rd_db_id = *((int32_t *) data.get());

          bid = buf->get_block_id();
          dbsize = buf->get_db_size();
          fidx = get_file_idx(bid, dbsize, offset);
          fname = build_filename(diskio->datapath, base, fidx);

          // write data to
          wsuc = dir_write(buf->get_db_ptr(), dbsize, fname.c_str(), offset);

          int32_t resp_val;

          extern_cid = zmq_rid_to_cid(cid);
          sock_idx = cid_to_sock_idx(extern_cid);
          if(!diskio->client_valid[sock_idx]){
            resp_val = 0;
            re_type = DiskIOWriteReadWriteDone;
          }else{
            if(wsuc == 0){
              fidx = get_file_idx(rd_db_id, dbsize, offset);
              fname = build_filename(diskio->datapath, base, fidx);
              rsize = dir_read(buf->get_db_ptr(), dbsize, fname.c_str(), offset);
            }
            if(wsuc < 0 || rsize < 0){
              resp_val = -1;
            }else{
              resp_val = rsize;
            }
            re_type = DiskIOWriteReadDone;
          }
          // finished reading send back message
          suc = send_msg(diskio->sock, cid, (uint8_t *) &re_type, sizeof(Buffer *), ZMQ_SNDMORE);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          send_msg(diskio->sock, (uint8_t *) &buf, sizeof(Buffer *), ZMQ_SNDMORE);
          if(suc < 0){
            diskio->status = -1;
            return NULL;
          }
          suc = send_msg(diskio->sock, (uint8_t *) &resp_val, sizeof(int32_t), 0);
          if(suc < 0){
            diskio->status = -1;
            return NULL;
          }
          break;
        case DiskIOReadExternal:

          len = recv_msg(diskio->sock, data);
          if(len < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          offset = *((int64_t *) data.get());

          len = recv_msg(diskio->sock, data);
          if(len < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          extern_size = *((int32_t *) data.get());
          //std::cout << "size to read = " << extern_size << std::endl;

          extern_cid = zmq_rid_to_cid(cid);
          sock_idx = cid_to_sock_idx(extern_cid);
          if(!diskio->client_valid[sock_idx]){
            rsize = 0;
            re_type = DiskIOReadExternalNotDone;
          }else{
            //std::cout << "received request to read external data" << std::endl;
            dbsize = buf->get_db_size();
            if(extern_size > dbsize){
              assert(0);
              diskio->status = -1;
              return NULL;
            }
            fname = std::string(base);
            // read data from specified file, with
            rsize = dir_read(buf->get_db_ptr(), extern_size, fname.c_str(), offset);
            re_type = DiskIOReadExternalDone;
          }
          buf->set_valid_db_size(rsize);

          // finished reading send back message
          suc = send_msg(diskio->sock, cid, (uint8_t *) &re_type, sizeof(EMsgType),
                         ZMQ_SNDMORE);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }

          send_msg(diskio->sock, (uint8_t *) &buf, sizeof(Buffer *), ZMQ_SNDMORE);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }

          suc = send_msg(diskio->sock, (uint8_t *) &rsize, sizeof(int32_t), 0);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          break;

        case DiskIOWriteExternal:
          len = recv_msg(diskio->sock, data);
          if(len < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          offset = *((int64_t *) data.get());

          len = recv_msg(diskio->sock, data);
          if(len < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }

          // if has been canceled, don't send response
          extern_cid = zmq_rid_to_cid(cid);
          sock_idx = cid_to_sock_idx(extern_cid);
          if(diskio->client_sock[sock_idx] == NULL) continue;

          extern_size = *((int32_t *) data.get());

          dbsize = buf->get_db_size();
          //std::cout << "extern_size = " << extern_size << " dbsize = " << dbsize << std::endl;
          assert(extern_size <= dbsize);

          fname = std::string(base);

          // read data from specified file, with
          rsize = reg_write(buf->get_db_ptr(), extern_size, fname.c_str(), offset);
          re_type = DiskIOWriteExternalDone;

          // finished reading send back message
          suc = send_msg(diskio->sock, cid, (uint8_t *) &re_type, sizeof(Buffer *),
              ZMQ_SNDMORE);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          send_msg(diskio->sock, (uint8_t *) &buf, sizeof(Buffer *), ZMQ_SNDMORE);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          suc = send_msg(diskio->sock, (uint8_t *) &rsize, sizeof(int32_t), 0);
          if(suc < 0){
            assert(0);
            diskio->status = -1;
            return NULL;
          }
          break;
        case DiskIOShutDown:
          std::cout << "diskio thread received shutdown message" << std::endl;
          return NULL;
          break;
        case DiskIOConn:
          break;
        default:
          std::cout << "!!!!!!!!!diskio thread msgtype = " << type << std::endl;
          assert(0);
          diskio->status = -1;
          return NULL;
        }
        continue;
      }

      if(pollitems[1].revents){
        zmq_event_t *event;
        boost::shared_array<uint8_t> data;
        int len;
        len = recv_msg(monitor_sock, data);

        if (len < 0){
          assert(0);
          diskio->status = -11;
          return NULL;
        }
        assert(len == sizeof(zmq_event_t));
        event = (zmq_event_t *) data.get();

        switch (event->event){
        case ZMQ_EVENT_CONNECTED:
          std::cout << "established connection." << std::endl;
          break;
        case ZMQ_EVENT_ACCEPTED:
          std::cout << "connection accepted" << std::endl;
          break;
        case ZMQ_EVENT_DISCONNECTED:
          std::cout << "client disconnected" << std::endl;
          break;
        default:
          std::cout << "unexpected event" << std::endl;
          return NULL;
        }
        continue;
      }
    }
    return NULL;
  }
Example #20
0
void zeromq_thread() {
	{
		void* objectContext = zmq_ctx_new();
		void* objectSocket = zmq_socket(objectContext, ZMQ_PAIR);
		
		{
			char charZeromq[1024] = { };
			
			sprintf(charZeromq, "tcp://localhost:%d", main_intZeromq);
			
			if (zmq_connect(objectSocket, charZeromq) == -1) {
				printf("zeromq: %s\n", zmq_strerror(zmq_errno()));
			}
		}
		
		{
			zeromq_objectSocket = objectSocket;
		}
		
		{
			void* objectMonitor = zmq_socket(objectContext, ZMQ_PAIR);
			
			{
				if (zmq_socket_monitor(objectSocket, "inproc://minichess-zeromq-monitor", ZMQ_EVENT_ALL) == -1) {
					printf("zeromq: %s\n", zmq_strerror(zmq_errno()));
				}
				
				if (zmq_connect(objectMonitor, "inproc://minichess-zeromq-monitor") == -1) {
					printf("zeromq: %s\n", zmq_strerror(zmq_errno()));
				}
			}
			
			{
				do {
					int intEventspecifier = 0;
					int intEventvalue = 0;
					char charEventaddress[256] = { };
					
					#if (ZMQ_VERSION_MAJOR == 3)
						{
							zmq_msg_t objectMessage = { };
							
							zmq_msg_init(&objectMessage);
							
							if (zmq_recvmsg(objectMonitor, &objectMessage, 0) == -1) {
								printf("zeromq: %s\n", zmq_strerror(zmq_errno()));
							}
							
							zmq_event_t objectEvent = { };
							
							memcpy(&objectEvent, zmq_msg_data(&objectMessage), sizeof(objectEvent));
							
							intEventspecifier = objectEvent.event;
							intEventvalue = 0
							charEventaddress[0] = '\0';
							
							zmq_msg_close(&objectMessage);
						}
						
					#elif (ZMQ_VERSION_MAJOR == 4)
						{
							zmq_msg_t objectMessage = { };
							
							zmq_msg_init(&objectMessage);
							
							if (zmq_recvmsg(objectMonitor, &objectMessage, 0) == -1) {
								printf("zeromq: %s\n", zmq_strerror(zmq_errno()));
							}
							
							uint8_t* intData = (uint8_t*) (zmq_msg_data(&objectMessage));
							
							intEventspecifier = *(uint16_t*) (intData + 0);
							intEventvalue = *(uint32_t*) (intData + 2);
							
							zmq_msg_close(&objectMessage);
						}
						
						{
							zmq_msg_t objectMessage = { };
							
							zmq_msg_init(&objectMessage);
							
							if (zmq_recvmsg(objectMonitor, &objectMessage, 0) == -1) {
								printf("zeromq: %s\n", zmq_strerror(zmq_errno()));
							}
							
							charEventaddress[0] = '\0';
							
							zmq_msg_close(&objectMessage);
						}
						
					#endif
					
					{
						if (intEventspecifier == ZMQ_EVENT_CONNECTED) {
							{
								zeromq_boolConnected = true;
								
								webserver_broadcast("zeromq_status", NULL);
							}
							
							{
								cJSON* objectOut = cJSON_CreateObject();
								cJSON* objectIn = NULL;
								
								{
									cJSON_AddStringToObject(objectOut, "strFunction", "ping");
								}
								
								{
									zeromq_send(objectOut);
									
									objectIn = zeromq_recv();
								}
								
								{
									strcpy(zeromq_charClient, cJSON_GetObjectItem(objectIn, "strOut")->valuestring);
									
									webserver_broadcast("zeromq_name", NULL);
								}
								
								cJSON_Delete(objectOut);
								cJSON_Delete(objectIn);
							}
							
							{
								printf("zeromq: connected to %s\n", zeromq_charClient);
							}
							
						} else if (intEventspecifier == ZMQ_EVENT_DISCONNECTED) {
							{
								zeromq_boolConnected = false;
								
								webserver_broadcast("zeromq_status", NULL);
							}
							
							{
								printf("zeromq: disconnected from %s\n", zeromq_charClient);
							}
							
						}
					}
					
					{
						if (intEventspecifier == ZMQ_EVENT_CONNECTED) {
							int intTest = 0;
							
							if (intTest > 0) {
								setbuf(stdout, NULL);
							}
							
							if (intTest > 0) {
								printf("test_board: ");
								printf("%d\n", test_board());
							}
							
							if (intTest > 1) {
								printf("test_winner: ");
								printf("%d\n", test_winner());
							}
							
							if (intTest > 2) {
								printf("test_isValid: ");
								printf("%d\n", test_isValid());
							}
							
							if (intTest > 3) {
								printf("test_isEnemy: ");
								printf("%d\n", test_isEnemy());
							}
							
							if (intTest > 4) {
								printf("test_isOwn: ");
								printf("%d\n", test_isOwn());
							}
							
							if (intTest > 5) {
								printf("test_isNothing: ");
								printf("%d\n", test_isNothing());
							}
							
							if (intTest > 6) {
								printf("test_eval: ");
								printf("%d\n", test_eval());
							}
							
							if (intTest > 7) {
								printf("test_moves: ");
								printf("%d\n", test_moves());
							}
							
							if (intTest > 8) {
								printf("test_move: ");
								printf("%d\n", test_move());
							}
							
							if (intTest > 9) {
								printf("test_undo: ");
								printf("%d\n", test_undo());
							}
							
							if (intTest > 10) {
								printf("test_movesShuffled: ");
								printf("%d\n", test_movesShuffled());
							}
							
							if (intTest > 11) {
								printf("test_movesEvaluated: ");
								printf("%d\n", test_movesEvaluated());
							}
							
							if (intTest > 12) {
								printf("test_moveRandom: ");
								printf("%d\n", test_moveRandom());
							}
							
							if (intTest > 13) {
								printf("test_moveGreedy: ");
								printf("%d\n", test_moveGreedy());
							}
							
							if (intTest > 14) {
								printf("test_moveNegamax: ");
								printf("%d\n", test_moveNegamax());
							}
							
							if (intTest > 15) {
								printf("test_moveAlphabeta: ");
								printf("%d\n", test_moveAlphabeta());
							}
						}
					}
				} while (pthread_mutex_trylock(&zeromq_objectRunning) != 0);
				
				pthread_mutex_unlock(&zeromq_objectRunning);
			}
			
			zmq_close(objectMonitor);
		}
		
		zmq_close(objectSocket);
		zmq_ctx_destroy(objectContext);
	}
}
Example #21
0
static void
test_stream_handshake_timeout_accept (void)
{
    int rc;

    //  Set up our context and sockets
    void *ctx = zmq_ctx_new ();
    assert (ctx);

    //  We use this socket in raw mode, to make a connection and send nothing
    void *stream = zmq_socket (ctx, ZMQ_STREAM);
    assert (stream);

    int zero = 0;
    rc = zmq_setsockopt (stream, ZMQ_LINGER, &zero, sizeof (zero));
    assert (rc == 0);
    rc = zmq_connect (stream, "tcp://localhost:5557");
    assert (rc == 0);

    //  We'll be using this socket to test TCP stream handshake timeout
    void *dealer = zmq_socket (ctx, ZMQ_DEALER);
    assert (dealer);
    rc = zmq_setsockopt (dealer, ZMQ_LINGER, &zero, sizeof (zero));
    assert (rc == 0);
    int val, tenth = 100;
    size_t vsize = sizeof(val);

    // check for the expected default handshake timeout value - 30 sec
    rc = zmq_getsockopt (dealer, ZMQ_HANDSHAKE_IVL, &val, &vsize);
    assert (rc == 0);
    assert (vsize == sizeof(val));
    assert (val == 30000);
    // make handshake timeout faster - 1/10 sec
    rc = zmq_setsockopt (dealer, ZMQ_HANDSHAKE_IVL, &tenth, sizeof (tenth));
    assert (rc == 0);
    vsize = sizeof(val);
    // make sure zmq_setsockopt changed the value
    rc = zmq_getsockopt (dealer, ZMQ_HANDSHAKE_IVL, &val, &vsize);
    assert (rc == 0);
    assert (vsize == sizeof(val));
    assert (val == tenth);

    //  Create and connect a socket for collecting monitor events on dealer
    void *dealer_mon = zmq_socket (ctx, ZMQ_PAIR);
    assert (dealer_mon);

    rc = zmq_socket_monitor (dealer, "inproc://monitor-dealer",
          ZMQ_EVENT_CONNECTED | ZMQ_EVENT_DISCONNECTED | ZMQ_EVENT_ACCEPTED);
    assert (rc == 0);

    //  Connect to the inproc endpoint so we'll get events
    rc = zmq_connect (dealer_mon, "inproc://monitor-dealer");
    assert (rc == 0);

    // bind dealer socket to accept connection from non-sending stream socket
    rc = zmq_bind (dealer, "tcp://127.0.0.1:5557");
    assert (rc == 0);

    // we should get ZMQ_EVENT_ACCEPTED and then ZMQ_EVENT_DISCONNECTED
    int event = get_monitor_event (dealer_mon, NULL, NULL);
    assert (event == ZMQ_EVENT_ACCEPTED);
    event = get_monitor_event (dealer_mon, NULL, NULL);
    assert (event == ZMQ_EVENT_DISCONNECTED);

    rc = zmq_close (dealer);
    assert (rc == 0);

    rc = zmq_close (dealer_mon);
    assert (rc == 0);

    rc = zmq_close (stream);
    assert (rc == 0);

    rc = zmq_ctx_term (ctx);
    assert (rc == 0);
}