xterm_title Test Fix (delay removed)

Tribhuvan loka at rcn.com
Wed Jan 15 06:45:06 UTC 2003


Proposal for Tomas's xterm_title_restore patch
(possible solution for eliminating ~5-second delay)

This is a test program that illustrates the concept I
mentioned earlier regarding elimination of the 'up to
now' unconditional delay experienced when storing
the xterm_title( re: patch-898 ). If you don't think
introducing a new library dependancy to the package
is a problem, or if you want to kick the code around
a bit before someone takes the time to actually
integrate it with the patch, find any other problem
with the concept/implementation, whatever, let me know
and I or anybody who likes can integrate patch-898
with this code or it's descendants.... (long sentance?
- old habbit from reading Buckminster Fuller...)

To consider:

note on Linux:
#include <pthread.h>

pthread.h:18 -> features.h:312 wants to see a
file "/usr/include/gnu/stubs.h" this may not
exist, and to solve the problem, the Makefile
should test if gnu-path and stubs.h exists,
else: touch /usr/include/gnu/stubs.h

tested on Solaris 8,9, gcc-3.2.1
and RedHat 7.2 (kernel 2.4.17), gcc-3.0.4

for the moment, see first two lines of comment in
the code for the easy build command.

___________________________________________________

/* To build: Solaris: `gcc example.c -lthread -lpthread`           */
/*             Linux: `gcc example.c -lpthread`                    */


/* for testing: lower number here finishes first                   */
/* (not real seconds, but close - for testing only)                */
static int MAX_TIMEOUT = 6;  /* 5 psudo-seconds should be enough   */
static int TITLE_TIME  = 5;  /* this is just for the experiment    */

/* Choose threading model. Solaris threads are POSIX compatible, but
   * this may be needed for backwards compatibility. I found that
   * both Linux and Solaris are compatible with either Posix/nonPosix. */
#define POSIX 1


/* for threading */
#define _REENTRANT
#define NUM_THREADS 2

#ifdef POSIX
#   include <pthread.h>
      pthread_t tid[NUM_THREADS];
#else
#   include <thread.h>
      thread_t tid[NUM_THREADS];
#endif

/* processes */
void spin();
void *child (void *);

/* to exit child threads */
unsigned int quit = 0;

int
main(){

printf("_________________________________________________________________\n");
        printf("\nmain()    Starting a function that will start two
threads"   );
        printf("\n          simultaneously. Whichever one finishes first
will" );
        printf("\n          kill the others and I can continue.\n");
        sleep(2); /* just make the program run smoothly */
        spin(2);  /* this starts the two threads        */
        printf("\nmain()    maha dev!\n");
}

void
spin(int gayatri_mavahayami) /* salute... */
{
    printf("\nspin()    I'm going to start the two threads at very nearly
same time:\n\n");

    int i;

    /*Start threads*/
#ifdef POSIX
      for ( i = 0; i < NUM_THREADS; i++ ) {
        pthread_create(&tid[i], NULL, child, (void *)i );
      }
      for ( i = 0; i < NUM_THREADS; i++)
        pthread_join(tid[i], NULL);
#else   /* Use Solaris */
      for ( i = 0; i < NUM_THREADS; i++ )
        thr_create(NULL, 0, child, (void *)i, 0, &tid[i]);
      while (thr_join(NULL, NULL, NULL) == 0) ;
#endif

    printf("\nspin()    Children done, here do \"return title+3\"...\n");
}

void *
child (void *asamohah) /*sanskrt: 'non-delusion by percieved duality' */
{
    int decide = (int)asamohah;
    int t;
    if (decide == 0) { /* using 0.1 of a second so we exit faster on
success */
      printf("child(%d)  Max_timeout starting...\n",decide);
      for (t = MAX_TIMEOUT*69; t > 0; t--) {
	if (!quit) {
	  usleep(10000);
	} else { t = 0; }
      }
      if (!quit) {
        printf("\nchild(%d)  Max_timeout done first\n",decide);
        printf("          Retrieving title wasn't fast enough, killed
process.\n");
      }
      quit = 1;
    }
    else {
      printf("child(%d)  Get_title   starting... ",decide);
      printf("\n          Here's where I'd get the old_xterm_title...\n");
      int got_it = 0;  /*something for later...*/
      for (t = TITLE_TIME; t > 0; t--) {
	if (!quit) {
	  sleep(1);
	} else { t = 0; }
      }
      if (!quit)
        printf("\nchild(%d)  Got title before timeout, doing away with
twin and self\n",decide);
      quit = 1;
    }
}






More information about the mc-devel mailing list