Jump to content
  • Advertisement
Sign in to follow this  
Prozak

How to make piece of code be the very first to run...

This topic is 4393 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I've got various code that depends on mutexes to work, because of inter-thread syncronization. To generate these handles for mutexes and events I create random strings of char[80]. But... the very first piece of code I would like to run would be a randomizer, before these strings get generated, or they'll be exactly alike the last run. These are inside various classes that are global. So, how do I make it so a certain piece of code is absolutely the first to run?

Share this post


Link to post
Share on other sites
Advertisement
You can't do it in a general way without a _LOT_ of effort (and it's not worth it). Make a static boolean variable 'FirstRun' initialized to true inside your 'generate string' function, and if it's true, seed the PRNG and set the variable to fasle.
Also, you cold just use the CreateGUID functions provided by windows (if that is your target OS) to create the 'random' strings.

Share this post


Link to post
Share on other sites
Do you want the code to be the absolutely first code to run, or do you just need it to be run before the dynamic initializations of all your global variables? These are two different problems, and depending on your programming language, the two problems can have very different answers. Assuming C++, the first question is not solvable. Also assuming C++, you can solve the second problem by adding a static or anonymous namespaced class object in the header that defines your string generator that in the constructor calls the initializer for the randomizer if the randomizer has not already been initialized. This is the same as the traditional mechanism used to make sure that the C++ iostream objects (cout, etc.) are initialized prior to use.

Share this post


Link to post
Share on other sites
Quote:
Original post by SiCrane
Do you want the code to be the absolutely first code to run, or do you just need it to be run before the dynamic initializations of all your global variables? These are two different problems, and depending on your programming language, the two problems can have very different answers. Assuming C++, the first question is not solvable. Also assuming C++, you can solve the second problem by adding a static or anonymous namespaced class object in the header that defines your string generator that in the constructor calls the initializer for the randomizer if the randomizer has not already been initialized. This is the same as the traditional mechanism used to make sure that the C++ iostream objects (cout, etc.) are initialized prior to use.


Thank you SiCrane for your reply. The language is Visual Studio's C++, win32. I don't actually need it to be the very first piece of code run, just need it to be run before other code that requires randomization.

Perhaps if I make the first "include" in my main.cpp to a file that does this?

Share this post


Link to post
Share on other sites
C++ makes few guarantees about the order in which global objects get initialized and depending on that sort of thing is very fragile. To rephrase what SiCrane said a bit you need to have your dependent objects initialize the randomizer on-demand rather than just assuming it is always initialized.

Most implementations of the singleton pattern do this sort of thing.

Share this post


Link to post
Share on other sites
Obviously, what you need is a COMEFROM keyword. Then you could just go

COMEFROM Start_of_program
//initialise...
RETURN

Simple!

Share this post


Link to post
Share on other sites
is this inter or intraprocess? why couldnt you just register you're mutex handles before initializing you're threads?

Share this post


Link to post
Share on other sites
I think this will solve your problem:

Put the code you want to run in a class constructor.
Instatiate an instance of the class in a global variable (or any variable of with file scope).
The constructor will be called before main() is entered.

Share this post


Link to post
Share on other sites
Quote:
Original post by Prozak
Perhaps if I make the first "include" in my main.cpp to a file that does this?

No, that would not be sufficient since there is no guarantee that the global objects in main.cpp will be initialized before the global objects in other source files. You need to make sure that the randomizer is initialized before any of your strings are initialized.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
This can be done with a static class that creates a ref counted heap instance when first accessed.

The problem is that C++ does not garentee the order of static creation. So making a class create an instance of the required class when it is first needed/referenced allows dependancies to be created in the right order.

in your case you need the name of a mutex so:



template< typename TArg >
class Static
{
static TArg* pInstance;
static unsinged int uiCount;

public:
Static()
{ Create(); }
~Static()
{ Destroy(); }

void Create( void )
{ if( !(++uiCount) )
--uiCount;
if( !pInstance )
pInstance =new TArg;
}
void Destroy( void )
{ if( uiCount && ~uiCount )
--uiCount;
if( !uiCount )
{ delete pInstance;
pInstance =NULL;
}
}

TArg* operator->()
{ return pInstance;
}
}

// header
class MutexNames;
Static<MutexNames> gMutexNames;

// code
gMutexNames.Create(); <-inc ref count, create internal instance if not already.
...
gMutexNames->GetName(); <- do stuff
...
gMutexNames.Release(); <-dec ref count, delete if needed




The instances need to be reference counted because construction and destruction of the class holding the instance does not actually bound the lifetime of class use.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!