I suspect something i am doing wrong, but still it crashes and i do not
see it why
#include <tcl.h>
#include <stdlib.h>
#include <memory.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>
#define MemAlloc malloc
#define MemFree free
static int nbuffer = 16384;
static int nloops = 50000;
static int nthreads = 4;
static void *gPtr = NULL;
static Tcl_Mutex gLock;
void MemThread(void *arg)
{
int i,n;
void *ptr = NULL;
for (i = 0; i < nloops; ++i) {
n = 1 + (int) (nbuffer * (rand() / (RAND_MAX + 1.0)));
if (ptr != NULL) {
MemFree(ptr);
}
ptr = MemAlloc(n);
if (n % 50 == 0) {
Tcl_MutexLock(&gLock);
if (gPtr != NULL) {
MemFree(gPtr);
gPtr = NULL;
} else {
gPtr = MemAlloc(n);
}
Tcl_MutexUnlock(&gLock);
}
}
}
int main (int argc, char **argv)
{
int i;
Tcl_ThreadId *tids;
tids = (Tcl_ThreadId *)malloc(sizeof(Tcl_ThreadId) * nthreads);
for (i = 0; i < nthreads; ++i) {
Tcl_CreateThread( &tids[i], MemThread, NULL,
TCL_THREAD_STACK_DEFAULT, TCL_THREAD_JOINABLE);
}
for (i = 0; i < nthreads; ++i) {
Tcl_JoinThread(tids[i], NULL);
}
}
Stephen Deasey wrote:
On 12/18/06, Vlad Seryakov <[EMAIL PROTECTED]> wrote:
Still, even without the last free and with mutex around it, it core
dumps in free(gPtr) during the loop.
OK. Still doesn't mean your program is bug free :-)
There's a lot of extra stuff going on in your example program that
makes it hard to see what's going on. I simplified it to this:
#include <tcl.h>
#include <stdlib.h>
#include <assert.h>
#define MemAlloc ckalloc
#define MemFree ckfree
void *gPtr = NULL; /* Global pointer to memory. */
void
Thread(void *arg)
{
assert(gPtr != NULL);
MemFree(gPtr);
gPtr = NULL;
}
int
main (int argc, char **argv)
{
Tcl_ThreadId tid;
int i;
for (i = 0; i < 100000; ++i) {
gPtr = MemAlloc(1024);
assert(gPtr != NULL);
Tcl_CreateThread(&tid, Thread, NULL,
TCL_THREAD_STACK_DEFAULT, TCL_THREAD_JOINABLE);
Tcl_JoinThread(tid, NULL);
assert(gPtr == NULL);
}
}
Works for me.
I say you can allocate memory in one thread and free it in another.
Let me know what the bug turns out to be..!
Stephen Deasey wrote:
On 12/18/06, Vlad Seryakov <[EMAIL PROTECTED]> wrote:
I tried to run this program, it crahses with all allocators on free when
it was allocated in other thread. zippy does it as well, i amnot sure
how Naviserver works then.
I don't think allocate in one thread, free in another is an unusual
strategy. Googling around I see a lot of people doing it. There must
be some bugs in your program. Here's one:
At the end of MemThread() gPtr is checked and freed, but the gMutex is
not held. This thread may have finished it's tight loop, but the other
3 threads could still be running. Also, the gPtr is not set to NULL
after the free(), leading to a double free when the next thread checks
it.
#include <tcl.h>
#define MemAlloc ckalloc
#define MemFree ckfree
int nbuffer = 16384;
int nloops = 50000;
int nthreads = 4;
int gAllocs = 0;
void *gPtr = NULL;
Tcl_Mutex gLock;
void MemThread(void *arg)
{
int i,n;
void *ptr = NULL;
for (i = 0; i < nloops; ++i) {
n = 1 + (int) (nbuffer * (rand() / (RAND_MAX + 1.0)));
if (ptr != NULL) {
MemFree(ptr);
}
ptr = MemAlloc(n);
// Testing inter-thread alloc/free
if (n % 5 == 0) {
Tcl_MutexLock(&gLock);
if (gPtr != NULL) {
MemFree(gPtr);
}
gPtr = MemAlloc(n);
gAllocs++;
Tcl_MutexUnlock(&gLock);
}
}
if (ptr != NULL) {
MemFree(ptr);
}
if (gPtr != NULL) {
MemFree(gPtr);
}
}
void MemTime()
{
int i;
Tcl_ThreadId *tids;
tids = (Tcl_ThreadId *)malloc(sizeof(Tcl_ThreadId) * nthreads);
for (i = 0; i < nthreads; ++i) {
Tcl_CreateThread( &tids[i], MemThread, NULL,
TCL_THREAD_STACK_DEFAULT, TCL_THREAD_JOINABLE);
}
for (i = 0; i < nthreads; ++i) {
Tcl_JoinThread(tids[i], NULL);
}
}
int main (int argc, char **argv)
{
MemTime();
}
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
naviserver-devel mailing list
naviserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/naviserver-devel
--
Vlad Seryakov
571 262-8608 office
[EMAIL PROTECTED]
http://www.crystalballinc.com/vlad/
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
naviserver-devel mailing list
naviserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/naviserver-devel
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
naviserver-devel mailing list
naviserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/naviserver-devel
--
Vlad Seryakov
571 262-8608 office
[EMAIL PROTECTED]
http://www.crystalballinc.com/vlad/