Exemplo n.º 1
0
AUDIODATA_EXPORT
char* retrieve_audiodata(AudioDataDB mdatastore, uint32_t id){
    if (mdatastore == NULL || id == 0) return NULL;

    void *skt = (void*)mdatastore;
    char *mdatastr = NULL;
    zmq_msg_t cmd_msg, uid_msg, mdata_msg;
    uint8_t cmd = 2;
    uint32_t uid;
    uid = hosttonet32(id);

    zmq_msg_init_size(&cmd_msg, sizeof(uint8_t));
    memcpy(zmq_msg_data(&cmd_msg), &cmd, sizeof(uint8_t));
    zmq_send(skt, &cmd_msg, ZMQ_SNDMORE);

    zmq_msg_init_size(&uid_msg, sizeof(uint32_t));
    memcpy(zmq_msg_data(&uid_msg), &uid, sizeof(uint32_t));
    zmq_send(skt, &uid_msg, 0);

    zmq_msg_init(&mdata_msg);
    zmq_recv(skt, &mdata_msg, 0);

    mdatastr = strdup((char*)zmq_msg_data(&mdata_msg));

    zmq_msg_close(&cmd_msg);
    zmq_msg_close(&uid_msg);
    zmq_msg_close(&mdata_msg);

    return mdatastr;
}
Exemplo n.º 2
0
int handle_request(void *skt, sqlite3 *db){
    char sql[512];
    char rowstr[512];
    const int len = 512;
    char *errstr, *mdata_inline = NULL;
    uint8_t cmd, *data = NULL;
    uint32_t uid = 0;
    int err = 0;
    int64_t more;
    size_t msg_size, more_size = sizeof(int64_t);

    recieve_msg(skt, &msg_size, &more, &more_size, (void**)&data);
    if (msg_size != sizeof(uint8_t) || !more){
	if (more) flushall_msg_parts(skt);
	free(data);
	send_empty_msg(skt);
	return -1;
    }
    memcpy(&cmd, data, sizeof(uint8_t));
    free(data);

    switch (cmd){
    case 1: /* insert new entry */
	recieve_msg(skt, &msg_size, &more, &more_size, (void**)&mdata_inline);
	if (mdata_inline){
	    uid = insert_db(db, mdata_inline);
	    free(mdata_inline);
	}
	syslog(LOG_DEBUG, "assigned uid = %u", uid);
	uid = hosttonet32(uid);
	send_msg_vsm(skt, &uid, sizeof(uint32_t));
	break;
    case 2: /* look up id */ 
	rowstr[0] = '\0';
	recieve_msg(skt, &msg_size, &more, &more_size, (void**)&data);
	if (msg_size != sizeof(uint32_t)){
	    free(data);
	    send_empty_msg(skt);
	    err = -2;
	    break;
	}
	memcpy(&uid, data, sizeof(uint32_t));
	uid = nettohost32(uid);
	char *result = lookup_db(db, uid);
	send_msg_data(skt, result, strlen(result)+1, free_fn, NULL);
	break;
    default:
	syslog(LOG_DEBUG, "unrecognized cmd, %u", cmd);
	send_empty_msg(skt);
    }
    if (more)flushall_msg_parts(skt);

    return err;
   
}
Exemplo n.º 3
0
int main(int argc, char **argv){
    char addr[32];
    if (argc < 4){
	fprintf(stdout,"not enough args\n");
	fprintf(stdout,"usage: prog <auscoutd address>  <port> <port>\n");
	fprintf(stdout,"address - mock auscoud server address, e.g. \"localhost\"\n");
	fprintf(stdout,"port    - mock auscoutd server port e.g. 4005\n");
	fprintf(stdout,"port    - port to recieve init from auscout driver, e.g. 4009\n");
	return 0;
    }

    /* progname <auscoutd address> <auscoutd port> <driver port>*/
    const char *auscoutd_address = argv[1];
    const int port = atoi(argv[2]);
    const int driver_port = atoi(argv[3]);

    int subscr_port  = port + 2;
    int result_port = port + 3;
    int table_port  = port + 1;

    snprintf(addr, 32, "tcp://%s:%d", auscoutd_address, table_port);
    fprintf(stdout,"register as table with %s\n", addr);

    void *ctx = zmq_init(1);
    assert(ctx);
    assert(register_table(ctx, addr) == 0);

    /* skt to recieve number of files to be sent from auscout driver program */
    snprintf(addr, 32, "tcp://*:%d", driver_port);
    void *prepskt = socket_bind(ctx, ZMQ_PAIR, addr);
    assert(prepskt);

    snprintf(addr, 32, "tcp://%s:%d", auscoutd_address, subscr_port);
    void *subscr_skt = socket_connect(ctx, ZMQ_SUB, addr);
    assert(subscr_skt);
    assert(zmq_setsockopt(subscr_skt, ZMQ_SUBSCRIBE, "phash.", 6) == 0);

    snprintf(addr, 32, "tcp://%s:%d", auscoutd_address, result_port);
    void *result_skt = socket_connect(ctx, ZMQ_REQ, addr);
    assert(result_skt);

    struct timespec seed_ts;
    clock_gettime(CLOCK_REALTIME, &seed_ts);
    srand(seed_ts.tv_nsec);

    uint8_t cmd, thrdnum, tblnum;
    struct timespec start_ts, end_ts, diff_ts;
    uint32_t uid, nbframes, count = 0, nbquerys;
    void *data;
    int64_t more;
    size_t msg_size, more_size = sizeof(int64_t);
    float cs = 0.05555f;
    fprintf(stdout,"\nready to recieve subscription messages from auscoutd ...\n\n");
    while (1){

	recieve_msg(prepskt, &msg_size, &more, &more_size, &data);
	assert(msg_size == sizeof(uint32_t));
	memcpy(&nbquerys, data, sizeof(uint32_t));
	free(data);
	fprintf(stdout,"expecting %d querys\n\n", nbquerys);

	clock_gettime(CLOCK_MONOTONIC, &start_ts);
	count = 0;
	do {
	    /* recieve topic */
	    recieve_msg(subscr_skt, &msg_size, &more, &more_size, &data);
	    free(data);

	    /* recieve cmd */
	    recieve_msg(subscr_skt, &msg_size, &more, &more_size, &data);
	    memcpy(&cmd, data, sizeof(uint8_t));
	    free(data);
	
	    recieve_msg(subscr_skt, &msg_size, &more, &more_size, &data);
	    memcpy(&nbframes, data, sizeof(uint32_t));
	    nbframes = nettohost32(nbframes);
	    free(data);

	    /* recieve hash */
	    recieve_msg(subscr_skt, &msg_size, &more, &more_size, &data);
	    free(data);

	    recieve_msg(subscr_skt, &msg_size, &more, &more_size, &data);
	    memcpy(&thrdnum, data, sizeof(uint8_t));
	    free(data);

	    recieve_msg(subscr_skt, &msg_size, &more, &more_size, &data);
	    memcpy(&uid, data, sizeof(uint32_t));
	    uid = nettohost32(uid);
	    free(data);

	    if (cmd == 1){
		/* recieved lookup */
		uid = 0;  /* send back random integer id*/
		cs =  0.5555;
		fprintf(stdout,"(%d) lookup: %u frames\n",count,nbframes);
		fprintf(stdout,"        reply : thrdnum %u | uid %u | cs %f\n\n",thrdnum,uid,cs);

		uid = hosttonet32(uid);
		cs = hosttonetf(cs);
		sendmore_msg_vsm(result_skt, &thrdnum, sizeof(uint8_t));
		sendmore_msg_vsm(result_skt, &uid, sizeof(uint32_t));
		send_msg_vsm(result_skt, &cs, sizeof(float));
		
		recieve_msg(result_skt, &msg_size, &more, &more_size, &data);
		free(data);
	    } else if (cmd == 2){
		tblnum = thrdnum;
		
		/* recieved submission */
		fprintf(stdout,"(%d) submit: %u frames | %u table\n",count,nbframes,tblnum);
		fprintf(stdout,"         no reply\n\n");
	    }
	    fprintf(stdout,"**************************************\n");


	} while (++count < nbquerys);
	
	clock_gettime(CLOCK_MONOTONIC, &end_ts);
	diff_ts = diff_timespec(start_ts, end_ts);

	unsigned long long total_ull = 1000000000*diff_ts.tv_sec + diff_ts.tv_nsec;
	float total_secs = (float)total_ull/1000000000.0f;
	float rate = (float)nbquerys/total_secs;

	fprintf(stdout,"recieved %d querys in %f secs - %f querys/sec\n",\
                                                            nbquerys, total_secs, rate);

    }

    zmq_close(subscr_skt);
    zmq_close(result_skt);
    zmq_close(prepskt);
    zmq_term(ctx);

    return 0;
}
Exemplo n.º 4
0
/* aux message to worker thread to a message */
static int pull_message(int thrn, void *pullskt, void *resultskt){
    uint8_t cmd, perms = 0, threadnum, table_n, **toggles = NULL;
    uint32_t nbframes, id = 0;
    void *hash = NULL, *data = NULL;
    int i, err;
    int64_t more;
    size_t msg_size, more_size = sizeof(int64_t);
    float cs = -1.0f;

    /* pull cmd msg part */
    recieve_msg(pullskt, &msg_size, &more, &more_size, &data);
    if (msg_size != sizeof(uint8_t) || !more){
	if (more) flushall_msg_parts(pullskt);
	free(data);
	return -1;
    }
    memcpy(&cmd, data, sizeof(uint8_t));
    free(data);

    /* pull nbframes msg part */
    recieve_msg(pullskt, &msg_size, &more, &more_size, &data);
    if (msg_size != sizeof(uint32_t) || !more){
	if (more) flushall_msg_parts(pullskt);
	free(data);
	return -2;
    }
    memcpy(&nbframes, data, sizeof(uint32_t));
    nbframes = nettohost32(nbframes);
    free(data);

    /* pull hash msg part */
    recieve_msg(pullskt, &msg_size, &more, &more_size, &hash);
    if (msg_size != nbframes*sizeof(uint32_t) || !more){
	syslog(LOG_DEBUG,"WORKER%d: inconsistent hash msg part size = %d", thrn, msg_size);
	if (more) flushall_msg_parts(pullskt);
	free(hash);
	return -3;
    }
	
    /* recieve threadnum (for cmd== 1) or table_num (for cmd == 2)*/
    recieve_msg(pullskt, &msg_size, &more, &more_size, (void**)&data);
    if (msg_size != sizeof(uint8_t) || !more){
	syslog(LOG_DEBUG,"WORKER%d: inconsistent threadnum msg size, %d", thrn, msg_size);
	if (more) flushall_msg_parts(pullskt);
	free(data);
	free(hash);
	return -4;
    }
    memcpy(&threadnum, data, sizeof(uint8_t));
    free(data);

    recieve_msg(pullskt, &msg_size, &more, &more_size, &data);
    if (msg_size != sizeof(uint32_t)){
	syslog(LOG_DEBUG,"WORKER%d: inconsistent uid msg size = %d", thrn, msg_size);
	free(data);
	free(hash);
	return -5;
    }
    memcpy(&id, data, sizeof(uint32_t));
    id = nettohost32(id);
    free(data);

    /* de-serialization */
    for (i=0;i<nbframes;i++){
	((uint32_t*)hash)[i] = nettohost32(((uint32_t*)hash)[i]);
    }

    if (more){
	toggles = retrieve_extra(pullskt, nbframes, &perms); 
    }

    err = execute_command(thrn, cmd, hash, toggles, perms,nbframes, threadnum, &id, &cs);
    if (err < 0){
	syslog(LOG_DEBUG,"WORKER%d: unable to execute command, err=%d", err);
    }
    
    if (toggles) {
	for (i = 0;i<nbframes;i++){
	    free(toggles[i]);
	}
	free(toggles);
	toggles = NULL;
    }
    free(hash);
    hash = NULL;
   
    if (cs >= GlobalArgs.threshold){
	syslog(LOG_DEBUG,"WORKER%d: %u threadnum, %f cs, %u id", thrn, threadnum, cs, id);
	id = hosttonet32(id);
	cs = hosttonetf(cs);
	send_results(resultskt, threadnum, id, cs);
    }

    return 0;
}
Exemplo n.º 5
0
void* query_thread(void *arg){
    ThrParam *thrparam = (ThrParam*)arg;
    void *ctx = thrparam->ctx;
    char *mdatastr = thrparam->mdatastr;
    uint32_t **hashes = thrparam->hashes;
    uint32_t *pnbframes = thrparam->nbframes;
    unsigned int nbfiles = thrparam->nbfiles;
    uint8_t thrn = thrparam->thrn;
    uint8_t cmd = thrparam->cmd;

    void *skt = zmq_socket(ctx, ZMQ_REQ);
    assert(skt);
    fprintf(stdout,"thrn%d: connect to %s\n", thrn, thrparam->address);
    assert(zmq_connect(skt, thrparam->address)==0);

    unsigned int i,j;

    void *data;
    int64_t more;
    size_t msg_size, more_size=sizeof(int64_t);
    struct timespec t1_ts, t2_ts, diff_ts;
    unsigned long long latency, sum_ull = 0ULL;

    if (cmd == 1){ /* queries */
	for (i=0;i<nbfiles;i++){
	    clock_gettime(CLOCK_MONOTONIC, &t1_ts);

	    sendmore_msg_vsm(skt, &cmd, sizeof(uint8_t));
	    uint32_t snbframes = hosttonet32(pnbframes[i]);
	    sendmore_msg_vsm(skt, &snbframes, sizeof(uint32_t));
	    send_msg_data(skt, hashes[i], pnbframes[i]*sizeof(uint32_t), free_fn, NULL);
	    recieve_msg(skt, &msg_size, &more, &more_size, &data);
	    
	    clock_gettime(CLOCK_MONOTONIC, &t2_ts);
	    diff_ts = diff_timespec(t1_ts, t2_ts);
	    latency = 1000000000*diff_ts.tv_sec + diff_ts.tv_nsec;
	    sum_ull += latency;

	    fprintf(stdout,"thrd%d: query %u frames, recv:\"%s\" in %llu nsecs\n",\
                                                       thrn,pnbframes[i],(char*)data, latency);
	    free(data);

	    /* simulate interarrival */ 
	    unsigned int pause = Arr; /* = next_arrival(Arr);*/
	    usleep(1000*pause);
	}
    } else if (cmd == 2){ /* submissions */
	for (i=0;i<nbfiles;i++){
	    clock_gettime(CLOCK_MONOTONIC, &t1_ts);

	    sendmore_msg_vsm(skt, &cmd, sizeof(uint8_t));
	    uint32_t snbframes = hosttonet32(pnbframes[i]);
	    sendmore_msg_vsm(skt, &snbframes, sizeof(uint32_t));
	    sendmore_msg_data(skt, hashes[i], pnbframes[i]*sizeof(uint32_t), free_fn, NULL);
	    send_msg_data(skt, mdatastr, strlen(mdatastr)+1, NULL, NULL);

	    recieve_msg(skt, &msg_size, &more, &more_size, &data);
	    assert(msg_size == sizeof(uint32_t));
	    uint32_t uid;
	    memcpy(&uid, data, sizeof(uint32_t));
	    uid = nettohost32(uid);

	    clock_gettime(CLOCK_MONOTONIC, &t2_ts);

	    diff_ts = diff_timespec(t1_ts, t2_ts);
	    latency = 1000000000*diff_ts.tv_sec + diff_ts.tv_nsec;
	    sum_ull += latency;

	    fprintf(stdout,"thr%d: submit %u frames, recv %u=uid in %llu nsecs\n",\
                                                              thrn, pnbframes[i], uid, latency);

	    /* simulate interarrival */
	    unsigned int pause = Arr; /*next_arrival(Arr);*/
	    usleep(1000*pause);

	    free(data);
	}
    }

    free(thrparam);
    zmq_close(skt);

    /* return the sum of latency's */ 
    void *ptr = malloc(sizeof(unsigned long long));
    assert(ptr);
    memcpy(ptr, &sum_ull, sizeof(unsigned long long));
    pthread_exit(ptr);
}
Exemplo n.º 6
0
void SendThread::doSend(){        	

    quint8 cmd;
    if (mode == QUERY_MODE) {
	cmd = 1;
    } else if (mode == SUBMIT_MODE){
	cmd = 2;
    } else{
	return;
    }

    QString delimStr(delim);

    emit activatedProgress(true);
    emit changedRange(0, fileList.size());
    emit changedLevel(0);

    int error;
    float *sigbuf = new float[1<<24];
    const unsigned int buflen = 1<<24;

    quint32 nbframes = 0, snbframes = 0, id = 0;
    char *data = NULL;
    char mdata_inlinestr[512];
    AudioHashStInfo hash_st;
    hash_st.sr = 0;
    int index = 0;

    AudioMetaData mdata;
    init_mdata(&mdata);
    foreach(QString currentFile, fileList){
	emit appendedText(tr("looking up ") + currentFile);

	unsigned int tmpbuflen = buflen;
	char *file = currentFile.toLocal8Bit().data();

	float *buf = readaudio(file, 6000, sigbuf, &tmpbuflen, nbsecs, &mdata, &error);
	if (!buf){
	    QString errorString = QString("unable to read audio: err code %1").arg(error);
	    qDebug() << "could not read file: " << errorString;
	    emit postedError(errorString);
	    continue;
	}

	quint32 *hash = NULL;

	int res = audiohash(buf,&hash,NULL,NULL,NULL,&nbframes,NULL,NULL,\
			    tmpbuflen,0,6000,&hash_st);
	if (res < 0){
	    QString errorString = QString("unable to extract a hash");
	    emit postedError(errorString);
	    qDebug() << "could not get hash: " << errorString.toUtf8().data();
	    if (buf != sigbuf) ph_free(buf);
	    continue;
	}
	
	try {
	    zmq::message_t cmdmsg(&cmd, sizeof(quint8), NULL);
	    snbframes = hosttonet32(nbframes);
	    zmq::message_t framesmsg(&snbframes, sizeof(quint32), NULL);
	    zmq::message_t hashmsg(hash, nbframes*sizeof(quint32), free_func);
	    skt->send(cmdmsg, ZMQ_SNDMORE);
	    skt->send(framesmsg, ZMQ_SNDMORE);
	    
	    if (cmd == 1){ //query
		skt->send(hashmsg, 0);
	    } else {       //query
		skt->send(hashmsg, ZMQ_SNDMORE);
		metadata_to_inlinestr(&mdata, mdata_inlinestr, 512);
		zmq::message_t metadata_msg(mdata_inlinestr, strlen(mdata_inlinestr)+1, NULL);
		skt->send(metadata_msg, 0);
	    }



	    zmq::message_t respmsg;
	    skt->recv(&respmsg, 0);
	    data = (char*)respmsg.data();

	    QString retdString(data);
	    
	    if (cmd == 1){
		QStringList resultList = retdString.split(delimStr);

		int i = 0;
		foreach (QString resultStr, resultList){
		    if (i < fields.size()){
			emit appendedText(fields[i] + ": " + resultStr);
		    }
		    i++;
		}
		resultList.clear();
	    } else if (cmd == 2){
		if (respmsg.size()  != sizeof(quint32)) {
		    QString errorString = QString("recieved msg of incorrectsize, %1").arg(respmsg.size());
		    emit postedError(errorString);
		    if (buf != sigbuf) ph_free(buf);
		    continue;
		}
		memcpy(&id, data, sizeof(quint32));
		id = nettohost32(id);
		QString line = QString("assigned id = %1").arg(id);
		emit appendedText(line);
	    } 
	} catch (zmq::error_t err){