Пример #1
0
//./a.out filename
int main(int argc, const char *argv[])
{
	int msg_id;
	msg_t msg;	

	if(argc < 2){
		fprintf(stderr,"Usage : %s <filename>\n",argv[0]);
		exit(EXIT_FAILURE);
	}
	
	msg_id = msg_init(argv[1]);
	
	while(1){
		printf("Input > ");
		fgets(msg.mtxt,sizeof(msg.mtxt),stdin);
		msg.mtxt[strlen(msg.mtxt) - 1] = '\0';
		msg.msg_type = MSG_TYPE;

		send_msg(msg_id,&msg,sizeof(msg_t) - sizeof(long));
		
		if(strncmp(msg.mtxt,"quit",4) == 0){
			break;
		}
	}
	
	msg_delete(msg_id);

	return 0;
}
Пример #2
0
void MsgStorage::invoke(const string& method, 
			const AmArg& args, AmArg& ret) {
  if(method == "msg_new"){
    MessageDataFile* f = 
      dynamic_cast<MessageDataFile*>(args.get(3).asObject());
    if (NULL == f) {
      throw(string("message data is not a file ptr."));
    }
    ret.push(msg_new(args.get(0).asCStr(),
		     args.get(1).asCStr(),
		     args.get(2).asCStr(),
		     f->fp));
  } else if(method == "msg_get"){
    msg_get(args.get(0).asCStr(),
	    args.get(1).asCStr(),
	    args.get(2).asCStr(),
	    ret);
  } else if(method == "msg_markread"){
    ret.push(msg_markread(args.get(0).asCStr(),
			  args.get(1).asCStr(),
			  args.get(2).asCStr()));
  } else if(method == "msg_delete"){
    ret.push(msg_delete(args.get(0).asCStr(),
			args.get(1).asCStr(),
			args.get(2).asCStr()));
  } else if(method == "userdir_open"){
    userdir_open(args.get(0).asCStr(),	      
      args.get(1).asCStr(),
      ret);
  } else if(method == "userdir_close"){
    ret.push(userdir_close(args.get(0).asCStr(),
      args.get(1).asCStr()));
  } else if(method == "userdir_getcount"){
    userdir_getcount(args.get(0).asCStr(),
      args.get(1).asCStr(),
      ret);
  } else if(method == "events_subscribe"){
    events_subscribe(args.get(0).asDynInv(),
		     args.get(1).asCStr());
  } else if(method == "events_unsubscribe"){
    events_unsubscribe(args.get(0).asDynInv());
  } else if(method == "_list"){
    ret.push("msg_new");
    ret.push("msg_get");
    ret.push("msg_markread");
    ret.push("msg_delete");
    
    ret.push("userdir_open");
    ret.push("userdir_close");
    ret.push("userdir_getcount");

    ret.push("events_subscribe");
    ret.push("events_unsubscribe");
  }
  else
    throw AmDynInvoke::NotImplemented(method); 
}
Пример #3
0
/*****************************************************************************
 Prototype    : vid_enc_thr
 Description  : image encode thread
 Input        : void *arg  
 Output       : None
 Return Value : void
 Calls        : 
 Called By    : 
 
  History        :
  1.Date         : 2012/3/8
    Author       : Sun
    Modification : Created function

*****************************************************************************/
void *vid_enc_thr(void *arg)
{
	VidEncThrEnv 	env;
	CommonMsg		msgBuf;
	Int32			ret;
	Int32			fdMsg, fdMax;
	fd_set			rdSet;

	ret = vid_enc_thr_init((VidEncThrArg *)arg, (VidEncThrEnv *)&env);
	assert(ret == E_NO);
	if(ret)
		goto exit;

	fdMsg = msg_get_fd(env.hMsg);
	fdMax = fdMsg + 1;

	/* start main loop */
	while(!env.exit) {
		/* wait data ready */
		FD_ZERO(&rdSet);
		FD_SET(fdMsg, &rdSet);
		
		ret = select(fdMax, &rdSet, NULL, NULL, NULL);
		if(ret < 0 && errno != EINTR) {
			ERRSTR("select err");
			break;
		}

		/* no data ready */
		if(!ret)
			continue;

		if(FD_ISSET(fdMsg, &rdSet)) {
			/* process msg */
			msg_process(&env, &msgBuf);
		}
	}

exit:
	if(env.hH264Enc)
		h264_enc_delete(env.hH264Enc);

	if(env.hOsd)
		osd_delete(env.hOsd);

	if(env.hBufEnc)
		buffer_free(env.hBufEnc);

	if(env.hMsg)
		msg_delete(env.hMsg);

	INFO("vid encode thread exit...");
	pthread_exit(0);
	
}
Пример #4
0
/*****************************************************************************
 Prototype    : encoder_delete
 Description  : delete encoder module
 Input        : EncoderHandle hEnc  
 Output       : None
 Return Value : 
 Calls        : 
 Called By    : 
 
  History        :
  1.Date         : 2012/3/17
    Author       : Sun
    Modification : Created function

*****************************************************************************/
Int32 encoder_delete(EncoderHandle hEnc, MsgHandle hCurMsg)
{
	if(!hEnc)
		return E_INVAL;

	/* ask thread to exit */
	if(hEnc->pid > 0) {
		if(hCurMsg) {
			MsgHeader msg;

			/* send msg to our thread to exit */
			msg.cmd = APPCMD_EXIT;
			msg.index = 0;
			msg.dataLen = 0;
			msg.type = MSG_TYPE_REQU;
			msg_send(hCurMsg, msg_get_name(hEnc->hMsg), &msg, 0);
		}

		/* set flag to exit */
		hEnc->exit = TRUE;
		
		pthread_join(hEnc->pid, NULL);
	}

	/* delete modules used */
	if(hEnc->hEncode)
		alg_delete(hEnc->hEncode);

	if(hEnc->hBufEnc)
		buffer_free(hEnc->hBufEnc);

	if(hEnc->hOsd)
		osd_delete(hEnc->hOsd);

	if(hEnc->hPoolEnc)
		buf_pool_delete(hEnc->hPoolEnc);

	if(hEnc->hMsg)
		msg_delete(hEnc->hMsg);

	if(hEnc->hPoolIn)
		buf_pool_free_all(hEnc->hPoolIn);

	free(hEnc);

	return E_NO;
}
Пример #5
0
/**
 * send message with data to client
 *
 * @param [in] h client to inform
 * @param [in] state state to provide
 * @param [in] data data to send
 *
 * @return E_ERR_SUCCESS if successful
 * @return E_ERR_FAILED otherwise
 */
