[Info-vax] POSIX Thread stack highwater mark

VAXman- at SendSpamHere.ORG VAXman- at SendSpamHere.ORG
Thu Feb 10 21:10:11 EST 2011


In article <2174b7d3-c50a-4062-85b4-212b6c8c0d97 at i39g2000prd.googlegroups.com>, RobertsonEricW <robertsonericw at netzero.net> writes:
>Is there a way to determine the highwater mark for usage of a POSIX
>Thread's stack?
>
>I am trying to determine the appropriate stack size based on empirical
>executions of a thread so that I don't waste memory by allocating an
>unnecessarily large stack when creating a POSIX thread.
>
>Thanks in advance for any wisdom.

Perhaps this will shed some light as well.  I have to be on the road
tomorrow.  If you have any other questions, post them here or email, 
and I'll answer when I have a chance.


//++
// Copyright © 2010-2011 by Brian Schenkenberger and TMESIS SOFTWARE
// ALL RIGHTS RESERVED.
//
// The technology embodied within this code is not authorized for use
// by any schmucks without the prior written consent of its author.
//
// I see C -- Yuck!
//--

#pragma environment save
#pragma message disable MAINPROGEXT
#define __NEW_STARLET 1

#include <errno.h>
#include <errnodef.h>

#include <stsdef.h>
#include <lib$routines.h>

#ifdef  EABANDONED
#define DECC$ERRNO_TO_MSGCOD(x) (x <= EBADMSG ? C$_EPERM+((x-1)<<STS$V_CODE) \
                                 : C$_EABANDONED+((x-1-EBADMSG)<<STS$V_CODE) )
#else
#define DECC$ERRNO_TO_MSGCOD(x)               ( C$_EPERM+((x-1)<<STS$V_CODE) )
#endif

#include <pthread.h>
#include <tebdef.h>

#include <stdio.h>
#include <stdlib.h>
#include <starlet.h>

#pragma optimize save
#pragma optimize level=5
#pragma required_pointer_size save
#pragma required_pointer_size long

#ifdef __ia64
__int64 __SP() {__int64 i; return (__int64)&i;}
#endif
#ifdef  __alpha
__int64 __SP() {__int64 i; return (__int64)&i+8;}
#endif
#pragma inline (__SP)

#pragma required_pointer_size restore
#pragma optimize restore


#pragma optimize save
#pragma optimize level=0			// or the array is optimized away
small ()
  {
    int small_array[16];			// consume a small amount of stack

    printf("small: TEB: %08X\n", pthread_self());

    ((TEB*) pthread_self())->teb$pq_stack_hiwater = (void*) __SP(); 

    printf("stack base: %08X\nstack high: %08X\nstack used: %08X\n\n",
           ((TEB*) pthread_self())->teb$pq_stack_base,
           ((TEB*) pthread_self())->teb$pq_stack_hiwater,
      (int)((TEB*) pthread_self())->teb$pq_stack_base - (int)((TEB*) pthread_self())->teb$pq_stack_hiwater);

    SYS$HIBER();
  }
#pragma optimize restore


#pragma optimize save
#pragma optimize level=0			// or the array is optimized away
large ()
  {
    int large_array[1024];			// consume a small amount of stack

    printf("large: TEB: %08X\n", pthread_self());

    ((TEB*) pthread_self())->teb$pq_stack_hiwater = (void*) __SP(); 

    printf("stack base: %08X\nstack high: %08X\nstack used: %08X\n\n",
           ((TEB*) pthread_self())->teb$pq_stack_base,
           ((TEB*) pthread_self())->teb$pq_stack_hiwater,
      (int)((TEB*) pthread_self())->teb$pq_stack_base - (int)((TEB*) pthread_self())->teb$pq_stack_hiwater);

    SYS$HIBER();
  }
#pragma optimize restore

thread_demo() main_program 
  {
    int sts;

    pthread_t	small_stack_thread;
    pthread_t	large_stack_thread;
    pthread_attr_t attr;

    if (sts=pthread_attr_init(&attr)) { LIB$SIGNAL(DECC$ERRNO_TO_MSGCOD(sts)); }
    if (sts=pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN*2)) { LIB$SIGNAL(DECC$ERRNO_TO_MSGCOD(sts)); }

    if (sts=pthread_create(&small_stack_thread, &attr, (void *(*)(void*)) small, 0)) { LIB$SIGNAL(DECC$ERRNO_TO_MSGCOD(sts)); }
    if (sts=pthread_detach(small_stack_thread)) { LIB$SIGNAL(DECC$ERRNO_TO_MSGCOD(sts)); }

    if (sts=pthread_create(&large_stack_thread, &attr, (void *(*)(void*)) large, 0)) { LIB$SIGNAL(DECC$ERRNO_TO_MSGCOD(sts)); }
    if (sts=pthread_detach(large_stack_thread)) { LIB$SIGNAL(DECC$ERRNO_TO_MSGCOD(sts)); }

    SYS$HIBER();
  }

#pragma environment restore
-- 
VAXman- A Bored Certified VMS Kernel Mode Hacker    VAXman(at)TMESIS(dot)ORG

All your spirit rack abuses, come to haunt you back by day.
All your Byzantine excuses, given time, given you away.



More information about the Info-vax mailing list