[jboss-cvs] JBoss Messaging SVN: r3710 - projects/jaio/trunk/jaio/native/src.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Feb 12 16:15:01 EST 2008
Author: clebert.suconic at jboss.com
Date: 2008-02-12 16:15:01 -0500 (Tue, 12 Feb 2008)
New Revision: 3710
Added:
projects/jaio/trunk/jaio/native/src/AIOException.h
Modified:
projects/jaio/trunk/jaio/native/src/AIOController.cpp
projects/jaio/trunk/jaio/native/src/AIOController.h
projects/jaio/trunk/jaio/native/src/BufferAdapter.h
projects/jaio/trunk/jaio/native/src/FileOutput.cpp
projects/jaio/trunk/jaio/native/src/FileOutput.h
projects/jaio/trunk/jaio/native/src/JNIBufferAdapter.cpp
projects/jaio/trunk/jaio/native/src/LibAIOController.cpp
projects/jaio/trunk/jaio/native/src/PageManager.cpp
projects/jaio/trunk/jaio/native/src/org_jboss_jaio_libaioimpl_LibAIOController.h
Log:
Implementing better paging and exceptions
Modified: projects/jaio/trunk/jaio/native/src/AIOController.cpp
===================================================================
--- projects/jaio/trunk/jaio/native/src/AIOController.cpp 2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/AIOController.cpp 2008-02-12 21:15:01 UTC (rev 3710)
@@ -1,13 +1,14 @@
+#include <string>
#include "AIOController.h"
#include "PageManager.h"
-AIOController::AIOController(int fileHandle) : fileOutput(fileHandle)
+AIOController::AIOController(std::string fileName) : fileOutput(fileName)
{
manager = (DataManager *)&fileOutput;
usingPaging = false;
}
-AIOController::AIOController(int fileHandle, int pageSize) : fileOutput(fileHandle)
+AIOController::AIOController(std::string fileName, int pageSize) : fileOutput(fileName)
{
manager = new PageManager(pageSize, &fileOutput);
usingPaging = true;
Modified: projects/jaio/trunk/jaio/native/src/AIOController.h
===================================================================
--- projects/jaio/trunk/jaio/native/src/AIOController.h 2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/AIOController.h 2008-02-12 21:15:01 UTC (rev 3710)
@@ -2,6 +2,7 @@
#define AIOCONTROLLER_H_
#include <jni.h>
+#include <string>
#include "FileOutput.h"
#include "DataManager.h"
@@ -22,8 +23,8 @@
bool usingPaging;
- AIOController(int fileHandle, int pageSize);
- AIOController(int fileHandle);
+ AIOController(std::string fileName, int pageSize);
+ AIOController(std::string fileName);
virtual ~AIOController();
};
#endif /*AIOCONTROLLER_H_*/
Added: projects/jaio/trunk/jaio/native/src/AIOException.h
===================================================================
--- projects/jaio/trunk/jaio/native/src/AIOException.h (rev 0)
+++ projects/jaio/trunk/jaio/native/src/AIOException.h 2008-02-12 21:15:01 UTC (rev 3710)
@@ -0,0 +1,42 @@
+#ifndef AIOEXCEPTION_H_
+#define AIOEXCEPTION_H_
+
+#include <exception>
+#include <string>
+
+class AIOException : public std::exception
+{
+private:
+ int errorCode;
+ std::string message;
+public:
+ AIOException(int _errorCode, std::string & _message) throw() : errorCode(_errorCode), message(_message)
+ {
+ errorCode = _errorCode;
+ message = _message;
+ }
+
+ AIOException(int _errorCode, const char * _message) throw ()
+ {
+ message = std::string(_message);
+ errorCode = _errorCode;
+ }
+
+ virtual ~AIOException() throw()
+ {
+
+ }
+
+ int inline getErrorCode()
+ {
+ return errorCode;
+ }
+
+ const char* what() const throw()
+ {
+ return message.data();
+ }
+
+};
+
+#endif /*AIOEXCEPTION_H_*/
Modified: projects/jaio/trunk/jaio/native/src/BufferAdapter.h
===================================================================
--- projects/jaio/trunk/jaio/native/src/BufferAdapter.h 2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/BufferAdapter.h 2008-02-12 21:15:01 UTC (rev 3710)
@@ -4,8 +4,11 @@
#include <iostream>
class BufferAdapter
{
+private:
+ // The number of pages that are expected to be used by this Buffer
+ int blocks;
public:
- BufferAdapter()
+ BufferAdapter() : blocks(1)
{
}
@@ -14,6 +17,27 @@
}
+ void setBlocks(int _blocks)
+ {
+ blocks = _blocks;
+ std::cout << "blocks = " << blocks << "\n";
+ }
+
+ void addBlock()
+ {
+ // TODO: Do I need to mutex here?
+ blocks++;
+ }
+
+ void completeBlock()
+ {
+ // TODO: Do I need to mutex here?
+ if (--blocks <= 0)
+ {
+ done();
+ }
+ }
+
virtual void addref() = 0;
virtual void deleteRef() = 0;
virtual void encode(const int& size, void *) = 0;
Modified: projects/jaio/trunk/jaio/native/src/FileOutput.cpp
===================================================================
--- projects/jaio/trunk/jaio/native/src/FileOutput.cpp 2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/FileOutput.cpp 2008-02-12 21:15:01 UTC (rev 3710)
@@ -1,16 +1,28 @@
-#include "FileOutput.h"
#include <list>
#include <iostream>
#include <memory.h>
#include <fcntl.h>
+#include "FileOutput.h"
+#include "AIOException.h"
-FileOutput::FileOutput(int _fileHandle)
+FileOutput::FileOutput(std::string & _fileName)
{
- fileHandle = _fileHandle;
+ fileName = _fileName;
+
+ fileHandle = open(fileName.data(), O_WRONLY | O_CREAT, 0666);
+ if (fileHandle < 0)
+ {
+ throw AIOException(1, "Can't open file");
+ }
+
}
FileOutput::~FileOutput()
{
+ if (close(fileHandle))
+ {
+ throw AIOException(2,"Can't close file");
+ }
}
void FileOutput::completePage(long size, void * page, std::list<BufferAdapter *> * adapters)
@@ -18,8 +30,7 @@
::write(fileHandle, page, size);
for (std::list<BufferAdapter *>::iterator iter = adapters->begin(); iter != adapters->end(); iter++)
{
- std::cout << "Element read\n\n";
- (*iter)->done();
+ (*iter)->completeBlock();
(*iter)->deleteRef();
}
@@ -33,9 +44,9 @@
{
int size = adapter->blockSize();
void * buffer = malloc(size);
+ adapter->encode(size, buffer);
::write(fileHandle, buffer, size);
- adapter->encode(size, buffer);
- adapter->done();
+ adapter->completeBlock();
adapter->deleteRef();
free(buffer);
}
Modified: projects/jaio/trunk/jaio/native/src/FileOutput.h
===================================================================
--- projects/jaio/trunk/jaio/native/src/FileOutput.h 2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/FileOutput.h 2008-02-12 21:15:01 UTC (rev 3710)
@@ -3,17 +3,24 @@
#include "PageObserver.h"
#include "DataManager.h"
+#include <string>
class FileOutput : public PageObserver, DataManager
{
private:
int fileHandle;
+ std::string fileName;
public:
- FileOutput(int fileHandle);
+ FileOutput(std::string & _fileName);
virtual ~FileOutput();
void completePage(long size, void *, std::list<BufferAdapter *> *);
void addData(BufferAdapter * adapter);
+ int getHandle()
+ {
+ return fileHandle;
+ }
+
// Nothing to be done on FileOutput
void flushMemory()
{
Modified: projects/jaio/trunk/jaio/native/src/JNIBufferAdapter.cpp
===================================================================
--- projects/jaio/trunk/jaio/native/src/JNIBufferAdapter.cpp 2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/JNIBufferAdapter.cpp 2008-02-12 21:15:01 UTC (rev 3710)
@@ -21,7 +21,6 @@
}
void JNIBufferAdapter::done()
{
- std::cout << "Calling done " << controller->done << "\n";
controller->env->CallVoidMethod(obj,controller->done);
return;
}
Modified: projects/jaio/trunk/jaio/native/src/LibAIOController.cpp
===================================================================
--- projects/jaio/trunk/jaio/native/src/LibAIOController.cpp 2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/LibAIOController.cpp 2008-02-12 21:15:01 UTC (rev 3710)
@@ -12,6 +12,7 @@
#include "JavaUtilities.h"
#include "AIOController.h"
#include "JNIBufferAdapter.h"
+#include "AIOException.h"
//using namespace jbm;
@@ -23,35 +24,32 @@
JNIEXPORT jlong JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_init__Ljava_lang_String_2Ljava_lang_Class_2
(JNIEnv * env, jclass, jstring jstrFileName, jclass clazz)
{
- std::string fileName = convertJavaString(env, jstrFileName);
-
-
- int handle = open(fileName.data(), O_WRONLY | O_CREAT, 0666);
- if (handle < 0)
+ try
{
- throwException(env, "java/lang/RuntimeException", "Can't open file");
+ std::string fileName = convertJavaString(env, jstrFileName);
+
+ AIOController * controller = new AIOController(fileName);
+ controller->done = env->GetMethodID(clazz,"done","()V");
+ if (!controller->done) return 0;
+
+ controller->encode = env->GetMethodID(clazz,"encode","(Ljava/nio/ByteBuffer;)V");
+ if (!controller->done) return 0;
+
+ controller->decode = env->GetMethodID(clazz,"decode","(ILjava/nio/ByteBuffer;)V");
+ if (!controller->done) return 0;
+
+ controller->encodeSize = env->GetMethodID(clazz,"encodeSize","()I");
+ if (!controller->done) return 0;
+
+
+ controller->env = env;
+
+ return (jlong)controller;
+ }
+ catch (AIOException& e){
+ throwException(env, "java/lang/RuntimeException", e.what());
return 0;
}
-
- AIOController * controller = new AIOController(handle);
- controller->done = env->GetMethodID(clazz,"done","()V");
- if (!controller->done) return 0;
-
- controller->encode = env->GetMethodID(clazz,"encode","(Ljava/nio/ByteBuffer;)V");
- if (!controller->done) return 0;
-
- controller->decode = env->GetMethodID(clazz,"decode","(ILjava/nio/ByteBuffer;)V");
- if (!controller->done) return 0;
-
- controller->encodeSize = env->GetMethodID(clazz,"encodeSize","()I");
- if (!controller->done) return 0;
-
-
- controller->fileHandle = handle;
-
- controller->env = env;
-
- return (jlong)controller;
}
/*
@@ -62,49 +60,77 @@
JNIEXPORT jlong JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_init__Ljava_lang_String_2ILjava_lang_Class_2
(JNIEnv * env, jclass, jstring jstrFileName, jint pageSize, jclass clazz)
{
- std::string fileName = convertJavaString(env, jstrFileName);
-
- int handle = open(fileName.data(), O_WRONLY | O_CREAT, 0666);
- if (handle < 0)
+ try
{
- throwException(env, "java/lang/RuntimeException", "Can't open file");
+ std::string fileName = convertJavaString(env, jstrFileName);
+
+ AIOController * controller = new AIOController(fileName, pageSize);
+ controller->done = env->GetMethodID(clazz,"done","()V");
+ if (!controller->done) return 0;
+
+ controller->encode = env->GetMethodID(clazz,"encode","(Ljava/nio/ByteBuffer;)V");
+ if (!controller->done) return 0;
+
+ controller->decode = env->GetMethodID(clazz,"decode","(ILjava/nio/ByteBuffer;)V");
+ if (!controller->done) return 0;
+
+ controller->encodeSize = env->GetMethodID(clazz,"encodeSize","()I");
+ if (!controller->done) return 0;
+
+
+ controller->env = env;
+
+ return (jlong)controller;
+ }
+ catch (AIOException& e){
+ throwException(env, "java/lang/RuntimeException", e.what());
return 0;
}
- AIOController * controller = new AIOController(handle, pageSize);
- controller->done = env->GetMethodID(clazz,"done","()V");
- if (!controller->done) return 0;
-
- controller->encode = env->GetMethodID(clazz,"encode","(Ljava/nio/ByteBuffer;)V");
- if (!controller->done) return 0;
-
- controller->decode = env->GetMethodID(clazz,"decode","(ILjava/nio/ByteBuffer;)V");
- if (!controller->done) return 0;
-
- controller->encodeSize = env->GetMethodID(clazz,"encodeSize","()I");
- if (!controller->done) return 0;
-
-
- controller->fileHandle = handle;
-
- controller->env = env;
-
- return (jlong)controller;
}
JNIEXPORT void JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_append
- (JNIEnv *, jclass, jlong controllerAddress, jobject obj)
+ (JNIEnv *env, jclass, jlong controllerAddress, jobject obj)
{
- AIOController * controller = (AIOController *) controllerAddress;
- JNIBufferAdapter * adapter = new JNIBufferAdapter(controller, obj);
- controller->manager->addData(adapter);
+ try
+ {
+ AIOController * controller = (AIOController *) controllerAddress;
+ JNIBufferAdapter * adapter = new JNIBufferAdapter(controller, obj);
+ controller->manager->addData(adapter);
+ }
+ catch (AIOException& e)
+ {
+ throwException(env, "java/lang/RuntimeException", e.what());
+ }
}
JNIEXPORT void JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_flushMemory
- (JNIEnv *, jclass, jlong controllerAddress)
+ (JNIEnv *env, jclass, jlong controllerAddress)
{
- AIOController * controller = (AIOController *) controllerAddress;
- controller->manager->flushMemory();
+ try
+ {
+ AIOController * controller = (AIOController *) controllerAddress;
+ controller->manager->flushMemory();
+ }
+ catch (AIOException& e)
+ {
+ throwException(env, "java/lang/RuntimeException", e.what());
+ }
}
+
+
+JNIEXPORT void JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_closeInternal
+ (JNIEnv *env, jclass, jlong controllerAddress)
+{
+ try
+ {
+ AIOController * controller = (AIOController *) controllerAddress;
+ delete controller;
+ }
+ catch (AIOException& e)
+ {
+ throwException(env, "java/lang/RuntimeException", e.what());
+ }
+}
Modified: projects/jaio/trunk/jaio/native/src/PageManager.cpp
===================================================================
--- projects/jaio/trunk/jaio/native/src/PageManager.cpp 2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/PageManager.cpp 2008-02-12 21:15:01 UTC (rev 3710)
@@ -33,11 +33,15 @@
if (pagePosition + size > pageSize)
{
+ int bytesToPage = pageSize - pagePosition;
+
char * mem = (char *)malloc(size);
memset(mem, 0, size);
adapter->encode(size, mem);
long local = 0;
+ adapter->setBlocks(((size - bytesToPage) / pageSize) + 1);
+
while (size - local > 0)
{
adapter->addref();
@@ -53,9 +57,10 @@
}
}
+
adapter->deleteRef();
- delete mem;
+ free(mem);
}
else
{
Modified: projects/jaio/trunk/jaio/native/src/org_jboss_jaio_libaioimpl_LibAIOController.h
===================================================================
--- projects/jaio/trunk/jaio/native/src/org_jboss_jaio_libaioimpl_LibAIOController.h 2008-02-12 15:17:13 UTC (rev 3709)
+++ projects/jaio/trunk/jaio/native/src/org_jboss_jaio_libaioimpl_LibAIOController.h 2008-02-12 21:15:01 UTC (rev 3710)
@@ -39,6 +39,14 @@
JNIEXPORT void JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_flushMemory
(JNIEnv *, jclass, jlong);
+/*
+ * Class: org_jboss_jaio_libaioimpl_LibAIOController
+ * Method: closeInternal
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_org_jboss_jaio_libaioimpl_LibAIOController_closeInternal
+ (JNIEnv *, jclass, jlong);
+
#ifdef __cplusplus
}
#endif
More information about the jboss-cvs-commits
mailing list