示例#1
0
void client::run_client_print() {
	void *buffer = shmat(shm_id, NULL, 0);
	while (1) {
		message_to_print.clear();

		WaitSemaphore(sem_id, 2);
		WaitSemaphore(sem_id, 0);

		length = *(int*)buffer;
		ReleaseSemaphore(sem_id, 1);

		if (length == -1) break;

		NumberOfBlocks = ceil((double)length / (double)size_of_buff);
		for (int i = 0; i < NumberOfBlocks; i++) {
			WaitSemaphore(sem_id, 0);
			message_to_print.append((char*)buffer, size_of_buff);
			ReleaseSemaphore(sem_id, 1);
		}

		message_to_print.resize(length);
		cout << "Client: ";

		for (int i = 0; i < length; i++) {
			putchar(message_to_print[i]);
			fflush(stdout);
			usleep(SLEEP_TIME);
		}
		cout << endl;

		ReleaseSemaphore(sem_id, 3);
	}
}
示例#2
0
void *start_work(void *sigcache_ptr)
{
  SignatureCache *C = sigcache_ptr;
  int threadID = atomicFetchAndAdd(&threads_running, 1);

  for (;;) {
    WaitSemaphore(&sem_jobs_ready);
    if (finishup) break;

    int currjob = atomicFetchAndAdd(&jobs_start, 1) % JOB_POOL;

    jobs[currjob].state = TAKEN;
    jobs[currjob].owner = threadID;
    ProcessFile(C, jobs[currjob].doc);

    jobs[currjob].state = EMPTY;

    atomicFetchAndAdd(&jobs_complete, 1);
    atomicFetchAndSub(&current_jobs, 1);
    PostSemaphore(&sem_job_avail[currjob]);
  }

  atomicFetchAndSub(&threads_running, 1);
  return NULL;
}
示例#3
0
void client::run_client_send() {
	void *buffer = shmat(shm_id, NULL, 0);
	while (1) {
		system("stty -echo");
		ReleaseSemaphore(sem_s_id, 0);
		WaitSemaphore(sem_c_id, 0);
		if (getch_noblock() != -1) {
			ReleaseSemaphore(sem_s_id, 1);
			message_to_send.clear();
			cout << "Server: ";
			system("stty echo");
			tcflush(STDIN_FILENO, TCIFLUSH);
			getline(cin, message_to_send);
			system("stty -echo");

			ReleaseSemaphore(sems_id, 2);

			length = message_to_send.size();
			*(int*)buffer = length;

			ReleaseSemaphore(sems_id, 0);
			WaitSemaphore(sems_id, 1);

			NumberOfBlocks = ceil((double)length / (double)size_of_buff);
			for (int i = 0; i < NumberOfBlocks; i++) {
				message_to_send.copy((char*)buffer, size_of_buff, i*size_of_buff);

				ReleaseSemaphore(sems_id, 0);
				WaitSemaphore(sems_id, 1);
			}
			WaitSemaphore(sems_id, 3);
		}
		usleep(SLEEP_TIME_ONE);
		length = *(int*)buffer;
		if (length == -1) break;
	}
}
示例#4
0
void server::server_print() 
{
	void *bufferer = shmat(shm_id, NULL, 0);
	while (1) 
	{
		print_message.clear();

		WaitSemaphore(sems_id, 2);
		WaitSemaphore(sems_id, 0);

		length = *(int*)bufferer;
		ReleaseSemaphore(sems_id, 1);

		if (length == -1) break;

		numberberOfBlocks = ceil((double)length / (double)size_of_buffer);
		for (int i = 0; i < numberberOfBlocks; i++) 
		{
			WaitSemaphore(sems_id, 0);
			print_message.append((char*)bufferer, size_of_buffer);
			ReleaseSemaphore(sems_id, 1);
		}

		print_message.resize(length);
		cout << "Server: ";

		for (int i = 0; i < length; i++) 
		{
			putchar(print_message[i]);
			fflush(stdout);
			usleep(SLEEP_TIME);
		}
		cout << endl;
		ReleaseSemaphore(sems_id, 3);
	}
}
示例#5
0
void ProcessFile_Threaded(Document *doc)
{
  if (jobs_start == -1) {
    threads_running = 0;
    memset((void *)jobs, 0, sizeof(jobs));

    InitSemaphore(&sem_jobs_ready, 0, 0);
    for (int i = 0; i < JOB_POOL; i++) {
      InitSemaphore(&sem_job_avail[i], 0, 1);
    }

    threadpool_size = GetIntegerConfig("THREADS", 1)+1;
    threadpool = malloc(sizeof(pthread_t) * threadpool_size);
    threadcache = malloc(sizeof(SignatureCache *) * threadpool_size);

    jobs_start = 0;
    jobs_end = 0;
    current_jobs = 0;
    jobs_complete = 0;
    finishup = 0;

    threadcache[0] = NewSignatureCache(2, 0);
    pthread_create(threadpool+0, NULL, start_work_writer, threadcache[0]);
    for (int i = 1; i < threadpool_size; i++) {
      threadcache[i] = NewSignatureCache(0, 1);
      pthread_create(threadpool+i, NULL, start_work, threadcache[i]);
    }
  }
  int currjob = atomicFetchAndAdd(&jobs_end, 1) % JOB_POOL;

  WaitSemaphore(&sem_job_avail[currjob]);

  jobs[currjob].doc = doc;
  jobs[currjob].state = READY;

  atomicFetchAndAdd(&current_jobs, 1);
  PostSemaphore(&sem_jobs_ready);
}
示例#6
0
void server::server_send(char *argv) 
{
	switch (pid)
	{
	case -1:
		printf("New process is not created\n");
		return;

	case 0:
		execlp("mate-terminal", "mate-terminal", "-x", argv, "-n 2", itoa(shm_id),
			itoa(sem_id), itoa(sems_id), itoa(sem_server_id), itoa(sem_client_id), NULL);
		break;

	default:
	{
		void *bufferer = shmat(shm_id, NULL, 0);
		while (1) 
		{
			system("stty -echo");
			ReleaseSemaphore(sem_client_id, 0);
			WaitSemaphore(sem_server_id, 0);
			if (getch_noblock() != -1) 
			{
				ReleaseSemaphore(sem_client_id, 1);
				send_message.clear();
				cout << "Client: ";
				system("stty echo");
				tcflush(STDIN_FILENO, TCIFLUSH);
				getline(cin, send_message);
				system("stty -echo");

				ReleaseSemaphore(sem_id, 2);

				if (send_message == "exit" || send_message == "end") 
				{
					length = -1;
					*(int*)bufferer = length;
					ReleaseSemaphore(sem_id, 0);
					ReleaseSemaphore(sems_id, 2);
					ReleaseSemaphore(sems_id, 0);
					ReleaseSemaphore(sem_client_id, 0);
					WaitSemaphore(sem_id, 1);
					waitpid(pid, NULL, 0);
					break;
				}

				length = send_message.size();
				*(int*)bufferer = length;

				ReleaseSemaphore(sem_id, 0);
				WaitSemaphore(sem_id, 1);

				numberberOfBlocks = ceil((double)length / (double)size_of_buffer);
				for (int i = 0; i < numberberOfBlocks; i++) 
				{
					send_message.copy((char*)bufferer, size_of_buffer, i*size_of_buffer);
					ReleaseSemaphore(sem_id, 0);
					WaitSemaphore(sem_id, 1);
				}
				WaitSemaphore(sem_id, 3);
			}
			usleep(SLEEP_TIME_ONE);
		}
	}
	break;
	}
}