e_mmgr_errors_t client_inform(const client_hdle_t *h, e_mmgr_events_t state,
                              void *data)
{
    size_t size;
    size_t write_size;
    e_mmgr_errors_t ret = E_ERR_SUCCESS;
    mmgr_cli_event_t event = { .id = state, .data = data };
    msg_t msg = { .data = NULL };
    client_t *client = (client_t *)h;

    ASSERT(client != NULL);
    ASSERT(client->set_data[state] != NULL);

    /* do not check data because it can be NULL on purpose */
    client->set_data[state] (&msg, &event);

    size = SIZE_HEADER + msg.hdr.len;
    write_size = size;
    if ((0x01 << state) & client->subscription) {
        if ((ret = cnx_write(client->fd, msg.data, &write_size)) ==
            E_ERR_SUCCESS) {
            if (size != write_size) {
                LOG_ERROR("send failed for client (fd=%d name=%s) send=%d/%d",
                          client->fd, client->name, write_size, size);
                ret = E_ERR_FAILED;
            } else {
                LOG_DEBUG("Client (fd=%d name=%s) informed of: %s", client->fd,
                          client->name, g_mmgr_events[state]);
            }
        }
    } else {
        LOG_DEBUG("Client (fd=%d name=%s) NOT informed of: %s",
                  client->fd, client->name, g_mmgr_events[state]);
    }

    msg_delete(&msg);
    return ret;
}
Пример #6
0
static void *thr_msg(void *arg)
{
	assert(arg);
	TaskEnv *env = (TaskEnv *)arg;
	MsgHandle hMsg;
	MsgData	msgData;	

	hMsg = msg_create(env->name, env->dest, 0);
	if(!hMsg) {
		ERR("create msg handle failed...");
		goto exit;
	}

	DBG("create msg ok, our name: %s, dst name: %s.", env->name, env->dest);
	sleep(1);
	
	int cnt = 0, dataLen = sizeof(msgData.header);
	int err;
	
	memset(&msgData, 0, sizeof(msgData));
	msgData.header.cmd = cnt;
	msgData.header.index = cnt;
	msgData.header.type = MSG_TYPE_REQU;
	msgData.header.dataLen = sprintf(msgData.buf, "%s start", env->name);
	dataLen = msgData.header.dataLen + sizeof(msgData.header);	
	//msgData.header.dataLen += 16;

	if(env->id) {
		DBG("send msg to %s", env->dest);
		err = msg_send(hMsg, env->dest, &msgData.header, 0);
		if(err < 0)
			DBG("send msg returns %d", err);
	}

	DBG("%s, start recv msg", env->name);
	struct timeval tmStart,tmEnd; 
	float   timeUse;
	err = msg_set_recv_timeout(hMsg, 1);
	err |= msg_set_send_timeout(hMsg, 2);
	assert(err == E_NO);
	
	while(1) {
		/* Do echo loop */
		gettimeofday(&tmStart,NULL);
		err = msg_recv(hMsg, &msgData.header, sizeof(MsgData), 0);
		gettimeofday(&tmEnd,NULL); 
		
		if(err > 0) {
			DBG("<%u> recv msg from %s, len: %d", 
				(unsigned int)pthread_self(), msg_get_recv_src(hMsg), err);
			DBG("  cmd: %d, index: %d", 
				msgData.header.cmd, msgData.header.index);
			if(msgData.header.dataLen > 0)
				DBG("  append data: %s", msgData.buf);
			timeUse = 1000000*(tmEnd.tv_sec-tmStart.tv_sec)+tmEnd.tv_usec-tmStart.tv_usec; 
			DBG("  recv cost: %.0f us", timeUse);
		}
		/* Send back data */
		sprintf(msgData.buf, "<%d> %s send msg", cnt, env->name);
		msgData.header.dataLen = sizeof(msgData.buf);
		msgData.header.type  = MSG_TYPE_RESP;
		msgData.header.index = cnt;
		dataLen = msgData.header.dataLen + sizeof(msgData.header);

		gettimeofday(&tmStart,NULL);
		err = msg_send(hMsg, NULL, &msgData.header, 0);
		gettimeofday(&tmEnd,NULL); 
		if(err)
			ERR("Send msg failed");

		timeUse = 1000000*(tmEnd.tv_sec-tmStart.tv_sec)+tmEnd.tv_usec-tmStart.tv_usec; 
		DBG("<%u> send %d bytes msg to %s cost: %.0f us", 
			(unsigned int)pthread_self(), dataLen, msg_get_recv_src(hMsg), timeUse);

		cnt++;
		if( env->params->loopCnt > 0 &&
			cnt > env->params->loopCnt)
			break;
	}


exit:
	if(env)
		free(env);
	if(hMsg)
		msg_delete(hMsg);
	pthread_exit(0);
}
Пример #7
0
static Int32 raw_trans_test()
{
	Int8 bufTx[1024], bufRx[1024];
	
	MsgHandle hMsgTx = msg_create("/tmp/RawSend", "/tmp/RawRecv", 0);
	MsgHandle hMsgRx = msg_create("/tmp/RawRecv", "/tmp/RawSend", 0);
	assert(hMsgTx && hMsgRx);
	int fdTx, fdRx;

	fdTx = msg_get_fd(hMsgTx);
	fdRx = msg_get_fd(hMsgRx);

	Int32 i;

	for(i = 0; i < sizeof(bufTx); i++) {
		bufTx[i] = i;
	}

	struct sockaddr_un serverAddr;
	memset(&serverAddr, 0, sizeof(serverAddr));
	serverAddr.sun_family = AF_UNIX;
	strncpy(serverAddr.sun_path, "/tmp/RawRecv", sizeof(serverAddr.sun_path));
	
	if(sendto( fdTx, bufTx, 64, 0, 
			(struct sockaddr *)&serverAddr, sizeof(serverAddr)) != 64) {
			ERRSTR("<0> sendto data err");
			return E_IO;
	}

	
	if(sendto( fdTx, bufTx, 128, 0, 
				(struct sockaddr *)&serverAddr, sizeof(serverAddr)) != 128) {
		ERRSTR("<1> sendto data err");
		return E_IO;
	}

	
	if(sendto( fdTx, bufTx, 256, 0, 
				(struct sockaddr *)&serverAddr, sizeof(serverAddr)) != 256) {
		ERRSTR("<2> sendto data err");
		return E_IO;
	}

	Int32 rcv;
	socklen_t len;  
    len = sizeof(serverAddr);

	rcv = recvfrom(fdRx, bufRx, 512, 0, (struct sockaddr *)&serverAddr, &len);
	DBG("recv len %d", rcv);
	rcv = recvfrom(fdRx, bufRx, 512, 0, (struct sockaddr *)&serverAddr, &len);
	DBG("recv len %d", rcv);
	rcv = recvfrom(fdRx, bufRx, 512, 0, (struct sockaddr *)&serverAddr, &len);
	DBG("recv len %d", rcv);


	msg_delete(hMsgTx);

	msg_delete(hMsgRx);

	return E_NO;
	
}
Пример #8
0
/*
 *  ======== dev_destroy_device ========
 *  Purpose:
 *      Destroys the channel manager for this device, if any, calls
 *      bridge_dev_destroy(), and then attempts to unload the Bridge module.
 */
