extern "C" { #include #include #include #include #include #include #include #include } #define WEAK(x) x typedef void (*new_handler)(); new_handler __new_handler = 0; new_handler set_new_handler (new_handler handler) { unsigned long flags; save_flags(flags); cli(); new_handler prev_handler = __new_handler; __new_handler = handler; restore_flags(flags); return prev_handler; } WEAK (void * operator new (size_t sz)) { void *p; /* malloc (0) is unpredictable; avoid it. */ if (sz == 0) sz = 1; p = (void *) kmalloc (sz, GFP_KERNEL); while (p == 0) { new_handler handler = __new_handler; if (! handler) return 0; handler(); p = (void *) kmalloc (sz, GFP_KERNEL); } return p; } WEAK(void * operator new[] (size_t sz)) { return ::operator new(sz); } WEAK (void operator delete (void *ptr)) { if (ptr) kfree(ptr); } WEAK (void operator delete[] (void *ptr)) { ::operator delete (ptr); }