Beispiel #1
0
executer_result
_executer_send_delta (executer_job_t * job)
{
  // The opaque pointer is to signature
  rs_signature_t *signature = job->signature;
  rs_job_t *deltajob;
  char *realpath;
  executer_rs inrs;
  executer_rs outrs;
  rs_result result;
  rs_buffers_t rsbuf;

  utils_debug ("Sending delta data");
  deltajob = rs_delta_begin (signature);

  _executer_real_path (job->file, &realpath);
  int file2 = open (realpath, O_RDONLY);

  inrs.type = _EXECUTER_FILE;
  inrs.sock = file2;
  inrs.size = RS_DEFAULT_BLOCK_LEN;
  inrs.buf = malloc (inrs.size);
  outrs.type = _EXECUTER_SOCKET;
  outrs.sock = job->peer_sock;
  outrs.size = _EXECUTER_DEFAULT_OUT;
  outrs.buf = malloc (outrs.size);
  if (rs_build_hash_table (signature) != RS_DONE)
    {
      utils_error ("Error building hash table");
      return EXECUTER_ERROR;
    }
  result =
    rs_job_drive (deltajob, &rsbuf, _executer_in_callback, &inrs,
		  _executer_out_callback, &outrs);

  // Free the memory
  free (realpath);
  rs_job_free (deltajob);
  free (inrs.buf);
  free (outrs.buf);

  // Send finish to the socket
  if (!_executer_send_finish (job->peer_sock))
    {
      utils_error ("Error sending finish message: %s", strerror (errno));
      return EXECUTER_ERROR;
    }
  if (result != RS_DONE)
    {
      utils_error ("Error calculating delta");
      return EXECUTER_ERROR;
    }
  else
    {
      // Ok, send the stat
      job->next_operation = _executer_send_stat;
      // Ok, the delta is send, no need more process
      return EXECUTER_RUNNING;
    }

}
void* scheduler_code(void* data) {
  printf("scheduler_thread running\n");

  signal(SIGUSR2, cleanup_scheduler);

  sigset_t set;
  sigemptyset(&set);
  sigaddset(&set, SIGUSR2);

  scheduler_data* param = (scheduler_data*) data;
  buffer* buf = param->buffer;
  sem_t *sem_buffer_empty = param->sem_buffer_empty;
  sem_t *sem_buffer_full = param->sem_buffer_full;
  pthread_mutex_t *buffer_mutex = param->buffer_mutex;

  char debug_str[100];
  sprintf(debug_str, "config policy:  %d\n", param->policy);
  utils_debug(debug_str);

  while (true) {
    sigprocmask(SIG_UNBLOCK, &set, NULL);
    sem_wait(sem_buffer_empty); // only remove if buffer is not empty
    sigprocmask(SIG_BLOCK, &set, NULL);
    //block_signals();

    pthread_mutex_lock(buffer_mutex);
    printf("On Scheduler: New Request\n");
    buffer_node* node = buf->first->next;
    buffer_node* parent = buf->first;
    buffer_node* best = NULL;
    buffer_node* parentbest = NULL;

    if (param->policy == FIFO_POLICY) {
      best = node;
      parentbest = parent;
    } else {
      while (node != NULL) {
        //printf("on buffer iteration: request type %s\n", node->request->type == STATIC_PAGE ? "STATIC_PAGE" : "DYNAMIC_SCRIPT" );
        if ((param->policy == STATIC_POLICY && node->request->type == STATIC_PAGE) ||
            (param->policy == DYNAMIC_POLICY && node->request->type == DYNAMIC_SCRIPT)) {
          parentbest = parent;
          best = node;
          break;
        } else if(best == NULL) {
          parentbest = parent;
          best = node;
        }

        if (node->next != NULL) {
          parent = parent->next;
          node = node->next;
        } else {
          break;
        }
      }
    }

    printf("On Scheduler: Found request\n");
    printf("On Scheduler: request type %s\n", best->request->type == STATIC_PAGE ? "STATIC_PAGE" : "DYNAMIC_SCRIPT" );
    printf("On Scheduler: work with name: %s\n\n", best->request->name);

    parentbest->next = best->next;
    buf->cur_size--;
    pthread_mutex_unlock(buffer_mutex);
    sem_post(sem_buffer_full);

    //sleep(1);

    if (best->request->type == DYNAMIC_SCRIPT) {
      utils_debug("New dynamic script: ");
      printf("%s\n", best->request->name);
      
      int script_allowed = 0;

      int u;
      for (u = 0; u < param->n_scripts; u++) {
        if (!strcmp(param->scripts[u], best->request->name)) {
          script_allowed = 1;
        }
      }

      if (!script_allowed) {
        printf("%s\n", best->request->name);
        utils_debug("This script is not allowed.\n");
        // TODO Michel este script nao pode ser corrido, que se faz
        char error[] = "Script not allowed.<br>";
        http_send_header(best->request->socket, "text/html");
        send(best->request->socket, error, strlen(error), 0);
        close(best->request->socket);

        continue;
      }
    }

    int i;
    for (i = 0; i < param->n_threads; i++) {
      pthread_mutex_lock(&param->thread_locks[i]);

      if (param->thread_ready[i] == 1) {
        param->requests[i] = best->request;
        param->thread_ready[i] = 0;
        pthread_mutex_unlock(&param->thread_locks[i]);

        pthread_cond_broadcast(&(param->wait_for_work[i]));

        break;
      }

      pthread_mutex_unlock(&param->thread_locks[i]);
    }

    if (i >= param->n_threads) {
      printf("No worker available.\n"); // This might happen if the workers are slow, because when the request is delivered to a worker we remove the request from the buffer, leaving space for more requests, but no thread available.
      char error[] = "<!DOCTYPE html>\n <head></head>\n <body> <h2>Server error. No processing units available. </h2> </body>\n\n";
      send(best->request->socket, error, strlen(error), 0);
      close(best->request->socket);
    } else {
      printf("Delivered work to worker %d\n\n", i);
    }

  }
}
Beispiel #3
0
executer_result
_executer_receive_file (executer_job_t * job)
{
  FILE *file;
  char *temppath;
  int operation;
  bool protocol_error = false;
  int tempfile;

  utils_debug ("Receiving file data");

  tempfile = _executer_create_temp (job->realpath, &temppath);
  if (tempfile == 0)
    {
      utils_error ("Error creating temp file for file '%s': %s",
		   job->realpath, strerror (errno));
      return EXECUTER_ERROR;
    }

  job->tempfile = temppath;

  // Receive a whole file
  file = fopen (job->tempfile, "w");
  if (file == 0)
    {
      utils_error ("Error creating file '%s': %s", job->realpath,
		   strerror (errno));
      return EXECUTER_ERROR;
    }
  do
    {
      //Read the operation

      size_t leido;
      size_t size;
      char *buf;

      leido =
	_executer_read_buffer (job->peer_sock, &operation,
			       sizeof (operation));
      if (leido != sizeof (operation))
	{
	  protocol_error = true;
	  break;
	}

      if (operation == _EXECUTER_PART)
	{
	  int ret;
	  leido =
	    _executer_read_buffer (job->peer_sock, &size, sizeof (size));

	  if (leido != sizeof (size))
	    {
	      utils_error
		("Error receiving next size of block, espected bytes: %i bytes received: %i",
		 sizeof (size), leido);
	      protocol_error = true;
	      break;
	    }

	  buf = malloc (size);
	  leido = _executer_read_buffer (job->peer_sock, buf, size);
	  if (leido != size)
	    {
	      utils_error
		("Error receiving file data: bytes expected: %i bytes received: %i",
		 size, leido);
	      protocol_error = true;
	      break;
	    }

	  ret = fwrite (buf, 1, size, file);
	  free (buf);

	  if (ret != size)
	    {
	      utils_error ("Error writing file: %s", strerror (errno));
	      protocol_error = true;
	      break;
	    }

	}

    }
  while (operation == _EXECUTER_PART);

  fclose (file);

  if (protocol_error)
    {
      utils_error ("Error receiving whole file, canceling job");
      return EXECUTER_ERROR;
    }

  job->next_operation = _executer_receive_stat;
  return EXECUTER_RUNNING;

}
Beispiel #4
0
executer_result
_executer_recive_delta (executer_job_t * job)
{
  char *temppath;
  rs_buffers_t rsbuf;
  executer_rs inrs;
  executer_rs outrs;
  int result;

  utils_debug ("Receving delta.");

  int tempfile = _executer_create_temp (job->realpath, &temppath);
  if (tempfile == 0)
    {
      utils_error ("Error creating temp file for file '%s': %s",
		   job->realpath, strerror (errno));
      return EXECUTER_ERROR;
    }

  FILE *origfile = fopen (job->realpath, "rb");
  if (origfile == NULL)
    {
      utils_error ("Error opening file '%s': %s", job->realpath,
		   strerror (errno));
      return EXECUTER_ERROR;
    }

  rs_job_t *patchjob = rs_patch_begin (rs_file_copy_cb, origfile);

  inrs.sock = job->peer_sock;
  inrs.type = _EXECUTER_SOCKET;
  inrs.size = _EXECUTER_DEFAULT_OUT;
  inrs.buf = malloc (inrs.size);

  outrs.sock = tempfile;
  outrs.type = _EXECUTER_FILE;
  outrs.size = RS_DEFAULT_BLOCK_LEN;
  outrs.buf = malloc (outrs.size);

  rsbuf.avail_in = 0;
  rsbuf.avail_out = 0;
  rsbuf.next_in = 0;
  rsbuf.next_out = 0;
  rsbuf.eof_in = false;

  result =
    rs_job_drive (patchjob, &rsbuf, _executer_in_callback, &inrs,
		  _executer_out_callback, &outrs);
  if (result != RS_DONE)
    {
      utils_error ("Error patching file");
      return EXECUTER_ERROR;
    }

  //Check if there are any data
  if (rsbuf.avail_out > 0)
    {
      _executer_in_callback (patchjob, &rsbuf, &inrs);
      _executer_out_callback (patchjob, &rsbuf, &outrs);
    }

  rs_job_free (patchjob);

  close (tempfile);
  fclose (origfile);
  free (outrs.buf);
  free (inrs.buf);

  job->next_operation = _executer_receive_stat;
  job->tempfile = temppath;

  return EXECUTER_RUNNING;
}
/*
	Load data from storage to UI
*/
void __fastcall TframTag::UpdateView()
{
	//TODO: Add your source code here
	TComponent * comp;
	int i;
	PTAG_NAME name = &m_TagName;
	// update static information
	PRTK_TAG pTag = &m_Tag;
	char textname[TAGNAME_TEXT_LENGTH + 1];
	char buf[64];

	// temporarily disable unapplicable components
	tsException->TabVisible = false;
    
    btnWriteDevice->Enabled = (pTag->d.Value.Flags & TF_ReadOnly)? false : true;

	// now we update the UI to reflect the tag configuration
    /*
    0 开关量
    1 模拟量
    2 高精度模拟量
    3 8位整数
    4 16位整数
    5 32位整数
    6 64位整数
    7 无符号8位整数
    8 无符号16位整数
    9 无符号32位整数
    10 无符号64位整数
    11 日期
    */
	cmbType->OnChange = NULL;
	switch(get_value_type(pTag->s.Flags)){
	case dt_bool:
		cmbType->ItemIndex = 0;
		break;
	case dt_real4:
    	cmbType->ItemIndex = 1;
	    break;
	case dt_real8:
		cmbType->ItemIndex = 2;
		break;
    case dt_int8:
        cmbType->ItemIndex = 3;
        break;
    case dt_int16:
        cmbType->ItemIndex = 4;
        break;
    case dt_int32:
        cmbType->ItemIndex = 5;
        break;
    case dt_int64:
        cmbType->ItemIndex = 6;
        break;
    case dt_uint8:
        cmbType->ItemIndex = 7;
        break;
    case dt_uint16:
        cmbType->ItemIndex = 8;
        break;
    case dt_uint32:
        cmbType->ItemIndex = 9;
        break;
    case dt_uint64:
        cmbType->ItemIndex = 10;
        break;
	case dt_date:
    	cmbType->ItemIndex = 11;
    	break;
    default:
    	cmbType->ItemIndex = 12;
    	break;
	}
	cmbType->OnChange = cmbTypeChange;

	{
		cmbDevice->Ctl3D = false;
		CDeviceItems * ditems;
		AnsiString Url;
		Url = (char*)CNodeName(name->node);
		Url += ".DEVICES";
		ditems = dynamic_cast<CDeviceItems*>(g_DCS.Search(Url));
		if(ditems){
			if(!ditems->m_iRefreshCount){
				ditems->Refresh();
			}
		}
		cmbDevice->Items->Clear();
		cmbDevice->Text = "";
		if(ditems){
			CDeviceItem * ditem;
			ditem = dynamic_cast<CDeviceItem*>(ditems->GetFirstChild());
			while(ditem){
				cmbDevice->Items->Add((char*)CDeviceName(ditem->info.k));
				ditem = dynamic_cast<CDeviceItem*>(ditems->GetNextChild(ditem));
			}
		}
	}

	{
		PRTK_GROUP pgrp;
		RTK_CURSOR hgrp;
		hgrp = open_group_f(&name->node, &name->sname.group);
		pgrp = (PRTK_GROUP)cursor_get_item(hgrp);
		if(pgrp){
			if(pgrp->period > 50){
				tmrUpdater->Interval = pgrp->period;
			}
		}
		close_handle(hgrp);
	}

	edtTagName->Text = (char *)CTagName(name->sname.tag);
	edtCName->Text = pTag->s.Description;
	edtAddr->Text  = pTag->s.Address;
	cmbDevice->Text = (char*)CDeviceName(pTag->s.Device);
#define cc(name) \
	do{ if(pTag->s.Flags & TF_##name){\
			chk##name->Checked =  true;\
		}else{\
			chk##name->Checked = false;\
		}\
	}while(0)
	cc(HiHi);
	cc(Lo);
	cc(Hi);
	cc(LoLo);
	cc(On2Off);
	cc(Off2On);
	cc(Rate);
	cc(SaveToHistory);
    cc(Step);
/*
	// cutoff is obsolete
#define dd(name) chk##name->Checked = pTag->s.CutOffMask & TF_##name ? true : false;
	dd(HiHi);
	dd(Lo);
	dd(Hi);
	dd(LoLo);
	dd(On2Off);
	dd(Off2On);
*/
	if(pTag->s.Flags & TF_System){
		cmbDevice->Enabled = false;
		edtAddr->ReadOnly = true;
		cmbType->Enabled = false;
		cmbDevice->Color = clScrollBar;
		edtAddr->Color = clScrollBar;
		cmbType->Color = clScrollBar;
	}else{
		cmbDevice->Enabled = true;
		edtAddr->ReadOnly = false;
		cmbType->Enabled = true;
		cmbType->Color = clWindow;

		cmbDevice->Color = clWindow;
		edtAddr->Color = clWindow;
	}
	
	switch(get_value_type(pTag->s.Flags)){
	case dt_real4:
	case dt_real8:
    case dt_int64:
    case dt_uint64:
		#define aa(f) sprintf(buf, "%g", pTag->s.flt##f);edt##f->Text = buf;
		aa(HiHi);
		aa(Hi);
		aa(Lo);
		aa(LoLo);
		aa(AlarmDeadband);
		aa(MaxValue);
		aa(MinValue);
		aa(Rate);
		edtEU->Text = pTag->s.AnalogMsg.EU;
		tsAnalog->TabVisible = true;
		tsLogical->TabVisible = false;
		break;
	case dt_int8:
    case dt_int16:
	case dt_int32:
    case dt_uint8:
	case dt_uint16:
    case dt_uint32:
		aa(AlarmDeadband);
		aa(Rate);
		#undef aa
		#define aa(v, name) \
			sprintf(buf, "%d", pTag->s.v);\
			edt##name->Text = buf;
		aa(u_hihi.i, HiHi);
		aa(u_hi.i, Hi);
		aa(u_lo.i, Lo);
		aa(u_lolo.i, LoLo);
		aa(u_max.i, MaxValue);
		aa(u_min.i, MinValue);
		edtEU->Text   = pTag->s.AnalogMsg.EU;
		tsAnalog->TabVisible = true;
		tsLogical->TabVisible = false;
		break;
	case dt_date:
		tsArchive->TabVisible = true;
		tsAnalog->TabVisible = false;
		tsLogical->TabVisible = false;
		break;
	case dt_bool:
		edtOnMessage->Text = pTag->s.SwitchMsg.OnMsg;
		edtOffMessage->Text = pTag->s.SwitchMsg.OffMsg;
		tsLogical->TabVisible = true;
		tsAnalog->TabVisible = false;		
	default:
		assert(0);
		break;
	}

	tsAnalog->Visible = tsAnalog->TabVisible;
	tsLogical->Visible = tsLogical->TabVisible;
	tsException->Visible = tsException->TabVisible;
	tsArchive->Visible = tsArchive->TabVisible;
	
	edtAlarmRank->Text = pTag->s.AlarmRank;
    edtAlarmRank2->Text = pTag->s.AlarmRank;

	chkCompressing->Checked = true;
	edtCompMax->Enabled = chkCompressing->Checked;
	edtCompDev->Enabled = chkCompressing->Checked;
	edtCompDevPercent->Enabled = chkCompressing->Checked;
	edtCompMax->Text = IntToStr(pTag->s.CompMax);
	edtCompDev->Text = FloatToStr(pTag->s.CompDev);
    __r8 span = _getSpan(pTag);
    if(span > 1e-5){
		edtCompDevPercent->Text = FloatToStr(pTag->s.CompDev / span * 100);
    }

	TAG_NAME ctn;
	ZeroMemory(&ctn, sizeof(ctn));
	ctn.sname = pTag->s.CutOffTagName;
	tagname_to_text(&ctn, textname, sizeof(textname));
	
	// debugging output
	{
		char nn[128];
		*nn=0;
	#define __check_field__(field,name) \
		if(pTag->d.Value.Flags & TF_##field) {\
			if(*nn) {\
				strcat(nn,"+");\
				strcat(nn,#name);\
			}else{\
				strcpy(nn,#name);\
			}\
		}
		__check_field__(HiHi,h2)
		__check_field__(Hi,h)
		__check_field__(LoLo,l2)
		__check_field__(Lo,l)
		__check_field__(Rate,r)
		__check_field__(On2Off,off)
		__check_field__(Off2On,on)
		__check_field__(Alarm,alarm)
		__check_field__(Expired,expired)
		__check_field__(SharpChange,sharp)
		__check_field__(ReadOnly,read)
		__check_field__(Translated,trans)
		__check_field__(ConfigOk,ok)
		__check_field__(Valid,valid)
		utils_debug("%s flags=0x%08x,%s\n", textname, pTag->d.Value.Flags, nn);
	#undef __check_field__
	}

	// pg->Clear();
}
void CPacketMan::request_packets(RECEIVE_ITEM * h)
{
	char	packet_buffer[MAX_PACKET_SIZE];
	PRTK_PACKET packet;
	__u16 *rsids;
	__uint items;
	int j, i;

	packet = (PRTK_PACKET)packet_buffer;
	ZeroMemory(packet, sizeof(RTK_PACKET));
	items = h->unreceived_fragments;
	if(items > 10){
		items = 10;
	}
	packet->version = RTK_VERSION;
	packet->src.host= g_ThisNode->key;
	packet->dest	= h->header->src;
	packet->guid.create();
	packet->total_frag = 1;
	packet->data_size = sizeof(__u32)*items
		+ sizeof(RTK_GUID);
	/*
	packet->packet_size = packet->data_size + sizeof(*packet) - 
		sizeof(packet->data);
	*/
	packet->packet_type = PT_RequestFragment;
	*((PRTK_GUID)packet->data) = h->header->guid;
	rsids = (__u16*)(packet->data + sizeof(RTK_GUID));
	
#ifdef RESEND_DEBUG
	char dbg_msg[1024], *dbg_p;
	dbg_msg[0] = 0;
	dbg_p = dbg_msg;
	dbg_p += sprintf(
		dbg_p, "_P: Need %d of %d, grp %d, SOURCE=%s:%d, type=%08x", 
		items, 
		h->header->total_frag,
		h->header->grp_id,
		(char *)CHostName(h->header->src.host),
		h->header->src.port,
		h->header->packet_type
		);
#endif

	*rsids = h->header->grp_id;
	rsids++;
	j = 0;
	for(i=0; i<h->header->total_frag; i++){
		if(!h->bitmap[i]){
			*rsids = i; 					
#ifdef RESEND_DEBUG
			dbg_p += sprintf(dbg_p, "%d ", *rsids);
#endif
			j++;
			assert(j<=h->unreceived_fragments);
			if(j >= items){
				break;
			}
			rsids++;
		}
	}

	if(h->unreceived_fragments <= 10){
		assert(j == h->unreceived_fragments);
	}
	
#ifdef RESEND_DEBUG
	utils_debug("%s\n", dbg_msg);
#endif

	SendPacket(packet);
}
Beispiel #7
0
LIBUTILS_API char * UTILS_API 
get_file_versionA(const char * szFile, LARGE_INTEGER * liVersion)
{	
	char * pVersion=0;
	DWORD dwVersionSize, dwHnd;
	LARGE_INTEGER _liVersion;
	WORD * s;
	VS_FIXEDFILEINFO * pBlock;
	UINT dwBytes;

	if(!liVersion){
		liVersion=&_liVersion;
	}
	
	memset(liVersion,0,sizeof(LARGE_INTEGER));

	while(TRUE){
		dwHnd = 0;
		dwVersionSize=GetFileVersionInfoSize((char *)szFile, &dwHnd);
		if(!dwVersionSize){
			return g_szVersion;
		}

		pVersion=(char *)malloc(dwVersionSize*4);	// *4: for some bugs
		if(!pVersion){
			break;
		}
		my_heapchk();
		if( !GetFileVersionInfo((char*)szFile, dwHnd, dwVersionSize, pVersion) ){
			break;
		};
		my_heapchk();
		// Structure used to store enumerated languages and code pages.

		pBlock=0;
		dwBytes = sizeof(pBlock);	
		// Retrieve file description for language and code page "i". 
		VerQueryValue(pVersion,"\\",(void**)&pBlock,&dwBytes);
		my_heapchk();
		if(pBlock){
#if 1
			liVersion->HighPart=pBlock->dwFileVersionMS;
			liVersion->LowPart=pBlock->dwFileVersionLS;
#else
			liVersion->HighPart=pBlock->dwProductVersionMS;
			liVersion->LowPart=pBlock->dwProductVersionLS;
#endif
		}
		break;
	};

#ifdef __profile__
	time_mark(&t2);
	utils_debug("get_file_version costs %.3f ms.\n", time_diff(&t2,&t1)*1000);
#endif

	s = (WORD*)liVersion;
	sprintf(g_szVersion, "%d.%d.%d.%d",s[3],s[2],s[1],s[0]);
	my_heapchk();

	if(pVersion){
		free(pVersion);
	}

	return g_szVersion;
}