int dev_destroy_device(struct dev_object *hdev_obj)
{
	int status = 0;
	struct dev_object *dev_obj = hdev_obj;

	DBC_REQUIRE(refs > 0);

	if (hdev_obj) {
		if (dev_obj->cod_mgr) {
			cod_delete(dev_obj->cod_mgr);
			dev_obj->cod_mgr = NULL;
		}

		if (dev_obj->hnode_mgr) {
			node_delete_mgr(dev_obj->hnode_mgr);
			dev_obj->hnode_mgr = NULL;
		}

		/* Free the io, channel, and message managers for this board: */
		if (dev_obj->hio_mgr) {
			io_destroy(dev_obj->hio_mgr);
			dev_obj->hio_mgr = NULL;
		}
		if (dev_obj->hchnl_mgr) {
			chnl_destroy(dev_obj->hchnl_mgr);
			dev_obj->hchnl_mgr = NULL;
		}
		if (dev_obj->hmsg_mgr) {
			msg_delete(dev_obj->hmsg_mgr);
			dev_obj->hmsg_mgr = NULL;
		}

		if (dev_obj->hdeh_mgr) {
			/* Uninitialize DEH module. */
			bridge_deh_destroy(dev_obj->hdeh_mgr);
			dev_obj->hdeh_mgr = NULL;
		}
		if (dev_obj->hcmm_mgr) {
			cmm_destroy(dev_obj->hcmm_mgr, true);
			dev_obj->hcmm_mgr = NULL;
		}

		if (dev_obj->dmm_mgr) {
			dmm_destroy(dev_obj->dmm_mgr);
			dev_obj->dmm_mgr = NULL;
		}

		/* Call the driver's bridge_dev_destroy() function: */
		/* Require of DevDestroy */
		if (dev_obj->hbridge_context) {
			status = (*dev_obj->bridge_interface.pfn_dev_destroy)
			    (dev_obj->hbridge_context);
			dev_obj->hbridge_context = NULL;
		} else
			status = -EPERM;
		if (!status) {
			kfree(dev_obj->proc_list);
			dev_obj->proc_list = NULL;

			/* Remove this DEV_Object from the global list: */
			drv_remove_dev_object(dev_obj->hdrv_obj, dev_obj);
			/* Free The library * LDR_FreeModule
			 * (dev_obj->module_obj); */
			/* Free this dev object: */
			kfree(dev_obj);
			dev_obj = NULL;
		}
	} else {
		status = -EFAULT;
	}

	return status;
}